Compare commits

...

308 Commits

Author SHA1 Message Date
Pirx 2bc8a6d0d4 Merge pull request #162 from pkali/develop
Develop me baby
2023-05-21 10:09:47 -04:00
Pirx fc1ab3bc7a bin updt 2023-05-21 09:58:27 -04:00
Pirx 82c39faddf README updt 2023-05-21 09:55:51 -04:00
Pirx 0c730c9ea4 README updt 2023-05-21 09:55:26 -04:00
Pirx e9cde15ee1 README updt 2023-05-21 09:50:31 -04:00
Pirx cc99866a12 jsr/rts to jmp optimiz 2023-05-21 09:25:22 -04:00
Pirx 060649cbed no commits 2023-05-20 14:36:21 -04:00
Pirx 4fa861af3d source clean-up 2023-05-20 09:49:14 -04:00
Pecusx 401d94eec9 Lonely SEC 2023-05-20 13:03:25 +02:00
Pecusx 0becca7a87 Hovercraft texts display optimization 2023-05-20 12:58:42 +02:00
Pecusx ff465e11f0 Missing splash screen 2023-05-20 11:28:02 +02:00
Pirx d0e1dc6f18 multiple texts improved, tabs elliminated 2023-05-19 23:16:49 -04:00
Pecusx 8486645bc8 Minor optimization 2023-05-19 15:30:45 +02:00
Pecusx 86631ce2b0 Exit from MoveBarrel (AI) 2023-05-19 15:05:15 +02:00
Pecusx 6447155be5 Ops... Turbo mode is working again 2023-05-19 11:46:57 +02:00
Pecusx db3743965a Exit from SoliDown. 2023-05-19 11:31:22 +02:00
Pecusx eb15ce0d78 Exit optimizations and better delay for C64 2023-05-19 10:24:25 +02:00
Pecusx f6a7217114 Quicker exit reaction 2023-05-18 21:17:45 +02:00
Pecusx 7c482d798c Quick exit reaction 2023-05-18 20:47:50 +02:00
Pecusx 13a5bd05df Minor optimizations 2023-05-17 11:30:09 +02:00
Pecusx 12c20c7637 Shield after Flag bug fixed #138 . Optimizations 2023-05-17 10:55:53 +02:00
Pecusx 145af2c4e7 C64 Nulear Winter works natively 2023-05-16 09:44:08 +02:00
Pecusx 824d635e88 Last (?) code optimization for more than 6 tanks. 2023-05-15 23:54:40 +02:00
Pecusx d54d630b4d No SoilDown after WhiteFlag bug fixed 2023-05-15 22:54:24 +02:00
Pecusx 2577b71e01 Code optimization for more than 6 tanks. 2023-05-15 21:58:04 +02:00
Pecusx fc3fe9ef19 Nothing :) 2023-05-15 20:46:52 +02:00
Pecusx d17d49c5f0 Code cleanup and native graphics routines for C64 (almost). 2023-05-15 19:54:22 +02:00
Pecusx ce6f7b3406 Better C64 code 2023-05-15 18:15:56 +02:00
Pecusx c8f3d52eab Little manual edit 2023-05-15 15:26:22 +02:00
Pecusx 31646c65d3 Manuals and code cleanup 2023-05-15 15:13:36 +02:00
Pecusx 0c0489f5ed typo 2023-05-15 11:19:27 +02:00
Pecusx 3847729391 Manuals update 2023-05-15 11:17:19 +02:00
Pecusx 610a86d9c9 English manual update 2023-05-15 11:06:55 +02:00
Pecusx f2f03533c5 Better formating 2023-05-15 11:00:36 +02:00
Pecusx 41f8545af3 Ops... links. 2023-05-15 10:54:38 +02:00
Pecusx 81ad461f5e Manuals with graphics 2023-05-15 10:52:45 +02:00
Pecusx 7f0643c47e C64 executable update 2023-05-13 18:18:04 +02:00
Pecusx f0077adcdf Atari executables update. 2023-05-13 12:59:15 +02:00
Pecusx 879423eeee Merge branch 'develop' of https://github.com/pkali/scorch_src into develop 2023-05-13 12:46:47 +02:00
Pecusx af101d46e9 Calculate gains after sort results bug fixed 2023-05-13 12:46:15 +02:00
Pecusx 1bfcd57d26 Small sort optimization 2023-05-12 12:01:57 +02:00
Pecusx 663321be99 Earned money in sort proc! 2023-05-11 23:49:17 +02:00
Pecusx cc806b6cc0 And Human symbols on GameOver screen 2023-05-11 15:33:24 +02:00
Pecusx 3f4fe9839b AI symbols on GameOver screen 2023-05-11 14:59:58 +02:00
Pecusx d36d5d3131 Sort money 2023-05-11 10:52:34 +02:00
Pecusx 62d838d7ed Sort bugfix #161 and optimization 2023-05-11 00:38:40 +02:00
Pecusx 1705c48d79 C64 wall type indicator 2023-05-09 21:18:53 +02:00
Pecusx 862ae9f640 ShellDealay i proper file :) 2023-05-09 15:50:19 +02:00
Pecusx 6cf4a6d989 Better C64 wait 2023-05-09 15:25:45 +02:00
Pecusx 0385423fb0 Wait macro for C64 2023-05-09 14:43:18 +02:00
Pecusx 5693fffd8a C64 colors 2023-05-09 12:40:57 +02:00
Pecusx f79da6ac0f First attempt - done! 2023-05-08 22:24:20 +02:00
Pecusx 1ce1e978bb First "working" try 2023-05-08 21:45:08 +02:00
Pecusx 11d9e99b5c New set hires proc 2023-05-08 20:28:24 +02:00
Pecusx 825ef76362 Next... try ? 2023-05-08 15:49:08 +02:00
Pecusx c32d7b0ce4 Next try... 2023-05-08 11:54:34 +02:00
Pecusx 56a756f0ba First C64 compilation 2023-05-08 11:30:10 +02:00
Pecusx b438982e3d Continued work - version for C64 2023-05-08 09:55:37 +02:00
Pecusx b13b53602b C64 Random 2023-05-05 14:13:07 +02:00
Pecusx 9b34ac0e43 More C64 "code" 👽 2023-05-05 12:15:54 +02:00
Pecusx be37772b29 Prepare for C64 port 2023-05-05 11:29:34 +02:00
Pecusx 569cbddfe2 Prepare for versions on other 6502 machines. 2023-05-04 21:10:45 +02:00
Pecusx 367e87093e Basic graphics routines in separate file and optimizations 2023-05-04 19:19:12 +02:00
Pecusx cf00674136 Small optimization (better AI numbers) 2023-05-04 08:57:30 +02:00
Pecusx 74df612e67 RoboTank indicator on status line 2023-05-02 17:56:22 +02:00
Pecusx b83e4f7169 AI level display 2023-05-02 14:22:53 +02:00
Pecusx fdccc9ddda Merge branch 'develop' of https://github.com/pkali/scorch_src into develop 2023-04-30 00:33:25 +02:00
Pecusx 17c4339a80 Colors experiment 2023-04-30 00:33:21 +02:00
Pirx 37cb34bc90 Merge pull request #160 from pkali/develop
Update README.md
2023-04-28 05:44:25 -04:00
Pirx 5e2c586c55 Update README.md 2023-04-28 05:43:35 -04:00
Pirx 9cfef8098d Merge pull request #159 from pkali/develop
readme updt
2023-04-27 23:46:55 -04:00
Pirx fd7448822b Update README.md 2023-04-27 23:45:34 -04:00
Pecusx b604851904 One byte DirectHits counter 2023-04-27 13:27:58 +02:00
Pirx c86aa65047 Merge pull request #158 from pkali/develop
pull it, baby!
2023-04-26 14:34:09 -04:00
Pirx 96372de688 Update README.md 2023-04-26 14:33:10 -04:00
Pecusx 1b6fdb6bb5 Minimally faster AI targeting 2023-04-26 14:40:11 +02:00
Pecusx e215148faf Better keys description (Atari 5200) 2023-04-25 20:17:12 +02:00
Pecusx 0e20f0e68d AI aiming after laser fixed :) 2023-04-25 18:53:17 +02:00
Pecusx cb1f9514e5 Manuals update 2023-04-25 13:38:02 +02:00
Pirx 98018a16dd Merge pull request #157 from pkali/develop
missing files
2023-04-24 08:45:57 -04:00
Pirx 3174876183 missing files 2023-04-24 06:59:51 -04:00
Pirx 253faff3cd Merge pull request #156 from pkali/develop
Develop 1.28
2023-04-22 15:08:08 -04:00
Pirx 16d629d94d riliz pliz 2023-04-22 15:07:02 -04:00
Pecusx e8830401d0 Better order of players in summary
If players have the same score, place is decided by "direct hits".
2023-04-21 14:20:43 +02:00
Pecusx b759091882 Better keys description 2023-04-21 10:02:52 +02:00
Pecusx da99406bbd Second POKEY init (for ingame music)
And cleanup
2023-04-21 08:49:13 +02:00
Pecusx 7088e02527 "Stereo" in game. 2023-04-20 21:07:08 +02:00
Pecusx 697a6ef9fe Mute second POKEY after splash screen 2023-04-20 13:01:03 +02:00
Pecusx 6685ef1203 "Stereo" (splash screen only) 2023-04-20 10:38:46 +02:00
Pecusx 28e34f3c02 The correct number of lines of text in GameOver (credits) 2023-04-18 12:04:10 +02:00
Pecusx 14b35275f7 Final (?) splash 2023-04-17 22:10:42 +02:00
Pecusx 18107445e4 16 lines down 2023-04-17 18:05:10 +02:00
Pecusx 3a0600bd4d Better (?) splash 2023-04-17 14:52:43 +02:00
Pecusx df9db33c4b Ops. Word order. 2023-04-17 08:59:53 +02:00
Pecusx 0b5029ddb9 Better splash 2023-04-17 08:48:27 +02:00
Pecusx c9e8adb352 Scorch title 2023-04-17 00:07:36 +02:00
Pecusx 9aabd92d01 Father unknown :) 2023-04-16 23:11:04 +02:00
Pecusx 132cef82ee The Mother of All Games 2023-04-13 12:09:46 +02:00
Pecusx 719b712451 Welcome back KAZ! :) 2023-04-08 00:11:05 +02:00
Pecusx bc31fa0ea1 Speedup native PutChar (8x8 and 4x4) procedures. 2023-04-06 19:52:30 +02:00
Pecusx 1e5530579f Optional PutChar 4x4 only implemented by PLOT 2023-04-06 15:04:15 +02:00
Pecusx a5f02cf33b Merge branch 'develop' of https://github.com/pkali/scorch_src into develop 2023-04-06 14:37:21 +02:00
Pecusx 5657171bb2 Optional PutChar 8x8 only implemented by PLOT 2023-04-06 14:37:15 +02:00
Pecusx 66d620fe4b winter can be drawn by PLOT (compilation option) 2023-04-05 19:00:56 +02:00
Pecusx 19b71664f1 Compilation option: faster graphics routines / better compatibility. 2023-04-05 14:27:08 +02:00
Pecusx f2de25a769 Better? "drawmountains"
Mountains are drawn only by the plot procedure.
Easier for the C64?
2023-04-05 12:30:47 +02:00
Pecusx 16fc84aa6f Better keys description in main menu 2023-04-04 14:44:58 +02:00
Pecusx fa79836f77 Code cleanup and optimizations 2023-04-04 12:40:24 +02:00
Pecusx f475999918 Welcome xorcerer (sorry KAZ). 2023-04-03 10:24:21 +02:00
Pecusx 2005f7bf98 Better keys descriptions in menus 2023-04-03 10:18:42 +02:00
Pecusx ab965c00b4 New splash screen (sorry KAZ :) ).
And start from "Polish Rainbow" color scheme.
2023-04-02 15:44:19 +02:00
Pecusx 83969e747b Code cleanup 2023-03-30 14:44:17 +02:00
Pecusx e1a930ca44 More cleanup and optimization 2023-03-29 20:20:26 +02:00
Pecusx d12102ad60 Code cleanup and optimization 2023-03-28 19:07:04 +02:00
Pecusx 2de654db32 Small optimizations in status line display proc 2023-03-15 14:48:58 +01:00
Pecusx 0703a9db93 Proper texts after the BFG 2023-03-02 14:57:54 +01:00
Pecusx af305f154c One more weapon of death 2023-03-02 14:32:20 +01:00
Pecusx 4cf4eb14c7 Tank slide correction 2023-03-02 13:12:46 +01:00
Pecusx 1337c83791 Better colors init. 2023-02-07 19:59:37 +01:00
Pirx 9251db8f3a Merge pull request #155 from pkali/develop
Develop
2023-02-07 02:27:00 -05:00
Pirx f15e815c1a readme updt 2023-02-07 02:26:03 -05:00
Pirx 746026ae4f rainbow colors on start 2023-02-07 01:59:12 -05:00
Pecusx fd67dc0bb1 Improved tank shapes.
Better appearance with disabled tank X-coordinate correction..
2023-02-04 21:15:59 +01:00
Pecusx c1ee40fa59 No X-tank position correction (PM graphics). 2023-02-02 18:29:34 +01:00
Pirx a64d01067d vdl macro 2023-01-31 16:35:21 -05:00
Pecusx f703316128 Optimizations - full colortable for PAL mode 2023-01-31 20:22:47 +01:00
Pecusx 98565d490f Deactivation of "Lazy..." is now working properly. 2023-01-31 10:57:58 +01:00
Pecusx fcbd0bc34a The G key works properly even if the wind options were last selected. 2023-01-30 22:33:36 +01:00
Pecusx e50bc8669e Code cleanup. 2023-01-27 09:30:27 +01:00
Pecusx bbded45200 Mere memory and 2 new talk texts (RB5200). And... no memory :) 2023-01-25 18:28:36 +01:00
Pecusx 00d386e73f ... and more (memory) ... 2023-01-25 15:13:57 +01:00
Pecusx 70788e772e More optimizarions 2023-01-25 14:44:55 +01:00
Pecusx 793d494fc5 Minor optimization 2023-01-25 14:10:50 +01:00
Pecusx 6b2eabd1ca Nicer Lazy targeting amd "visual Debug" for Lazy Boys 2023-01-24 14:20:29 +01:00
Pecusx 0832d841f4 Small talk - small fix. 2023-01-24 09:00:43 +01:00
Pirx c41c01cee0 readme updt 2023-01-23 08:36:19 -05:00
Pecusx 6b68066c94 Visible targeting bug 2023-01-23 14:21:02 +01:00
Pirx 31c181ce89 Merge pull request #154 from pkali/develop
Develop
2023-01-23 05:41:41 -05:00
Pirx 33d8303270 readme updt 2023-01-23 05:41:05 -05:00
Pecusx f9fad89d7c Revert "wait by atariki"
This reverts commit 41094db7dd.
2023-01-23 08:50:03 +01:00
Pecusx e9ff60210e Revert "minor fixes"
This reverts commit b7560ab6d9.
2023-01-23 08:49:58 +01:00
Pirx b7560ab6d9 minor fixes 2023-01-22 23:03:10 -05:00
Pirx 41094db7dd wait by atariki 2023-01-22 22:46:47 -05:00
Pecusx ab30227843 Ctrl+HELP - new "debug" switch 2023-01-22 23:17:26 +01:00
Pecusx 5d619c80f8 "Debug" for Laser 2023-01-22 19:46:37 +01:00
Pecusx e842d455e6 Visual Debug :) added 2023-01-21 22:48:46 +01:00
Pecusx da4d82cca4 All the splash text is swapped. 2023-01-21 13:51:26 +01:00
Pecusx f7931afbb4 Second fire (shift) on 5200
Thanks RB5200!
2023-01-20 21:26:39 +01:00
Pecusx b18793014d Very rare distance measuring bug fixed.
Sometimes a perfectly hit tank still lived.
2023-01-20 14:40:54 +01:00
Pecusx ef1c0dc62c Binary files upd. 2023-01-20 11:05:12 +01:00
Pecusx bc338198a0 Merge branch 'develop' of https://github.com/pkali/scorch_src into develop 2023-01-20 11:01:36 +01:00
Pecusx 2a08447b9c The tanks talk to each other again. 2023-01-20 11:00:46 +01:00
Pecusx 4088e5f8fa Macro "wait" optimization, and better credits 2023-01-19 19:46:06 +01:00
Pirx 79b5bc3290 readme updt 2023-01-17 10:04:09 -05:00
Pirx 3b80de7def readme updt 2023-01-17 09:25:01 -05:00
Pirx 922c7d15cb Merge pull request #153 from pkali/develop
readme updt
2023-01-17 09:11:44 -05:00
Pirx 4edf032d77 readme updt 2023-01-17 09:10:43 -05:00
Pirx 23ab8cb4d5 Merge pull request #152 from pkali/develop
1.25
2023-01-17 08:59:49 -05:00
Pirx 84fdef7cbf eng manual updt 2023-01-17 08:56:50 -05:00
Pecusx 9b8f345cb2 New tester in credits 2023-01-17 14:39:16 +01:00
Pecusx c0af7b2e6c Two minor glitches when switching screens. (very rare) 2023-01-16 20:33:38 +01:00
Pecusx d9b92eba07 Manuals update. 2023-01-16 10:29:15 +01:00
Pecusx 33b962725d Selectable change of wind power (once per turn or round). 2023-01-16 09:53:29 +01:00
Pecusx 9ec78928f1 Minor optimization and new macro: waitRTC (not used yet) 2023-01-15 20:47:10 +01:00
Pecusx e9ec39005f A800 binary update. 2023-01-14 14:06:01 +01:00
Pirx b3234a7077 version no. updt 2023-01-14 07:46:46 -05:00
Pirx 735316cdab splash working on all systems 2023-01-13 20:57:15 -05:00
Pirx d20a9a94d2 splash works with 4joy and 2joy kernels, still not working with Altirra kernel 2023-01-13 20:50:06 -05:00
Pirx a88f471a3c unnecessary 6502 init removed 2023-01-12 23:20:39 -05:00
Pirx def57f03ca comment fix 2023-01-12 20:41:42 -05:00
Pirx 8ac3c22fe7 custom 5200 splash screen year 2023 2023-01-12 20:34:04 -05:00
Pirx c7b5a07c62 custom 5200 splash screen 1st attempt 2023-01-12 20:12:24 -05:00
Pecusx ed126c454a Optimizations - 69 bytes saved! 2023-01-12 21:53:42 +01:00
Pecusx 066e248350 Better colors of mountains in PAL system. 2023-01-09 15:03:05 +01:00
Pecusx 9b05cf0220 Minor optimization 2 2023-01-09 14:43:42 +01:00
Pecusx 872d564846 Minor optimization 2023-01-06 20:54:09 +01:00
Pecusx fb0de84c01 Happy New Year! 2023-01-05 20:49:04 +01:00
Pecusx c151940735 Change colors during the game with the G key (a800 only) 2023-01-05 09:58:36 +01:00
Pirx d66e588203 readme and year change 2022-12-31 19:10:03 -05:00
Pecusx 3b53968fe3 Small gradient optimization (one variable gone). 2022-12-28 14:43:41 +01:00
Pecusx a45a892dc7 Merge branch 'develop' of https://github.com/pkali/scorch_src into develop 2022-12-25 12:41:48 +01:00
Pecusx 6f1e28298d Indicator of the selected color set. 2022-12-25 12:41:36 +01:00
Pirx 871f33f3bf Merge pull request #151 from pkali/develop
Develop
2022-12-24 10:31:30 -05:00
Pirx ffd5e558ff README updt 2022-12-24 10:31:04 -05:00
Pirx 82f26310da README updt 2022-12-24 10:29:51 -05:00
Pecusx 5d935c4379 Manuals update 2022-12-24 13:12:57 +01:00
Pecusx 4a9d8da441 New best colors by Adam :) 2022-12-24 12:40:11 +01:00
Pecusx 25490f76a3 Best colors by Adam 2022-12-24 10:55:59 +01:00
Pecusx 7b77d9714e Even better (other) colors :) 2022-12-23 19:46:20 +01:00
Pecusx 3fdc8600c6 Better second set of colors 2022-12-23 14:38:36 +01:00
Pecusx 3936b2bf8c Two sets of "gradient" selectable. 2022-12-23 14:07:22 +01:00
Pecusx d420ce06ca Smoke Tracer does not smoke when targeting by Lazy Darwin 2022-12-17 20:05:33 +01:00
Pecusx 6ec02ab3fc Lazy Boy works well with joystick (more testing needed) 2022-12-16 18:11:35 +01:00
Pecusx cf61f5075f New Lazy Darwin (with problems on 5200) 2022-12-16 15:20:10 +01:00
Pecusx 87f7e7eafa Dot does not fire MIRV :) 2022-12-16 13:41:52 +01:00
Pecusx 328a147225 Magic of the "." key :) 2022-12-16 12:39:52 +01:00
Pecusx 54a4dcf7d8 Options screen is now separate from setting the game's initial variables.
For easier porting to the C64 or others.
2022-12-14 13:11:40 +01:00
Pecusx b7a5e7c9b5 Self-destruction of shielded tank at angle 0-4. fixed! - again! 2022-12-13 17:47:42 +01:00
Pecusx 54f04ed962 Barrel start point correction 2022-12-13 09:30:11 +01:00
Pecusx 588040d9e6 Soildown after Hovercraft optimization. 2022-12-13 09:15:39 +01:00
Pecusx 2b88517167 New tanks shapes by Adam. But we maust correct start point of barrel 2022-12-12 20:42:17 +01:00
Pecusx ffcf44cabb Better Soildown after Hovercraft. 2022-12-12 14:11:09 +01:00
Pirx d0049826f5 Merge pull request #150 from pkali/develop
Develop
2022-12-10 15:59:25 -05:00
Pirx 5a6b5f7dc4 README and MANUAL updt 2022-12-10 15:58:09 -05:00
Pecusx f485d120c8 Moroon at very specific settings kills everyone :) - check it out! 2022-12-02 18:14:16 +01:00
Pecusx c6264013d9 RoboTanks do not use Laser and BFG (in extremely rare case) 2022-12-02 15:05:07 +01:00
Pecusx b4af765f4f New (better?) layout of shades of gray. 2022-12-01 20:35:51 +01:00
Pirx 9cdb9fe18c SUPERSYSTEM everywhere + one space more 2022-12-01 11:31:35 -05:00
Pecusx 788b5db180 New name of game :) 2022-12-01 15:35:30 +01:00
Pecusx c7e65f1d61 Display active joystick on weapon purchase/activation screens and game screen. 2022-12-01 15:23:39 +01:00
Pecusx 8c6fee0631 Different game title for A5200 2022-12-01 08:49:02 +01:00
Pecusx 403288548c Minor manuals update 2022-11-30 19:15:44 +01:00
Pecusx 166d05c0e6 One NOP more and manuals update 2022-11-30 18:47:30 +01:00
Pecusx 38ba45001a Mountains avialiable in shadows of GREY. 2022-11-30 18:40:06 +01:00
Pecusx 05f3f32f00 Minor memory tricks 2022-11-30 14:45:26 +01:00
Pecusx d14f9a2999 Prepare for mountains colors (test)
But no memory for one "NOP" (a800) and colors array :)
2022-11-30 09:58:48 +01:00
Pecusx 18cce6377e Fix for lonely pixel in Liquid Dirt. 2022-11-29 11:21:35 +01:00
Pecusx ee9d6b7ce9 New tank shape (only for robotanks),. 2022-11-26 20:41:50 +01:00
Pecusx 42cc896ec5 Weird optimization :) 2022-11-26 18:45:03 +01:00
Pecusx 091335dbc9 Tank shapes selection added.
Better appearance of tanks on title screen.
2022-11-26 14:57:54 +01:00
Pecusx 9c912d4cc7 Initial support for tank shapes selection. 2022-11-25 20:48:20 +01:00
Pecusx e7a35087bd Merge pull request #149 from pkali/develop
Manuals update
2022-11-24 21:41:53 +01:00
Pecusx 8013246d3b Manuals update 2022-11-24 21:40:52 +01:00
Pirx d0ac15f27b Merge pull request #148 from pkali/develop
Develop
2022-11-23 10:31:18 -05:00
Pirx 1dc680f5e2 README updt 2022-11-23 10:30:44 -05:00
Pecusx 0a82a9a96b Minor physics corrections after bouncing off walls. 2022-11-22 21:12:02 +01:00
Pecusx d9da258735 Self-destruction of shielded tank at angle 0. fixed! 2022-11-22 19:38:25 +01:00
Pecusx 05a289ffea Bouncing Kastel bounces Laser - fixed 2022-11-22 14:58:07 +01:00
Pecusx ba780df597 ExplosionRange variable is now really one byte long. :) 2022-11-21 20:37:00 +01:00
Pecusx 7d9e6d2045 Minor weapons list bug fixed 2022-11-21 09:40:13 +01:00
Pecusx b60efd0bbb 5200 binary update 2022-11-21 08:28:40 +01:00
Pirx f6157ea548 full number of defensive texts 2022-11-20 14:58:21 -05:00
Pirx 3bbd5838ec 2 bytes less 2022-11-20 12:44:57 -05:00
Pirx b101bbbce1 optimizations finished 2022-11-20 12:37:03 -05:00
Pirx 38b6af6720 text4x4 optimised 2022-11-20 12:29:59 -05:00
Pecusx 6313ef2b77 Minor optimization. 2022-11-19 22:47:25 +01:00
Pecusx a154966e93 Rare PMG glitches fixed 2022-11-19 22:32:22 +01:00
Pecusx f4213a7cf4 SELECT key selects joystick port just like TAB key.
Manuals update.
2022-11-19 12:30:37 +01:00
Pecusx 2fb40c444f Multiple joysticks support added. #142
And small barrel rotate bug fixed.
2022-11-18 23:55:14 +01:00
Pecusx dedfd7a248 Initial support for multiple joysticks (A800 only) 2022-11-18 21:54:07 +01:00
Pecusx ccd3fa5224 5200 binary updated. 2022-11-18 15:51:01 +01:00
Pecusx 89b3834dc8 Prepare for more joysticks (test only) 2022-11-18 15:45:17 +01:00
Pecusx 7a97ff622d Lazy Boy and Darwin now remembers the last weapon used 2022-11-17 12:23:42 +01:00
Pecusx 1bc3b3b72f Corrected offset at the long list of weapons. 2022-11-16 22:38:54 +01:00
Pecusx b6dd5a9902 Memory optimization. 2022-11-16 21:01:01 +01:00
Pecusx 6f62d49407 Gift now blinking. 2022-11-16 18:33:53 +01:00
Pecusx cc41bcd323 Manuals update. 2022-11-15 22:48:03 +01:00
Pecusx 8086a78d79 Minor change in point counting. 2022-11-15 17:05:37 +01:00
Pecusx 22fc555f8e Better gifts (Buy me!) 2022-11-15 16:37:00 +01:00
Pecusx a33d7d541d Better and faster Laser 2022-11-15 11:02:11 +01:00
Pecusx fbcbab2eec Battery performance in AI and Auto Defense fixed. 2022-11-15 08:46:38 +01:00
Pecusx 43ae88673c Memory layout 2022-11-14 19:31:49 +01:00
Pecusx 927163f41d Better Auto Defense symbol on status line. 2022-11-14 19:13:21 +01:00
Pirx cdd1b83367 smal readme updt 2022-11-14 09:11:15 -05:00
Pirx 5ba4ecd802 smal readme updt 2022-11-14 09:08:40 -05:00
Pirx 2e89c97c23 Merge pull request #147 from pkali/develop
Develop
2022-11-14 09:04:37 -05:00
Pirx d07c455b38 readme updt 2022-11-14 09:03:44 -05:00
Pecusx cd1518de6e Fix for lonely pixel #103
Pozor! It's not real fix, it's workaround!
2022-11-14 10:12:57 +01:00
Pirx 8603308693 no r+ opty, no bad seppuku frame 2022-11-13 23:57:09 -05:00
Pirx 7cbd5ad77e bytes left message 2022-11-13 08:29:48 -05:00
Pirx ce6ca29479 inventory ESC does not end the game, more dirt in liquid dirt 2022-11-12 20:08:15 -05:00
Pecusx 327b78a105 Better, longer, faster... Funky Bomb. 2022-11-12 21:41:50 +01:00
Pecusx bbedaee3ac Faster soildown after Funky Bomb. 2022-11-12 21:05:57 +01:00
Pecusx b8e3f16d23 Funky Bomb soildown fix. 2022-11-12 20:51:05 +01:00
Pawel Kalinowski 01629b219f bad pixel when measuring distance with draw 2022-11-12 14:15:23 -05:00
Pecusx 42f3e1c889 Liquid Dirt bug fixed! 2022-11-12 19:42:11 +01:00
Pirx 9f4b721e3f angle 0 is great again and again 2022-11-12 11:04:58 -05:00
Pirx 56f33a0ee9 angle 0 is great again 2022-11-12 10:58:37 -05:00
Pecusx 36fc60d5af SFX otimizations. Thanks @mikerro 2022-11-12 12:59:09 +01:00
Pecusx 3dd58736d7 Rounding proposal. 2022-11-12 12:18:07 +01:00
Pecusx c19befe31a Barrel drawing bug (lone pixels on left edge of screen) fixed! 2022-11-12 11:23:28 +01:00
Pecusx d0e682f0a3 New SFX and manuals update. 2022-11-11 21:39:45 +01:00
Pecusx 50cc7f16df New weapon (I promise - last one :) ) - Spy Hard! 2022-11-11 13:27:20 +01:00
Pirx ac1c501fa4 angle 0 elliminated 2022-11-11 01:26:11 -05:00
Pecusx f67656c5aa Update MANUAL_EN.md 2022-11-10 11:41:27 +01:00
Pecusx c419eac3de Improvements in "AutoDefense" - now works great! 2022-11-09 14:14:20 +01:00
Pecusx 3f74494bed New weapon - Auto Defense! And AI bugfixes 2022-11-09 10:32:50 +01:00
Pecusx a7493e1dcb Another new weapon! - Lazy Darwin :) 2022-11-08 19:31:12 +01:00
Pecusx b3b8633574 New weapon! - "Lazy Boy" 2022-11-08 18:45:06 +01:00
Pirx 06981a23fb Merge pull request #146 from pkali/develop
Develop
2022-11-07 02:00:43 -05:00
Pirx 4bd58b40fd README updt, bin added 2022-11-07 02:00:15 -05:00
Pirx 096bce6e88 main menu does not blink 2022-11-07 01:13:37 -05:00
Pecusx ef4612f3a4 Hovercraft is hovering too high bug - fixed! 2022-11-05 23:26:33 +01:00
Pecusx 1eae4054ed Minimally different menu layout. 2022-11-05 22:50:35 +01:00
Pecusx 9575dcee11 Minor graphic improvements.
Background color of "more" up/down lines (purchase screen). Color of purchase screen header.
2022-11-05 21:01:20 +01:00
Pecusx 2d1cecfb10 Wrap up and down inventory and shop scrolling #111 2022-11-05 18:10:42 +01:00
Pecusx e717306400 End of keyboard support in 5200 and improved music in NTSC.
Keypad on the 5200 works, of course. And it works very well.
2022-11-03 19:30:02 +01:00
Pecusx 1a1761bc4c Randomize macro reverted to old version - no Nuclear Winter :) 2022-11-03 18:43:02 +01:00
Pecusx 97d0862a72 5200 keypad works like the A800 keyboard - Great! 2022-11-02 20:22:56 +01:00
Pecusx 6e036b732e Zeroing variables in RAM (zero page) added. 2022-10-31 20:25:12 +01:00
Pecusx 8b0ab13c30 Variable declared as byte but used as word - bug 2022-10-31 20:13:30 +01:00
Pecusx 88e8108ee1 Manuals update 2022-10-31 16:33:11 +01:00
Pirx 8c61ce7e4d Merge pull request #145 from pkali/develop
Develop
2022-10-31 01:54:02 -04:00
Pirx eb38407868 manual_en update 2022-10-31 01:52:56 -04:00
Pirx 7d7da78fd6 manual_en update 2022-10-31 01:52:06 -04:00
Pirx 148c64f158 version, README and manual_en update 2022-10-31 01:51:20 -04:00
Pecusx 4bf6b33528 Keyboard autorepeat added #141 2022-10-30 12:51:38 +01:00
Pecusx cd70e8c1ec New (faster) ingame DLI 2022-10-29 17:40:00 +02:00
Pecusx c7aea8e3ab DLI optimization
No more WSYNC :)
2022-10-29 16:22:53 +02:00
Pecusx fe990a6668 WaitOneFrame procedure sometimes hung in NTSC
And manuals update.
2022-10-29 11:36:33 +02:00
Pecusx 6f369735c3 Final (or not :) ) PAL and NTSC music by @mikerro 2022-10-28 21:27:06 +02:00
Pecusx d462c84577 Bouncy Castle bounces Funky Bomb bug fixed #129 2022-10-27 20:33:54 +02:00
Pecusx 3ed648b01f Better music in NTSC 2022-10-26 19:15:37 +02:00
Pecusx 2aca68c41c ATRACT mode fixed. 2022-10-25 19:47:15 +02:00
Pecusx 5f5ea0a752 Credits flickering fixed! 2022-10-25 19:15:50 +02:00
Pirx 1891bcc7f1 5200 ingame dli fix 2022-10-25 09:38:01 -04:00
Pecusx 11592414a8 GameOver screen optimization and return of Tab in weapon selection :) 2022-10-25 10:03:04 +02:00
Pirx 89d6f4834b README updt 2022-10-16 23:51:42 -04:00
65 changed files with 15410 additions and 7674 deletions
+3 -4
View File
@@ -1,6 +1,5 @@
.project .project
*.bak *.bak
scorch.lab *.lab
scorch.lst *.lst
textproc.lab artwork/talk.as_
textproc.lst
@@ -4,17 +4,17 @@
;----------------------------------------------- ;-----------------------------------------------
; start of "variables" (RAM) ; start of "variables" (RAM)
;----------------------------------------------- ;-----------------------------------------------
OptionsHere OptionsHere
; 0123456789012345678901234567890123456789 ; 0123456789012345678901234567890123456789
dta d"Players : 2 3 4 5 6 " dta d"Players : 2 3 4 5 6 "
dta d"Cash : none 2K 8K 12K 20K " dta d"Cash : none 2K 8K 12K 20K "
dta d"Gravity : 0.2G 0.5G 1G 2G 4G " dta d"Gravity : 0.2G 0.5G 1G 2G 4G "
dta d"Wind : 1B 3B 5B 7B 9B " dta d"Wind : 1B 3B 5B 7B 9B "
dta d"Rounds : 10 20 30 40 50 " dta d"Rounds : 10 20 30 40 50 "
dta d"Missiles : slug slow norm fast hare " dta d"Missiles : slug slow norm fast hare "
dta d"Seppuku : nevr rare norm oftn alws " dta d"Seppuku : nevr rare norm oftn alws "
dta d"Mountains: NL BE CZ CH NP " dta d"Mountains: NL BE CZ CH NP "
dta d"Walls : none wrap bump boxy rand " dta d"Walls : none wrap bump boxy rand "
;; 01234567890123456789012345678901 ;; 01234567890123456789012345678901
; dta d"Players: 2 3 4 5 6 " ; dta d"Players: 2 3 4 5 6 "
; dta d"Cash :none 2K 8K 12K 20K" ; dta d"Cash :none 2K 8K 12K 20K"
@@ -29,9 +29,9 @@ OptionsScreenEnd
;----------------------------------------------- ;-----------------------------------------------
NameScreen2 NameScreen2
dta d" Tank 01 Name:" dta d" Tank 1 *1 +1 Name:"
NameAdr NameAdr
dta d" " dta d" "
NameScreen4 NameScreen4
dta d" " dta d" "
NamesOfLevels NamesOfLevels
@@ -3,7 +3,7 @@
.IF *>0 ;this is a trick that prevents compiling this file alone .IF *>0 ;this is a trick that prevents compiling this file alone
;--------------------------------------------------- ;---------------------------------------------------
purchaseTextBuffer purchaseTextBuffer
dta d"Player: Cash: 0" ; ZERO TO MAKE YOU RICHER ON THE SCREEN dta d"Player: * Cash: 0" ; ZERO TO MAKE YOU RICHER ON THE SCREEN
; DLs fragments (modified by game code) ; DLs fragments (modified by game code)
; all Purchase DL :) ; all Purchase DL :)
@@ -13,19 +13,20 @@ PurchaseDL
DLPurTitleAddr DLPurTitleAddr
.word PurchaseTitle .word PurchaseTitle
.byte $50 .byte $50
.byte $42+$80 .byte $42
.word purchaseTextBuffer .word purchaseTextBuffer
.byte $60,$42 .byte $00+$80
.byte $20+$80,$10+$80,$42
MoreUpdl MoreUpdl
.word EmptyLine .word EmptyLine
.byte 0,$42 .byte $10+$80,$42
WeaponsListDL WeaponsListDL
.word ListOfWeapons .word ListOfWeapons
:15 .byte 0,2 :15 .byte 0,2
.byte 0, $42 .byte $10+$80, $42
MoreDownDL MoreDownDL
.word EmptyLine .word EmptyLine
.byte $40,$42 .byte $40+$80,$42
.word WeaponsDescription .word WeaponsDescription
.byte $0,$42 .byte $0,$42
PurActDescAddr PurActDescAddr
+103 -88
View File
@@ -8,43 +8,54 @@
;----------------------------------------------- ;-----------------------------------------------
OptionsScreen OptionsScreen
dta d"Welcome to Scorch v. " dta d"Welcome to Scorch v. "
build ; 4 bytes from scorch.asm (fancy method) :) build ; 4 bytes from scorch.asm (fancy method) :)
dta d" (un)2000-2022" dta d" (un)2000-2023"
.IF TARGET = 800 .IF TARGET = 800
dta d" Please select option with cursor keys " dta d" Please select option with "
dta d" and press (Return) to proceed " dta $fe,$dc,$dd,$ff ; cursors in inverse
dta d" and "
dta d"Tab"*
dta d" "
dta d" Press "
dta d"Return"*
dta d" to proceed "
.ELIF TARGET = 5200 .ELIF TARGET = 5200
dta d" Please select option with joystick one " dta d" Please select option with joystick one "
dta d" and press FIRE to proceed " dta d" and press FIRE to proceed "
.ENDIF .ENDIF
; 0123456789012345678901234567890123456789 ; 0123456789012345678901234567890123456789
;----------------------------------------------- ;-----------------------------------------------
NameScreen NameScreen
.IF TARGET = 800 .IF TARGET = 800
dta d" Enter names of players " dta d" Enter names of players "
.ELIF TARGET = 5200 .ELIF TARGET = 5200
dta d"Hold " dta d"Hold "
dta d "FIRE"* dta d "FIRE"*
dta d " to enter player names " dta d " to enter player names "
.ENDIF .ENDIF
NameScreen3 NameScreen3
dta d" Human/Atari (difficulty level) " dta d" Human/Atari (difficulty level) "
NameScreen5 NameScreen5
.IF TARGET = 800 .IF TARGET = 800
dta d" " dta d"TAB"*
dta d"TAB"* dta d" - Port nr "
dta d" - Player/Difficulty level " dta $fe,$dc,$dd,$ff ; cursors in inverse
dta d" " dta d" - Difficulty"
dta d"Return"* dta d" "
dta d" - Proceed " dta d"INV"*
dta d" - Shape "
dta d"Return"*
dta d" - Proceed "
.ELIF TARGET = 5200 .ELIF TARGET = 5200
dta d" " dta d" "
dta d"Joy"* dta d"(5)"*
dta d" - Player/Difficulty level " dta d" - Port/Shape "
dta d" " dta d"Joy"*
dta d"FIRE"* dta d" - Diffic. "
dta d" - Proceed " dta d" "
dta d"FIRE"*
dta d" - Proceed "
.ENDIF .ENDIF
;----------------------------------------------- ;-----------------------------------------------
MoreUp MoreUp
@@ -62,43 +73,47 @@ MoreDown
WeaponsDescription WeaponsDescription
; 0123456789012345678901234567890123456789 ; 0123456789012345678901234567890123456789
.IF TARGET = 800 .IF TARGET = 800
dta d"Tab"* dta d"Tab"*
dta d ": Defensive/Offensive weapon " dta d ": Defensive/Offensive weapon "
.ELIF TARGET = 5200 .ELIF TARGET = 5200
dta d"Left"* dta d"Left"*
dta d ": Defensive/Offensive weapon" dta d ": Defensive/Offensive weapon"
.ENDIF .ENDIF
PurchaseDescription PurchaseDescription
; 0123456789012345678901234567890123456789 ; 0123456789012345678901234567890123456789
.IF TARGET = 800 .IF TARGET = 800
dta d"Space"* dta d"Space"*
dta d": Purchase " dta d": Purchase "
dta d"Return"* dta d"Return"*
dta d": Finish " dta d": Finish "
.ELIF TARGET = 5200 .ELIF TARGET = 5200
dta d"Right"* dta d"Right"*
dta d": Purchase " dta d": Purchase "
dta d"FIRE"* dta d"FIRE"*
dta d": Finish " dta d": Finish "
.ENDIF .ENDIF
ActivateDescription ActivateDescription
; 0123456789012345678901234567890123456789 ; 0123456789012345678901234567890123456789
.IF TARGET = 800 .IF TARGET = 800
dta d"Space"* dta d"Space"*
dta d": Activate " dta d": Activate "
dta d"Return"* dta d"Return"*
dta d": Finish " dta d": Finish "
.ELIF TARGET = 5200 .ELIF TARGET = 5200
dta d"Right"* dta d"Right"*
dta d": Activate " dta d": Activate "
dta d"FIRE"* dta d"FIRE"*
dta d": Finish " dta d": Finish "
.ENDIF .ENDIF
EmptyLine EmptyLine
dta d" " dta d" "
;--------------------------------------------------- ;---------------------------------------------------
OptionsTitle OptionsTitle
dta d" scorch "* .IF TARGET = 800
dta d" scorch "*
.ELIF TARGET = 5200
dta d" scorch supersystem "*
.ENDIF
DifficultyTitle DifficultyTitle
dta d" difficulty "* dta d" difficulty "*
PurchaseTitle PurchaseTitle
@@ -115,44 +130,44 @@ GameOverTitle2
dl ; MAIN game display list dl ; MAIN game display list
.byte $70 .byte $70
.byte $42 .byte $42
.word statusBuffer .word statusBuffer
.byte $02, $02 +$80 ;DLI .byte $02, $02
.byte $10 ; 2 blank lines .byte $10+$80 ; 2 blank lines + DLI
.byte $4f .byte $4f
.word display ; 1 line .word display ; 1 line
:76 .by $0f ;76 :76 .by $0f ;76
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80,$0f ; DLI (black bar) ;3
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:13 .by $0f ;13 :12 .by $0f ;12
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80,$0f ; DLI (black bar) ;3
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:8 .by $0f ;8 :7 .by $0f ;7
.by $4f ;1 .by $4f ;1
.wo display+$0ff0 .wo display+$0ff0
:2 .by $0f ;2 :2 .by $0f ;2
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80,$0f ; DLI (black bar) ;3
.by $0f+$80 ; DLI
:9 .by $0f ;9
.by $0f+$80 ; DLI (black bar) ;2
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:8 .by $0f ;8 :8 .by $0f ;8
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80,$0f ; DLI (black bar) ;3
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:7 .by $0f ;7 :7 .by $0f ;7
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80,$0f ; DLI (black bar) ;3
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:6 .by $0f ;6 :6 .by $0f ;6
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80,$0f ; DLI (black bar) ;3
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:5 .by $0f ;5 :5 .by $0f ;5
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80,$0f ; DLI (black bar) ;3
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:4 .by $0f ;4 :4 .by $0f ;4
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80,$0f ; DLI (black bar) ;3
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:3 .by $0f ;3 :3 .by $0f ;3
.by $0f+$80,$0f ; DLI (black bar) ;3
.by $0f+$80 ; DLI
:2 .by $0f ;2
.by $0f+$80 ; DLI (black to end);1 .by $0f+$80 ; DLI (black to end);1
:38 .byte $0f ;35 ..... = 200 :38 .byte $0f ;35 ..... = 200
.by $4f .by $4f
@@ -162,19 +177,19 @@ dl ; MAIN game display list
;----------------------------------------------- ;-----------------------------------------------
OptionsDL OptionsDL
.byte $70 .byte $70
.byte $47 .byte $47
.word OptionsTitle .word OptionsTitle
.byte $70,$70 .byte $70,$70
.byte $42 .byte $42
.word OptionsScreen .word OptionsScreen
.byte $30,$02,$02,$70 .byte $30,$02,$02,$70
.byte $42 .byte $42
.word OptionsHere .word OptionsHere
.byte $10 .byte $10
:maxOptions-1 .by $02,$10 :maxOptions-1 .by $02,$10
:(9-maxOptions) .by $70,$10 :(9-maxOptions) .by $70,$10
.byte $80 .byte $80
.byte $70 ; to match moved sprites .byte $60 ; to match moved sprites
.byte $4f .byte $4f
.word (display+140*40) .word (display+140*40)
:21 .by $0f ;76 :21 .by $0f ;76
@@ -184,25 +199,25 @@ OptionsDL
;Enter names of tanks DL ;Enter names of tanks DL
NameDL NameDL
.byte $70 .byte $70
.byte $47 .byte $47
.word DifficultyTitle .word DifficultyTitle
.byte $70,$70 ; 16 empty lines .byte $70,$70 ; 16 empty lines
.byte $42 .byte $42
.word NameScreen .word NameScreen
.byte $30 ; 4 empty lines .byte $30 ; 4 empty lines
.byte $42 .byte $42
.word NameScreen2 .word NameScreen2
.byte $30+$80 ; 4 empty lines + DLI .byte $30+$80 ; 4 empty lines + DLI
.byte $42 .byte $42
.word NameScreen3 .word NameScreen3
.byte $10 ; 2 empty lines .byte $10 ; 2 empty lines
.byte $42 .byte $42
.word NameScreen4 .word NameScreen4
.byte $02,$02 .byte $02,$02
.byte $30 ; 4 empty lines .byte $30 ; 4 empty lines
.byte $42 .byte $42
.word NameScreen5 .word NameScreen5
.byte $02 .byte $02
.byte $41 .byte $41
.word NameDL .word NameDL
; ------------------------------------------------- ; -------------------------------------------------
@@ -213,13 +228,13 @@ GameOverDL
.byte $70,$40 .byte $70,$40
.byte $47 ; 16 gr8 lines .byte $47 ; 16 gr8 lines
.word GameOverTitle .word GameOverTitle
.byte $60 ; 7 lines down to match new sprite position ; .byte $60 ; 7 lines down to match new sprite position
.byte $4f ; 1 line .byte $4f ; 1 line
.word display+(40*72) .word display+(40*72)
:28 .byte $0f ; 28 lines :28 .byte $0f ; 28 lines
.byte $0f+$80 .byte $0f+$80
.byte $4f ; 1 line .byte $4f ; 1 line
.word display+(40*32) .word display+(40*(32-7)) ;7 lines up to match new sprite position
:30 .byte $0f ; 30 lines :30 .byte $0f ; 30 lines
.byte $0f+$80 ; 1 line .byte $0f+$80 ; 1 line
.byte $4f ; 1 line .byte $4f ; 1 line
@@ -232,8 +247,8 @@ GameOverDL
.byte $42 .byte $42
.word GameOverResults .word GameOverResults
:5 .byte $00+$80,$02 :5 .byte $00+$80,$02
.byte $01 .byte $01
.word DLCreditsFragm .word DLCreditsFragm
; --------------- ; ---------------
; end of "constants" (ROM) ; end of "constants" (ROM)
;----------------------------------------------- ;-----------------------------------------------
@@ -4,7 +4,7 @@
statusBuffer statusBuffer
; 0123456789012345678901234567890123456789 ; 0123456789012345678901234567890123456789
dta d"Player: " dta d"Player: * "
dta d"Energy: Angle: Force: " dta d"Energy: Angle: Force: "
dta d"Round: Wind: " dta d"Round: Wind: "
+679
View File
@@ -0,0 +1,679 @@
.IF *>0 ;this is a trick that prevents compiling this file alone
; Basic hardware-dependent graphics routines.
; -----------------------------------------
.proc unPlot
; plots a point and saves the plotted byte, reverts the previous plot.
; -----------------------------------------
ldx #0 ; only one pixel
unPlotAfterX
stx WhichUnPlot
; first remake the oldie
lda oldplotL,x
sta oldplot
lda oldplotH,x
sta oldplot+1
lda oldply,x
tay
lda oldora,x
sta (oldplot),y
; is it not out of the screen ????
cpw ydraw #screenheight
jcc CheckX
mwa #0 ydraw
CheckX
cpw xdraw #screenwidth
jcs EndOfUnPlot
MakeUnPlot
; let's count coordinates taken from xdraw and ydraw
;xbyte = xbyte/8
lda xdraw+1
lsr
lda xdraw
ror ;just one bit over 256. Max screenwidth = 512!!!
lsr
lsr
;---
tay
ldx WhichUnPlot
tya
sta oldply,x
ldx ydraw
lda linetableL,x
sta xbyte
sta oldplot
lda linetableH,x
sta xbyte+1
sta oldplot+1
lda xdraw
and #$7
tax
lda color
bne ClearUnPlot
;plotting here
lda (xbyte),y
sta OldOraTemp
ora bittable,x
sta (xbyte),y
bne ContinueUnPlot ; allways <>0
ClearUnPlot
lda (xbyte),y
sta OldOraTemp
and bittable2,x
sta (xbyte),y
ContinueUnPlot
ldx WhichUnPlot
lda OldOraTemp
sta oldora,x
lda oldplot
sta oldplotL,x
lda oldplot+1
sta oldplotH,x
; and now we must solve the problem of several plots
; in one byte
ldx #4
ldy WhichUnPlot
LetsCheckOverlapping
cpx WhichUnPlot
beq SkipThisPlot
lda oldplotL,x
cmp oldplotL,y
bne NotTheSamePlot
lda oldplotH,x
cmp oldplotH,y
bne NotTheSamePlot
lda oldply,x
cmp oldply,y
bne NotTheSamePlot
; the pixel is in the same byte so let's take correct contents
lda oldora,x
sta oldora,y
NotTheSamePlot
SkipThisPlot
dex
bpl LetsCheckOverlapping
EndOfUnPlot
rts
.endp
; -----------------------------------------
.proc plot ;plot (xdraw, ydraw, color)
; color == 1 --> put pixel
; color == 0 --> erase pixel
; this is one of the most important routines in the whole
; game. If you are going to speed up the game, start with
; plot - it is used by every single effect starting from explosions
; through line drawing and small text output!!!
;
; Optimized by 0xF (Fox) THXXXX!!!
; -----------------------------------------
; is it not over the screen ???
cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1)
bcs unPlot.EndOfUnPlot ;nearest RTS
CheckX02
cpw xdraw #screenwidth
bcs EndOfPlot
MakePlot
; let's calculate coordinates from xdraw and ydraw
;xbyte = xbyte/8
lda xdraw+1
lsr
lda xdraw
ror ;just one bit over 256. Max screenwidth = 512!!!
lsr
lsr
sta xbyte
;---
ldx ydraw
ldy linetableL,x
lda linetableH,x
sta xbyte+1
lda xdraw
and #$7
tax
lda color
bne ClearPlot
lda (xbyte),y
ora bittable,x
sta (xbyte),y
EndOfPlot
rts
ClearPlot
lda (xbyte),y
and bittable2,x
sta (xbyte),y
rts
.endp
; -----------------------------------------
.proc point_plot
; -----------------------------------------
; checks state of the pixel (coordinates in xdraw and ydraw)
; result is in A (zero or appropriate bit is set)
; let's calculate coordinates from xdraw and ydraw
;xbyte = xbyte/8
lda xdraw+1
lsr
lda xdraw
ror ;just one bit over 256. Max screenwidht = 512!!!
lsr
lsr
sta xbyte
;---
ldx ydraw
ldy linetableL,x
lda linetableH,x
sta xbyte+1
lda xdraw
and #$7
tax
lda (xbyte),y
eor #$ff
and bittable,x
rts
.endp
;--------------------------------------------------
.proc drawmountains
;--------------------------------------------------
mwa #0 xdraw
mwa #mountaintable modify
mva #1 color
drawmountainsloop
ldy #0
lda (modify),y
cmp #screenheight
beq NoMountain
sta ydraw
sty ydraw+1
.IF FASTER_GRAF_PROCS = 1
; there was Drawline proc
lda #screenheight
sec
sbc ydraw
sta tempbyte01
jsr plot.MakePlot
; after plot we have: (xbyte),y - addres of screen byte; X - index in bittable (number of bit)
; jmp IntoDraw ; jumps inside Draw routine
; because one pixel is already plotted (and who cares? :) )
@
lda (xbyte),y
and bittable2,x
sta (xbyte),y
;IntoDraw
adw xbyte #screenBytes
dec tempbyte01
bne @-
; end of Drawline proc
.ELSE
; there was Drawline proc
drawline
jsr plot.MakePlot
inc ydraw
lda ydraw
cmp #screenheight
bne drawline
; end of Drawline proc
.ENDIF
NoMountain
inw modify
inw xdraw
cpw xdraw #screenwidth
bne drawmountainsloop
rts
.endp
;--------------------------------------------------
.proc TypeChar
; puts char on the graphics screen
; in: CharCode
; in: left LOWER corner of the char coordinates (xdraw, ydraw)
;--------------------------------------------------
; char to the table
lda CharCode
sta fontind
lda #$00
sta fontind+1
; char intex times 8
aslw fontind
rolw fontind
rolw fontind
adw fontind #TankFont
; and 8 bytes to the table
ldy #7
CopyChar
lda (fontind),y
eor #$ff
sta char1,y
lda #$ff
sta char2,y
dey
bpl CopyChar
; and 8 subsequent bytes as a mask
adw fontind #8
ldy #7
CopyMask
lda (fontind),y
eor #$ff
sta mask1,y
lda #$00
sta mask2,y
dey
bpl CopyMask
.IF FASTER_GRAF_PROCS = 1
; calculating coordinates from xdraw and ydraw
mwa xdraw xbyte
lda xbyte
and #$7
sta ybit
lsrw xbyte ; div 8
rorw xbyte
rorw xbyte
;---
ldy xbyte
lda ydraw ; y = y - 7 because left lower. shouldn't it be 8?
sec
sbc #7
tax
lda linetableL,x
sta xbyte
lda linetableH,x
sta xbyte+1
; mask preparation and character shifting
ldx ybit
beq MaskOK00
MakeMask00
.rept 8
lsr mask1+#
ror mask2+#
.endr
sec
.rept 8
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
bne MakeMask00
MaskOK00
; here x=0
lda Erase
beq CharLoopi ; it works, because x=0
lda #$ff
ldx #7
EmptyChar
sta char1,x
sta char2,x
dex
bpl EmptyChar
ldx #0
CharLoopi
lda (xbyte),y
ora mask1,x
and char1,x
sta (xbyte),y
iny
lda (xbyte),y
ora mask2,x
and char2,x
sta (xbyte),y
dey
adw xbyte #screenBytes
inx
cpx #8
bne CharLoopi
.ELSE
mvx #7 temp ; line counter (Y)
CharLoop1
mva #7 temp+1 ; pixel counter (X)
CharLoop2
mva #0 color
rol mask1,x
bcc NoMaskNoPlot
rol char1,x
bcs NoPlot
MakeCharPlot
lda Erase
bne ErasingChar
inc color
ErasingChar
NoPlot
jsr plot.MakePlot
AfterCharPlot
inw xdraw
ldx temp
dec temp+1
bpl CharLoop2
sec
sbw xdraw #8
dec ydraw
ldx temp
dex
stx temp
bpl CharLoop1
clc
lda ydraw
adc #8
sta ydraw
bne EndPutChar
NoMaskNoPlot
rol char1,x
jmp AfterCharPlot
.ENDIF
EndPutChar
rts
.endp
;--------------------------------------------------
.proc PutChar4x4
; puts 4x4 pixels char on the graphics screen
; in: dx, dy (LOWER left corner of the char)
; in: CharCode4x4 (.sbyte)
; in: plot4x4color (0/255)
; all pixels are being drawn
; (empty and not empty)
;--------------------------------------------------
cpw dy #(screenheight-1)
jcs TypeChar.EndPutChar ;nearest RTS
cpw dy #(4)
jcc TypeChar.EndPutChar ;nearest RTS
cpw dx #(screenwidth-4)
jcs TypeChar.EndPutChar ;nearest RTS
; checks ommited.
; char to the table
lda CharCode4x4
and #%00000001
beq Upper4bits
lda #$ff ; better option to check (nibbler4x4 = $00 or $ff)
Upper4bits
sta nibbler4x4
lda CharCode4x4
lsr
sta fontind
lda #$00
sta fontind+1
adw fontind #font4x4
; and 4 bytes to the table
ldy #0
ldx #3
CopyChar
lda (fontind),y ; Y must be 0 !!!!
bit nibbler4x4
bpl GetUpper4bits
:4 rol
GetUpper4bits
ora #$0f
sta char1,x
lda #$ff
sta char2,x
; and 4 bytes as a mask
lda #$f0
sta mask1,x
lda #$00
sta mask2,x
adw fontind #32 ; next byte of 4x4 font
dex
bpl CopyChar
.IF FASTER_GRAF_PROCS = 1
; calculating coordinates from xdraw and ydraw
mwa dx xbyte
lda xbyte
and #$7
sta ybit
:3 lsrw xbyte ; div 8
; rorw xbyte
; rorw xbyte
;---
ldy xbyte ; horizontal byte offet stored in Y
lda dy ; y = y - 3 because left lower.
sec
sbc #3
tax
lda linetableL,x
sta xbyte
lda linetableH,x
sta xbyte+1
; mask preparation and character shifting
ldx ybit
beq MaskOK01
MakeMask01
.rept 4
lsr mask1+#
ror mask2+#
.endr
sec
.rept 4
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
bne MakeMask01
MaskOK01
ldx #0
CharLoopi4x4
lda (xbyte),y
ora mask1,x
bit plot4x4color
bpl PutInColor0_1 ; only mask - no char
and char1,x
PutInColor0_1
sta (xbyte),y
iny
lda (xbyte),y
ora mask2,x
bit plot4x4color
bpl PutInColor0_2 ; only mask - no char
and char2,x
PutInColor0_2
sta (xbyte),y
dey
adw xbyte #screenBytes
inx
cpx #4
bne CharLoopi4x4
.ELSE
mwa xdraw char2
mwa ydraw mask2
mva color mask2+2
mwa dx xdraw
mwa dy ydraw
mvx #3 temp ; line counter (Y)
CharLoop1
mva #3 temp+1 ; pixel counter (X)
CharLoop2
mva #0 color
rol mask1,x
bcc NoMaskNoPlot
rol char1,x
bcs NoPlot
MakeCharPlot
lda plot4x4color
beq ErasingChar
inc color
ErasingChar
NoPlot
jsr plot.MakePlot
AfterCharPlot
inw xdraw
ldx temp
dec temp+1
bpl CharLoop2
sec
sbw xdraw #4
dec ydraw
ldx temp
dex
stx temp
bpl CharLoop1
mwa char2 xdraw
mwa mask2 ydraw
mva mask2+2 color
bpl EndPut4x4
NoMaskNoPlot
rol char1,x
jmp AfterCharPlot
.ENDIF
EndPut4x4
rts
.endp
;--------------------------------------------------
.proc ClearScreen
;--------------------------------------------------
mwa #display temp
ldy #0
@ lda #$ff
sta (temp),y
inw temp
cpw temp #display+screenheight*screenBytes+1
bne @-
rts
.endp
;--------------------------------------------------
.proc GenerateLineTable
mwa #display temp
mwa #linetableL temp2
mwa #linetableH modify
ldy #0
@ lda temp
sta (temp2),y
lda temp+1
sta (modify),y
adw temp #40
iny
cpy #screenheight+1
bne @-
rts
.endp
;--------------------------------------------------
.proc SetMainScreen
; mva #0 dmactls
SetDLI DLIinterruptGraph ; jsr SetDLI for graphics (game) screen
mwa #dl dlptrs ; issue #72 (glitches when switches)
lda #%00111110
; and #$fc
; ora #$02 ; 2=normal, 3 = wide screen width
sta dmactls
mva WallsType COLBAKS ; set color of background
jmp WaitOneFrame
; rts
.endp
;--------------------------------------------------
; ******* This is weapon .... but ... *******
; -------------------------------------------------
.proc AtomicWinter
; -------------------------------------------------
; This routine is run from inside of the main loop
; and replaces Shoot and Flight routines
; X and TankNr - index of shooting tank
; -------------------------------------------------
mva #sfx_sandhog sfx_effect
.IF FASTER_GRAF_PROCS = 1
ldy #0 ; byte counter (from 0 to 39)
NextColumn
; big loop - we repat internal loops for each column of bytes
sty magic
ldx #120 ; line counter (from 0 to 60 )
; first loop - inverse column of bytes for a while
ldy magic
NextLine1
jsr InverseScreenByte
dex
dex
bpl NextLine1
;
jsr WaitOneFrame ; wait uses A only
; second loop - inverse again and put random "snow" to column of bytes
ldx #120
ldy magic
mva #$55 magic+1
NextLine2
jsr InverseScreenByte
lda random
ora magic+1
and (temp),y
sta (temp),y
lda magic+1
eor #$ff
sta magic+1
dex
dex
bpl NextLine2
; and go to next column
iny
cpy #40
bne NextColumn
.ELSE
mva #1 color
mwa #120 ydraw
NextLineSlow
lda #0
sta xdraw
sta xdraw+1
NextPixelSlow
bit random
bpl NoPlot
bvc NoPlot
jsr plot.MakePlot
NoPlot
inw xdraw
cpw xdraw #screenwidth
bne NextPixelSlow
dec ydraw
dec ydraw
bpl NextLineSlow
.ENDIF
; and we have "snow" :)
lda #0
ldx TankNr
sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter
jsr SetFullScreenSoilRange
jmp SoilDown2.NoClearTanks
; rts
; in order to optimize the fragment repeated in both internal loops
; we save 15 bytes :)
InverseScreenByte
lda LineTableL,x
sta temp
lda LineTableH,x
sta temp+1
lda (temp),y
eor #$ff
sta (temp),y
rts
.endp
.ENDIF
+267
View File
@@ -0,0 +1,267 @@
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
.IF *>0 ;this is a trick that prevents compiling this file alone
;--------------------------------------------------
.proc DLIinterruptGraph
pha
phy
ldy dliCounter
lda dliColorsBack,y
.IF TARGET = 800
nop ; necessary on 800 because DLIs take less time, jitter visible without it
nop
nop
.ENDIF
nop
nop
sta COLPF1
lda GradientNr
bne GoGradient
ldy #$ff ; one mauntain color
GoGradient
iny
lda (GradientColors),y ; mountains colors array
sta COLPF2
inc dliCounter
ply
pla
rti
.endp
;--------------------------------------------------
.proc DLIinterruptOptions
pha
phy
lda #0 ; background color
sta COLPF1
ldy GradientNr
beq @+
ldy #1
@ lda (GradientColors),y ; mountains colors array
sta COLPF2
ply
pla
rti
.endp
;--------------------------------------------------
.proc DLIinterruptGameOver
pha
phy
lda dliCounter
bne EndofPMG
lda #%00100001 ; playfield after P/M - prior=1
;STA WSYNC
sta PRIOR
bne EndOfDLI_GO
EndofPMG
cmp #1
bne ColoredLines
lda #%00100100 ; playfield before P/M
;STA WSYNC
sta PRIOR
bne EndOfDLI_GO
ColoredLines
cmp #9
beq CreditsScroll
tay
lda GameOverColoursTable-3,y ; -2 because this is DLI nr 2 and -1 (labels line)
ldy #$0a ; text colour (brightnes)
;STA WSYNC
sta COLPF2
sty COLPF1
bne EndOfDLI_GO
CreditsScroll
lda #$00
sta COLPF2
EndOfDLI_GO
inc dliCounter
ply
pla
rti
.endp
;--------------------------------------------------
.proc DLIinterruptText
pha
lda dliCounter
bne MoreBarsColorChange
lda #TextBackgroundColor
;sta WSYNC
sta COLPF2
mva #TextForegroundColor COLPF3
bne EndOfDLI_Text
MoreBarsColorChange
and #%00000001
rol
sta COLPF2
EndOfDLI_Text
inc dliCounter
pla
DLIinterruptNone
rti
.endp
;--------------------------------------------------
.proc VBLinterrupt
mva #0 dliCounter
mva #$02 DliColorBack
lda PAL
and #%00001110
beq itsPAL
;it is NTSC here
dec NTSCcounter
bne itsPAL
mva #6 NTSCcounter
bne SkippedIfNTSC ; skip doing VBL things each 6 frames in Amerika, Amerika
; We're all living in Amerika, Coca Cola, Wonderbra
itsPAL
; pressTimer is trigger tick counter. always 50 ticks / s
bit:smi:inc pressTimer ; timer halted if >127. max time measured 2.5 s
SkippedIfNTSC
bit RMT_blocked
bmi SkipRMTVBL
; ------- RMT -------
lda sfx_effect
bmi lab2
asl @ ; * 2
tay ;Y = 2,4,..,16 instrument number * 2 (0,2,4,..,126)
ldx #0 ;X = 0 channel (0..3 or 0..7 for stereo module)
lda #0 ;A = 0 note (0..60)
bit noSfx
smi:jsr RASTERMUSICTRACKER+15 ;RMT_SFX start tone (It works only if FEAT_SFX is enabled !!!)
lda #$ff
sta sfx_effect ;reinit value
lab2
jsr RASTERMUSICTRACKER+3 ;1 play
; ------- RMT -------
SkipRMTVBL
bit ScrollFlag
bpl EndOfCreditsVBI
CreditsVBI
inc CreditsVScrol
lda CreditsVScrol
cmp #32 ;not too fast
beq nextlinedisplay
:2 lsr ;not too fast
sta VSCROL
jmp EndOfCreditsVBI
nextlinedisplay
lda #0
sta CreditsVScrol
sta VSCROL
clc
lda DLCreditsAddr
adc #40
sta DLCreditsAddr
bcc @+
inc DLCreditsAddr+1
@
cmp #<CreditsLastLine
bne EndOfCreditsVBI
lda DLCreditsAddr+1
cmp #>CreditsLastLine
bne EndOfCreditsVBI
; adw DLCreditsAddr #40
; cpw DLCreditsAddr #CreditsLastLine
; bne EndOfCreditsVBI
mwa #Credits DLCreditsAddr
EndOfCreditsVBI
.IF TARGET = 800
; support for joysticks :)
ldx JoystickNumber
lda STICK0,x
sta STICK0
lda STRIG0,x
sta STRIG0
jmp XITVBV
.ELIF TARGET = 5200
lda SkStatSimulator
bmi @+
inc SkStatSimulator
@
lda JoystickNumber ; select port
ora #%00000100 ; Speaker off, Pots enabled
sta CONSOL5200
center = 114 ;Read analog stick and make it look like a digital stick
threshold = 60
lda JoystickNumber
asl
tax
lda paddl0,x ;Read POT0 value (horizontal position)
cmp #center+threshold ;Compare with right threshold
rol stick0 ;Feed carry into digital stick value
cmp #center-threshold ;Compare with left threshold
rol stick0 ;Feed carry into digital stick value
lda paddl1,x ;Read POT1 value (vertical position)
cmp #center+threshold ;Compare with down threshold
rol stick0 ;Feed carry into digital stick value
cmp #center-threshold ;Compare with down threshold
rol stick0 ;Feed carry into digital stick value
lda stick0 ;0 indicates a press so the right/down values need to be inverted
eor #2+8
and #$0f
sta stick0
ldx JoystickNumber
; check shift key (5200 second fire button)
lda SKSTAT
:3 lsr ; third bit
and trig0,x ; and first button
;lda trig0,x
sta strig0 ;Move hardware to shadow
mva chbas chbase
lda skstat ;Reset consol key shadow is no key is pressed anymore
and #4
beq @+
mva #consol_reset consol
mva #@kbcode._none kbcode
@
pla
tay
pla
tax
pla
rti
.ENDIF
.endp
.IF TARGET = 5200
.proc kb_continue
sta kbcode ;Store key code in shadow.
mva #0 SkStatSimulator
exit pla
tay
pla
tax
pla
rti
.endp
.ENDIF
;--------------------------------------------------
.macro SetDLI
; SetDLI #WORD
; Initialises Display List Interrupts
LDY # <:1
LDX # >:1
jsr _SetDLIproc
.endm
.proc _SetDLIproc
LDA #$C0
STY VDSLST
STX VDSLST+1
STA NMIEN
rts
.endp
.ENDIF
+17 -14
View File
@@ -74,21 +74,24 @@
.ENDM .ENDM
;------------------------------------- ;-------------------------------------
.MACRO WAIT .MACRO WAIT
; WAIT ; WAIT
; waits one frame (1/50 s(PAL) or 1/60s(NTSC)) ; waits one frame (1/50 s(PAL) or 1/60s(NTSC))
?zero LDA VCOUNT ?ze LDA VCOUNT
beq ?zero cmp #16 ; if line<16 then wait for line>15 (long VBI protection)
bpl ?WA bcc ?ze
sbc #10 ; last lines correction sbc #10 ; last lines correction
?WA cmp VCOUNT ?wa cmp VCOUNT
beq ?WA bcc ?wa
bcc ?WA ?wf cmp VCOUNT
?WFRAME cmp VCOUNT bcs ?wf
beq ?nowait .ENDM
bcs ?WFRAME ;-------------------------------------
?nowait .macro waitRTC
.ENDM lda RTCLOK+1
?wa cmp RTCLOK+1
beq ?wa
.endm
;------------------------------------- ;-------------------------------------
.macro negw .macro negw
; negate the given word (0-a) ; negate the given word (0-a)
@@ -102,7 +105,7 @@
sta :1+1 sta :1+1
.endm .endm
;------------------------------------- ;-------------------------------------
.macro randomizer .macro randomize
;usage: randomize floor ceiling ;usage: randomize floor ceiling
;returns (in A) a random .byte between "floor" and "ceiling" ;returns (in A) a random .byte between "floor" and "ceiling"
.if :2 < :1 .if :2 < :1
+39 -14
View File
@@ -51,6 +51,28 @@
STX $0201 STX $0201
STA NMIEN STA NMIEN
.ENDM .ENDM
;-------------------------------------
.MACRO VDL
; VDL #WORD
; Changes Display List addres
; and sets width of the screen
; vdl dl,$01 - narrow screen (32 bytes)
; vdl dl,$02 - normal screen (40 bytes)
; vdl dl,$03 - wide screen (48 bytes)
; (works only with system interrupts ON)
.if %0=2
lda dmactls
and #$fc
ora #%2
sta dmactls
.endif
LDA # <%1
STA DLPTRS
LDA # >%1
STA DLPTRS+1
.ENDM
;------------------------------------- ;-------------------------------------
.MACRO halt .MACRO halt
?stop ?stop
@@ -73,21 +95,24 @@
PLA PLA
.ENDM .ENDM
;------------------------------------- ;-------------------------------------
.MACRO WAIT .MACRO WAIT
; WAIT ; WAIT
; waits one frame (1/50 s(PAL) or 1/60s(NTSC)) ; waits one frame (1/50 s(PAL) or 1/60s(NTSC))
?zero LDA VCOUNT ?ze LDA VCOUNT
beq ?zero cmp #16 ; if line<16 then wait for line>15 (long VBI protection)
bpl ?WA bcc ?ze
sbc #10 ; last lines correction sbc #10 ; last lines correction
?WA cmp VCOUNT ?wa cmp VCOUNT
beq ?WA bcc ?wa
bcc ?WA ?wf cmp VCOUNT
?WFRAME cmp VCOUNT bcs ?wf
beq ?nowait .ENDM
bcs ?WFRAME ;-------------------------------------
?nowait .macro waitRTC
.ENDM lda RTCLOK+2
?wa cmp RTCLOK+2
beq ?wa
.endm
;------------------------------------- ;-------------------------------------
.macro negw .macro negw
; negate the given word (0-a) ; negate the given word (0-a)
@@ -101,7 +126,7 @@
sta :1+1 sta :1+1
.endm .endm
;------------------------------------- ;-------------------------------------
.macro randomizer .macro randomize
;usage: randomize floor ceiling ;usage: randomize floor ceiling
;returns (in A) a random .byte between "floor" and "ceiling" ;returns (in A) a random .byte between "floor" and "ceiling"
.if :2 < :1 .if :2 < :1
File diff suppressed because it is too large Load Diff
+708
View File
@@ -0,0 +1,708 @@
.IF *>0 ;this is a trick that prevents compiling this file alone
; Basic hardware-dependent graphics routines.
; -----------------------------------------
.proc unPlot
; plots a point and saves the plotted byte, reverts the previous plot.
; -----------------------------------------
ldx #0 ; only one pixel
unPlotAfterX
stx WhichUnPlot
; first remake the oldie
lda oldplotL,x
sta oldplot
lda oldplotH,x
sta oldplot+1
ldy #0
lda oldora,x
sta (oldplot),y
; is it not out of the screen ????
cpw ydraw #screenheight
jcc CheckX
mwa #0 ydraw
CheckX
cpw xdraw #screenwidth
jcs EndOfUnPlot
MakeUnPlot
; let's count coordinates taken from xdraw and ydraw
lda xdraw
and #%11111000
;sta xbyte
;---
ldx ydraw
clc
adc linetableL,x
sta xbyte
sta oldplot
lda linetableH,x
adc xdraw+1
sta xbyte+1
sta oldplot+1
lda xdraw
and #$7
tax
ldy #0
lda color
bne ClearUnPlot
;plotting here
lda (xbyte),y
sta OldOraTemp
ora bittable,x
sta (xbyte),y
bne ContinueUnPlot ; allways <>0
ClearUnPlot
lda (xbyte),y
sta OldOraTemp
and bittable2,x
sta (xbyte),y
ContinueUnPlot
ldx WhichUnPlot
lda OldOraTemp
sta oldora,x
lda oldplot
sta oldplotL,x
lda oldplot+1
sta oldplotH,x
; and now we must solve the problem of several plots
; in one byte
ldx #4
ldy WhichUnPlot
LetsCheckOverlapping
cpx WhichUnPlot
beq SkipThisPlot
lda oldplotL,x
cmp oldplotL,y
bne NotTheSamePlot
lda oldplotH,x
cmp oldplotH,y
bne NotTheSamePlot
; the pixel is in the same byte so let's take correct contents
lda oldora,x
sta oldora,y
NotTheSamePlot
SkipThisPlot
dex
bpl LetsCheckOverlapping
EndOfUnPlot
rts
.endp
; -----------------------------------------
.proc plot ;plot (xdraw, ydraw, color)
; color == 1 --> put pixel
; color == 0 --> erase pixel
; this is one of the most important routines in the whole
; game. If you are going to speed up the game, start with
; plot - it is used by every single effect starting from explosions
; through line drawing and small text output!!!
;
; Optimized by 0xF (Fox) THXXXX!!!
; -----------------------------------------
; is it not over the screen ???
cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1)
bcs unPlot.EndOfUnPlot ;nearest RTS
CheckX02
cpw xdraw #screenwidth
bcs EndOfPlot
MakePlot
; let's calculate coordinates from xdraw and ydraw
lda xdraw
and #%11111000
;sta xbyte
;---
ldx ydraw
clc
adc linetableL,x
sta xbyte
lda linetableH,x
adc xdraw+1
sta xbyte+1
lda xdraw
and #$7
tax
ldy #0
lda color
bne ClearPlot
lda (xbyte),y
ora bittable,x
sta (xbyte),y
EndOfPlot
rts
ClearPlot
lda (xbyte),y
and bittable2,x
sta (xbyte),y
rts
.endp
; -----------------------------------------
.proc point_plot
; -----------------------------------------
; checks state of the pixel (coordinates in xdraw and ydraw)
; result is in A (zero or appropriate bit is set)
; let's calculate coordinates from xdraw and ydraw
lda xdraw
and #%11111000
;sta xbyte
;---
ldx ydraw
clc
adc linetableL,x
sta xbyte
lda linetableH,x
adc xdraw+1
sta xbyte+1
lda xdraw
and #$7
tax
ldy #0
lda (xbyte),y
eor #$ff
and bittable,x
rts
.endp
;--------------------------------------------------
.proc drawmountains
;--------------------------------------------------
mwa #0 xdraw
mwa #mountaintable modify
mva #1 color
drawmountainsloop
ldy #0
lda (modify),y
cmp #screenheight
beq NoMountain
sta ydraw
sty ydraw+1
.IF FASTER_GRAF_PROCS = 1
; there was Drawline proc
lda #screenheight
sec
sbc ydraw
sta tempbyte01
jsr plot.MakePlot
; X - index in bittable (number of bit) and nothing more (for use) in C64 :)
; jmp IntoDraw ; jumps inside Draw routine
; because one pixel is already plotted (and who cares? :) )
@
lda (xbyte),y
and bittable2,x
sta (xbyte),y
;IntoDraw
inc ydraw
lda xdraw
and #%11111000
;sta xbyte
;---
ldy ydraw
clc
adc linetableL,y
sta xbyte
lda linetableH,y
adc xdraw+1
sta xbyte+1
ldy #0
dec tempbyte01
bne @-
; end of Drawline proc
.ELSE
; there was Drawline proc
drawline
jsr plot.MakePlot
inc ydraw
lda ydraw
cmp #screenheight
bne drawline
; end of Drawline proc
.ENDIF
NoMountain
inw modify
inw xdraw
cpw xdraw #screenwidth
bne drawmountainsloop
rts
.endp
;--------------------------------------------------
.proc TypeChar
; puts char on the graphics screen
; in: CharCode
; in: left LOWER corner of the char coordinates (xdraw, ydraw)
;--------------------------------------------------
; char to the table
lda CharCode
sta fontind
lda #$00
sta fontind+1
; char intex times 8
aslw fontind
rolw fontind
rolw fontind
adw fontind #TankFont
; and 8 bytes to the table
ldy #7
CopyChar
lda (fontind),y
eor #$ff
sta char1,y
lda #$ff
sta char2,y
dey
bpl CopyChar
; and 8 subsequent bytes as a mask
adw fontind #8
ldy #7
CopyMask
lda (fontind),y
eor #$ff
sta mask1,y
lda #$00
sta mask2,y
dey
bpl CopyMask
.IF FASTER_GRAF_PROCS = 1
; mask preparation and character shifting
lda xdraw
and #$7
tax
beq MaskOK00
MakeMask00
.rept 8
lsr mask1+#
ror mask2+#
.endr
sec
.rept 8
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
bne MakeMask00
MaskOK00
lda ydraw
sec
sbc #7
sta ydraw
; X = 0 !
lda Erase
beq CharLoopi ; it works, because x=0
lda #$ff
ldx #7
EmptyChar
sta char1,x
sta char2,x
dex
bpl EmptyChar
ldx #0
CharLoopi
; calculating coordinates from xdraw and ydraw
ldy ydraw
lda xdraw
and #%11111000
clc
adc linetableL,y
sta xbyte
lda linetableH,y
adc xdraw+1
sta xbyte+1
;--
ldy #0
lda (xbyte),y
ora mask1,x
and char1,x
sta (xbyte),y
ldy #8
lda (xbyte),y
ora mask2,x
and char2,x
sta (xbyte),y
inc ydraw
inx
cpx #8
bne CharLoopi
.ELSE
mvx #7 temp ; line counter (Y)
CharLoop1
mva #7 temp+1 ; pixel counter (X)
CharLoop2
mva #0 color
rol mask1,x
bcc NoMaskNoPlot
rol char1,x
bcs NoPlot
MakeCharPlot
lda Erase
bne ErasingChar
inc color
ErasingChar
NoPlot
jsr plot.MakePlot
AfterCharPlot
inw xdraw
ldx temp
dec temp+1
bpl CharLoop2
sec
sbw xdraw #8
dec ydraw
ldx temp
dex
stx temp
bpl CharLoop1
clc
lda ydraw
adc #8
sta ydraw
bne EndPutChar
NoMaskNoPlot
rol char1,x
jmp AfterCharPlot
.ENDIF
EndPutChar
rts
.endp
;--------------------------------------------------
.proc PutChar4x4
; puts 4x4 pixels char on the graphics screen
; in: dx, dy (LOWER left corner of the char)
; in: CharCode4x4 (.sbyte)
; in: plot4x4color (0/255)
; all pixels are being drawn
; (empty and not empty)
;--------------------------------------------------
cpw dy #(screenheight-1)
jcs TypeChar.EndPutChar ;nearest RTS
cpw dy #(4)
jcc TypeChar.EndPutChar ;nearest RTS
cpw dx #(screenwidth-4)
jcs TypeChar.EndPutChar ;nearest RTS
; checks ommited.
; char to the table
lda CharCode4x4
and #%00000001
beq Upper4bits
lda #$ff ; better option to check (nibbler4x4 = $00 or $ff)
Upper4bits
sta nibbler4x4
lda CharCode4x4
lsr
sta fontind
lda #$00
sta fontind+1
adw fontind #font4x4
; and 4 bytes to the table
ldy #0
ldx #3
CopyChar
lda (fontind),y ; Y must be 0 !!!!
bit nibbler4x4
bpl GetUpper4bits
:4 rol
GetUpper4bits
ora #$0f
sta char1,x
lda #$ff
sta char2,x
; and 4 bytes as a mask
lda #$f0
sta mask1,x
lda #$00
sta mask2,x
adw fontind #32 ; next byte of 4x4 font
dex
bpl CopyChar
.IF FASTER_GRAF_PROCS = 1
; mask preparation and character shifting
lda dx
and #$7
tax
beq MaskOK01
MakeMask01
.rept 4
lsr mask1+#
ror mask2+#
.endr
sec
.rept 4
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
bne MakeMask01
MaskOK01
lda dy
sec
sbc #3
sta dy
ldx #0
CharLoopi4x4
; calculating coordinates from xdraw and ydraw
ldy dy
lda dx
and #%11111000
clc
adc linetableL,y
sta xbyte
lda linetableH,y
adc dx+1
sta xbyte+1
;--
ldy #0
lda (xbyte),y
ora mask1,x
bit plot4x4color
bpl PutInColor0_1 ; only mask - no char
and char1,x
PutInColor0_1
sta (xbyte),y
ldy #8
lda (xbyte),y
ora mask2,x
bit plot4x4color
bpl PutInColor0_2 ; only mask - no char
and char2,x
PutInColor0_2
sta (xbyte),y
inc dy
inx
cpx #4
bne CharLoopi4x4
.ELSE
mwa xdraw char2
mwa ydraw mask2
mva color mask2+2
mwa dx xdraw
mwa dy ydraw
mvx #3 temp ; line counter (Y)
CharLoop1
mva #3 temp+1 ; pixel counter (X)
CharLoop2
mva #0 color
rol mask1,x
bcc NoMaskNoPlot
rol char1,x
bcs NoPlot
MakeCharPlot
lda plot4x4color
beq ErasingChar
inc color
ErasingChar
NoPlot
jsr plot.MakePlot
AfterCharPlot
inw xdraw
ldx temp
dec temp+1
bpl CharLoop2
sec
sbw xdraw #4
dec ydraw
ldx temp
dex
stx temp
bpl CharLoop1
mwa char2 xdraw
mwa mask2 ydraw
mva mask2+2 color
bpl EndPut4x4
NoMaskNoPlot
rol char1,x
jmp AfterCharPlot
.ENDIF
EndPut4x4
rts
.endp
;--------------------------------------------------
.proc ClearScreen
;--------------------------------------------------
mwa #displayC64 temp
ldy #0
@ lda #$ff
sta (temp),y
inw temp
cpw temp #displayC64+screenheight*screenBytes+1
bne @-
rts
.endp
;--------------------------------------------------
.proc GenerateLineTable
mwa #displayC64 temp
mwa #linetableL temp2
mwa #linetableH modify
ldy #0
ldx #0
@ lda temp
sta (temp2),y
lda temp+1
sta (modify),y
cpx #7
bne NotChar
ldx #0
adw temp #(320-7)
jmp next8lines
NotChar
inw temp
inx
next8lines
iny
cpy #screenheight+1
bne @-
rts
.endp
;--------------------------------------------------
.proc SetMainScreen
lda #$b ; Grey background and border
lda WallsType
:4 rol
sta $d020
sta $d021
lda $dd00 ; Set video bank to start at 0
and #252
ora #3
sta $dd00
lda #$18
sta $d018
; SwitchVICBank(0)
; SetScreenMemory($2000)
SetHiresBitmapMode ; Hires mode on
lda #$00
sta 53281
; clear color RAM
ldx #0
@ lda #1
sta $d800,x
sta $d900,x
sta $da00,x
sta $db00,x
lda #$0f
sta $0400,x
sta $0500,x
sta $0600,x
sta $0700,x
inx
bne @-
rts
.endp
;--------------------------------------------------
; ******* This is weapon .... but ... *******
; -------------------------------------------------
.proc AtomicWinter
; -------------------------------------------------
; This routine is run from inside of the main loop
; and replaces Shoot and Flight routines
; X and TankNr - index of shooting tank
; -------------------------------------------------
mva #sfx_sandhog sfx_effect
.IF FASTER_GRAF_PROCS = 1
mvy #0 magic ; byte counter (from 0 to 39)
NextColumn
; big loop - we repat internal loops for each column of bytes
ldx #120 ; line counter (from 0 to 60 )
; first loop - inverse column of bytes for a while
NextLine1
jsr InverseScreenByte
dex
dex
bpl NextLine1
;
jsr WaitOneFrame ; wait uses A only
; second loop - inverse again and put random "snow" to column of bytes
ldx #120
mva #$55 magic+1
NextLine2
jsr InverseScreenByte
lda random
ora magic+1
and (temp),y
sta (temp),y
lda magic+1
eor #$ff
sta magic+1
dex
dex
bpl NextLine2
; and go to next column
inc magic
ldy magic
cpy #40
bne NextColumn
.ELSE
mva #1 color
mwa #120 ydraw
NextLineSlow
lda #0
sta xdraw
sta xdraw+1
NextPixelSlow
bit random
bpl NoPlot
bvc NoPlot
jsr plot.MakePlot
NoPlot
inw xdraw
cpw xdraw #screenwidth
bne NextPixelSlow
dec ydraw
dec ydraw
bpl NextLineSlow
.ENDIF
; and we have "snow" :)
lda #0
ldx TankNr
sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter
jsr SetFullScreenSoilRange
jmp SoilDown2.NoClearTanks
; rts
; in order to optimize the fragment repeated in both internal loops
; we save 15 bytes :)
InverseScreenByte
ldy magic
sty temp
ldy #0
sty temp+1
aslw temp
rolw temp
rolw temp
lda temp
adc LineTableL,x
sta temp
lda LineTableH,x
adc temp+1
sta temp+1
lda (temp),y
eor #$ff
sta (temp),y
rts
.endp
.ENDIF
+22
View File
@@ -0,0 +1,22 @@
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
.IF *>0 ;this is a trick that prevents compiling this file alone
DLIinterruptGraph = 0
;--------------------------------------------------
.macro SetDLI
; SetDLI #WORD
; Initialises Display List Interrupts
LDY # <:1
LDX # >:1
jsr _SetDLIproc
.endm
.proc _SetDLIproc
; LDA #$C0
; STY VDSLST
; STX VDSLST+1
; STA NMIEN
rts
.endp
.ENDIF
+49
View File
@@ -0,0 +1,49 @@
vic_spr0_x = $D000
vic_spr0_y = $D001
vic_spr1_x = $D002
vic_spr1_y = $D003
vic_spr2_x = $D004
vic_spr2_y = $D005
vic_spr3_x = $D006
vic_spr3_y = $D007
vic_spr4_x = $D008
vic_spr4_y = $D009
vic_spr5_x = $D00A
vic_spr5_y = $D00B
vic_spr6_x = $D00C
vic_spr6_y = $D00D
vic_spr7_x = $D00E
vic_spr7_y = $D00F
vic_spr_hi_x = $D010
vic_cr1 = $D011
vic_raster = $D012
vic_lp_x = $D013
vic_lp_y = $D014
vic_spr_ena = $D015
vic_cr2 = $D016
vic_spr_exp_y = $D017
vic_mem = $D018
vic_irq = $D019
vic_irq_ena = $D01A
vic_spr_dp = $D01B
vic_spr_mcolor = $D01C
vic_spr_exp_x = $D01D
vic_spr_ss_col = $D01E
vic_spr_sd_col = $D01F
vic_border = $D020
vic_bg_color0 = $D021
vic_bg_color1 = $D022
vic_bg_color2 = $D023
vic_bg_color3 = $D024
vic_spr_color1 = $D025
vic_spr_color2 = $D026
vic_spr0_color = $D027
vic_spr1_color = $D028
vic_spr2_color = $D029
vic_spr3_color = $D02A
vic_spr4_color = $D02B
vic_spr5_color = $D02C
vic_spr6_color = $D02D
vic_spr7_color = $D02E
RANDOM = $D41B
+352
View File
@@ -0,0 +1,352 @@
;****************************************************************************
;* ATARI PERSONAL COMPUTER *
;* SYSTEM EQUATES *
;****************************************************************************
FAKEADDR EQU $0002
ATRACT EQU FAKEADDR
RTCLOK EQU $12 ;REAL TIME CLOCK
;
; PAGE TWO RAM ASSIGNMENTS
;
VDSLST EQU FAKEADDR ;DSP LIST NMI VECTOR
VPRCED EQU FAKEADDR ;PROCEED IRQ VECTOR
VINTER EQU FAKEADDR ;INTERUPT IRQ VECTOR
VBREAK EQU FAKEADDR ;BRK INST IRQ VECTOR
VKEYBD EQU FAKEADDR ;POKEY KB IRQ VECTOR
VSERIN EQU FAKEADDR ;POKEY INPUT RDY IRQ
VSEROR EQU FAKEADDR ;POKEY OUTPUT RDY
VSEROC EQU FAKEADDR ;POKEY OUTPUT DONE
VTIMR1 EQU FAKEADDR ;POKEY TIMER 1 IRQ
VTIMR2 EQU FAKEADDR ;POKEY TIMER 2 IRQ
VTIMR4 EQU FAKEADDR ;POKEY TIMER 4 IRQ
VIMIRQ EQU FAKEADDR ;IMMED IRQ VECTOR
CDTMV1 EQU FAKEADDR ;COUNT DOWN TIMER 1
CDTMV2 EQU FAKEADDR ;COUNT DOWN TIMER 2
CDTMV3 EQU FAKEADDR ;COUNT DOWN TIMER 3
CDTMV4 EQU FAKEADDR ;COUNT DOWN TIMER 4
CDTMV5 EQU FAKEADDR ;COUNT DOWN TIMER 5
VVBLKI EQU FAKEADDR ;IMM VBLK NMI VECTOR
VVBLKD EQU FAKEADDR ;DEF VBLK NMI VECTOR
CDTMA1 EQU FAKEADDR ;CDTMV1 JSR ADDRESS
CDTMA2 EQU FAKEADDR ;CDTMV2 JSR ADDRESS
CDTMF3 EQU FAKEADDR ;CDTMV3 FLAG
SRTIMR EQU FAKEADDR ;SOFTWARE REPEAT TMR
CDTMF4 EQU FAKEADDR ;CDTMV4 FLAG
INTEMP EQU FAKEADDR ;IAN'S TEMP
CDTMF5 EQU FAKEADDR ;CDTMV5 FLAG
DMACTLS EQU FAKEADDR ;SAVE DMACTL REG
DLPTRS EQU FAKEADDR ;SAVE DISP LIST LO
;SDLSTH EQU $0231 ;SAVE DISP LIST HI
SSKCTL EQU FAKEADDR ;SKCTL REGISTER RAM
LCOUNT EQU FAKEADDR ;LOADER TEMP
LPENH EQU FAKEADDR ;LIGHT PEN HORIZONTAL
LPENV EQU FAKEADDR ;LIGHT PEN VERTICAL
BRKKY EQU FAKEADDR ;BREAK KEY VECTOR
RELADR EQU FAKEADDR ;LOADER REL ADDR
CDEVIC EQU FAKEADDR ;COMMAND BUFFER-DEV
CCOMND EQU FAKEADDR ;COMMAND BUFFER-CMND
CAUX1 EQU FAKEADDR ;COMMAND BUFFER AUX1
CAUX2 EQU FAKEADDR ;COMMAND BUFFER AUX2
;TEMP EQU $023E ;TEMPORARY RAM CELL
ERRFLG EQU FAKEADDR ;DEVICE ERROR FLAG
DFLAGS EQU FAKEADDR ;DISK FLAGS(SECTOR1)
DBSECT EQU FAKEADDR ;# DISK BOOT SECTORS
BOOTAD EQU FAKEADDR ;DISK BOOT ADDRESS
COLDST EQU FAKEADDR ;COLDSTART FLAG 1=CS
RECLEN EQU FAKEADDR ;LOADER LENGTH
DSKTIM EQU FAKEADDR ;DISK TIME OUT REG
VSFLAG EQU FAKEADDR ;FINE SCROLL TEMP
KEYDIS EQU FAKEADDR ;KEY DISABLE FLAG
FINE EQU FAKEADDR ;FINE SCROLL ENABLE(A1200)
GPRIOR EQU FAKEADDR ;GLOBAL PRIORITY
PADDL0 EQU FAKEADDR ;POT 0 RAM CELL
PADDL1 EQU FAKEADDR
PADDL2 EQU FAKEADDR
PADDL3 EQU FAKEADDR
STICK0 EQU FAKEADDR ;JOYSTICK 0 RAM CELL
STICK1 EQU FAKEADDR
PTRIG0 EQU FAKEADDR ;PADDLE TRIGGER 0
PTRIG1 EQU FAKEADDR
PTRIG2 EQU FAKEADDR
PTRIG3 EQU FAKEADDR
STRIG0 EQU FAKEADDR ;JOYSTICK TRIGGER 0
STRIG1 EQU FAKEADDR
HIBYTE EQU FAKEADDR ;LOADER
WMODE EQU FAKEADDR ;CASSETTE R/W MODE
BLIM EQU FAKEADDR ;CASSETTE RECORD SIZE
IMASK EQU FAKEADDR
JVECK EQU FAKEADDR ;JUMP VECTOR
NEWADR EQU FAKEADDR ;LOADER NEW ADDRESS
TXTROW EQU FAKEADDR ;TEXT ROWCRS
TXTCOL EQU FAKEADDR ;TEXT COLCRS
TINDEX EQU FAKEADDR ;TEXT INDEX
TXTMSC EQU FAKEADDR ;TEXT WINDOW MEM ADD
TXTOLD EQU FAKEADDR ;TEXT OLDROW & COL
CRETRY EQU FAKEADDR ;# COMMAND RETRIES
HOLD3 EQU FAKEADDR
SUBTMP EQU FAKEADDR
HOLD2 EQU FAKEADDR
DMASK EQU FAKEADDR ;PIXEL LOCATION MASK
TMPLBT EQU FAKEADDR
ESCFLG EQU FAKEADDR ;ESCAPE FLAG
TABMAP EQU FAKEADDR ;TAB STOP MAP
LOGMAP EQU FAKEADDR ;LINE START BIT MAP
INVFLG EQU FAKEADDR ;INVERSE VIDEO FLAG
FILFLG EQU FAKEADDR ;FILL FLAG FOR DRAW
TMPROW EQU FAKEADDR
TMPCOL EQU FAKEADDR
SCRFLG EQU FAKEADDR ;SET IF SCROLLING
HOLD4 EQU FAKEADDR ;TEMP USED BY DRAW
DRETRY EQU FAKEADDR ;# OF DEVICE RETRIES
SHFLOK EQU FAKEADDR ;SHIFT/CTL LOCK FLAG
BOTSCR EQU FAKEADDR ;BOTTOM OF SCREEN
PCOLR0 EQU FAKEADDR ;P0 COLOR
PCOLR1 EQU FAKEADDR ;P1 COLOR
PCOLR2 EQU FAKEADDR ;P2 COLOR
PCOLR3 EQU FAKEADDR ;P3 COLOR
COLOR0 EQU FAKEADDR ;COLOR 0
COLOR1 EQU FAKEADDR
COLOR2 EQU FAKEADDR
COLOR3 EQU FAKEADDR
COLOR4 EQU FAKEADDR
COLBAKS EQU COLOR4
CHBAS EQU FAKEADDR ;CHBAS REGISTER RAM
;
; COLLEEN MNEMONICS
;
; ---------------------------------------------------------------------------
POKEY EQU FAKEADDR
; ---------------------------------------------------------------------------
;
; READ
;
POT0 EQU POKEY+$00
POT1 EQU POKEY+$00
POT2 EQU POKEY+$00
POT3 EQU POKEY+$00
POT4 EQU POKEY+$00
POT5 EQU POKEY+$00
POT6 EQU POKEY+$00
POT7 EQU POKEY+$00
ALLPOT EQU POKEY+$00
KBCODE EQU POKEY+$00
; !!!!!
;RANDOM EQU POKEY+$00
;
POTGO EQU POKEY+$00
SERIN EQU POKEY+$00
IRQST EQU POKEY+$00
SKSTAT EQU POKEY+$00
;
; WRITE
;
AUDF1 EQU POKEY+$00
AUDC1 EQU POKEY+$00
AUDF2 EQU POKEY+$00
AUDC2 EQU POKEY+$00
AUDF3 EQU POKEY+$00
AUDC3 EQU POKEY+$00
AUDF4 EQU POKEY+$00
AUDC4 EQU POKEY+$00
AUDCTL EQU POKEY+$00
STIMER EQU POKEY+$00
SKRES EQU POKEY+$00
SEROUT EQU POKEY+$00
IRQEN EQU POKEY+$00
SKCTL EQU POKEY+$00
;
;
;
; ---------------------------------------------------------------------------
GTIA EQU FAKEADDR
; ---------------------------------------------------------------------------
;
; WRITE
;
HPOSP0 EQU GTIA+$00
HPOSP1 EQU GTIA+$00
HPOSP2 EQU GTIA+$00
HPOSP3 EQU GTIA+$00
HPOSM0 EQU GTIA+$00
HPOSM1 EQU GTIA+$00
HPOSM2 EQU GTIA+$00
HPOSM3 EQU GTIA+$00
SIZEP0 EQU GTIA+$00
SIZEP1 EQU GTIA+$00
SIZEP2 EQU GTIA+$00
SIZEP3 EQU GTIA+$00
SIZEM EQU GTIA+$00
GRAFP0 EQU GTIA+$00
GRAFP1 EQU GTIA+$00
GRAFP2 EQU GTIA+$00
GRAFP3 EQU GTIA+$00
GRAFM EQU GTIA+$00
COLPM0 EQU GTIA+$00
COLPM1 EQU GTIA+$00
COLPM2 EQU GTIA+$00
COLPM3 EQU GTIA+$00
COLPF0 EQU GTIA+$00
COLPF1 EQU GTIA+$00
COLPF2 EQU GTIA+$00
COLPF3 EQU GTIA+$00
COLBAK EQU GTIA+$00
PRIOR EQU GTIA+$00
VDELAY EQU GTIA+$00
GRACTL EQU GTIA+$00
HITCLR EQU GTIA+$00
CONSOL EQU GTIA+$00
;
; READ
;
M0PF EQU GTIA+$00
M1PF EQU GTIA+$00
M2PF EQU GTIA+$00
M3PF EQU GTIA+$00
P0PF EQU GTIA+$00
P1PF EQU GTIA+$00
P2PF EQU GTIA+$00
P3PF EQU GTIA+$00
M0PL EQU GTIA+$00
M1PL EQU GTIA+$00
M2PL EQU GTIA+$00
M3PL EQU GTIA+$00
P0PL EQU GTIA+$00
P1PL EQU GTIA+$00
P2PL EQU GTIA+$00
P3PL EQU GTIA+$00
TRIG0 EQU GTIA+$00
TRIG1 EQU GTIA+$00
TRIG2 EQU GTIA+$00
TRIG3 EQU GTIA+$00
PAL EQU GTIA+$00
;
;
; ---------------------------------------------------------------------------
ANTIC EQU FAKEADDR
; ---------------------------------------------------------------------------
;
DMACTL EQU ANTIC+$00
CHACTL EQU ANTIC+$00
DLPTR EQU ANTIC+$00
;DLISTH EQU ANTIC+$00
HSCROL EQU ANTIC+$00
VSCROL EQU ANTIC+$00
PMBASE EQU ANTIC+$00
CHBASE EQU ANTIC+$00
WSYNC EQU ANTIC+$00
; !!!!
VCOUNT EQU ANTIC+$00
; ----
PENH EQU ANTIC+$00
PENV EQU ANTIC+$00
NMIEN EQU ANTIC+$00
NMIRES EQU ANTIC+$00
NMIST EQU ANTIC+$00
;
;
; ---------------------------------------------------------------------------
PIA EQU FAKEADDR
; ---------------------------------------------------------------------------
;
PORTA EQU PIA+0
PORTB EQU PIA+0
PACTL EQU PIA+0
PBCTL EQU PIA+0
;
; ---------------------------------------------------------------------------
; Atari ANTIC chip display list equates
; ---------------------------------------------------------------------------
;
JUMP EQU $01 ; display list jump instruction (3 byte)
JVB EQU $41 ; display list jump and wait for vblank instruction (3)
;
SCH EQU $10 ; display list horizontal scrolling
SCV EQU $20 ; display list vertical scrolling
LMS EQU $40 ; display list load memory scan instruction (3 byte)
DLII EQU $80 ; display list interrupt instruction
;
SKIP1 EQU $00 ; display list skip 1 scan line instruction
SKIP2 EQU $10 ; display list skip 2 scan lines instruction
SKIP3 EQU $20 ; display list skip 3 scan lines instruction
SKIP4 EQU $30 ; display list skip 4 scan lines instruction
SKIP5 EQU $40 ; display list skip 5 scan lines instruction
SKIP6 EQU $50 ; display list skip 6 scan lines instruction
SKIP7 EQU $60 ; display list skip 7 scan lines instruction
SKIP8 EQU $70 ; display list skip 8 scan lines instruction
;
MODE2 EQU $02 ; display list mode 2
MODE4 EQU $04 ; display list mode 4
MODE8 EQU $08 ; display list mode 8
MODEE EQU $0E ; display list mode E
MODEF EQU $0F ; display list mode F
; ---------------------------------------------------------------------------
; KBCODEs
; ---------------------------------------------------------------------------
.enum @kbcode
_none = 255
_esc = 28
_1 = 31
_2 = 30
_3 = 26
_4 = 24
_5 = 29
_6 = 27
_7 = 51
_8 = 53
_9 = 48
_0 = 50
_lt = 54
_gt = 55
_del = 52
_tab = 44
_Q = 47
_W = 46
_E = 42
_R = 40
_T = 45
_Y = 43
_U = 11
_I = 13
_O = 8
_P = 10
_min = 14
_up = 14 ; cursor function
_eq = 15
_down = 15 ; cursor function
_ret = 12
_A = 63
_S = 62
_D = 58
_F = 56
_G = 61
_H = 57
_J = 1
_K = 5
_L = 0
_semicolon = 2
_plus = 6
_left = 6 ; cursor function
_asterisk = 7
_right = 7 ; cursor function
_caps = 60
_Z = 23
_X = 22
_C = 18
_V = 16
_B = 21
_N = 36
_M = 37
_comma = 32
_dot = 34
_slash = 38
_atari = 39
_help = 17
_F1 = 3
_F2 = 4
_F3 = 19
_F4 = 20
_space = 33
.ende
+296
View File
@@ -0,0 +1,296 @@
.macro basic_start(addr)
.word upstartEnd // link address
.word 10 // line num
.byte $9e // sys
?a=0
?b=0
?c=0
?d=0
?e=0
?v = %%addr
ift ?v>=10000
?a=?v/10000
?v=?v-(?a*10000)
eif
ift ?v>=1000
?b=?v/1000
?v=?v-(?b*1000)
eif
ift ?v>=100
?c=?v/100
?v=?v-(?c*100)
eif
ift ?v>=10
?d=?v/10
?v=?v-(?d*10)
eif
?e=?v%10
dta ?a+$30,?b+$30,?c+$30,?d+$30,?e+$30
.byte 0
upstartEnd
.word 0 // empty link signals the end of the program
.endm
//
// Switch bank in VIC-II
//
// Args:
// bank: bank number to switch to. Valid values: 0-3.
//
.macro SwitchVICBank(bank)
//
// The VIC-II chip can only access 16K bytes at a time. In order to
// have it access all of the 64K available, we have to tell it to look
// at one of four banks.
//
// This is controller by bits 0 and 1 in $dd00 (PORT A of CIA #2).
//
// +------+-------+----------+-------------------------------------+
// | BITS | BANK | STARTING | VIC-II CHIP RANGE |
// | | | LOCATION | |
// +------+-------+----------+-------------------------------------+
// | 00 | 3 | 49152 | ($C000-$FFFF)* |
// | 01 | 2 | 32768 | ($8000-$BFFF) |
// | 10 | 1 | 16384 | ($4000-$7FFF)* |
// | 11 | 0 | 0 | ($0000-$3FFF) (DEFAULT VALUE) |
// +------+-------+----------+-------------------------------------+
?bits=%11
ift (%%bank==0)
?bits=%11
eli (%%bank==1)
?bits=%10
eli (%%bank==2)
?bits=%01
eli (%%bank==3)
?bits=%00
eif
//
// Set Data Direction for CIA #2, Port A to output
//
lda $dd02
and #%11111100 // Mask the bits were interested in.
ora #$03 // Set bits 0 and 1.
sta $dd02
//
// Tell VIC-II to switch to bank
//
lda $dd00
and #%11111100
ora #?bits
sta $dd00
.endm
//
// Enter hires bitmap mode (a.k.a. standard bitmap mode)
//
.macro SetHiresBitmapMode
//
// Clear extended color mode (bit 6) and set bitmap mode (bit 5)
//
lda $d011
and #%10111111
ora #%00100000
sta $d011
//
// Clear multi color mode (bit 4)
//
lda $d016
and #%11101111
sta $d016
.endm
//
// Enter hires bitmap mode (a.k.a. standard bitmap mode)
//
.macro SetMulticolorBitmapMode
//
// Clear extended color mode (bit 6) and set bitmap mode (bit 5)
//
lda $d011
and #%10111111
ora #%00100000
sta $d011
//
// Clear multi color mode (bit 4)
//
lda $d016
ora #%00010000
sta $d016
.endm
//
// Switch location of screen memory.
//
// Args:
// address: Address relative to current VIC-II bank base address.
// Valid values: $0000-$3c00. Must be a multiple of $0400.
//
.macro SetScreenMemory(address)
//
// The most significant nibble of $D018 selects where the screen is
// located in the current VIC-II bank.
//
// +------------+-----------------------------+
// | | LOCATION* |
// | BITS +---------+-------------------+
// | | DECIMAL | HEX |
// +------------+---------+-------------------+
// | 0000XXXX | 0 | $0000 |
// | 0001XXXX | 1024 | $0400 (DEFAULT) |
// | 0010XXXX | 2048 | $0800 |
// | 0011XXXX | 3072 | $0C00 |
// | 0100XXXX | 4096 | $1000 |
// | 0101XXXX | 5120 | $1400 |
// | 0110XXXX | 6144 | $1800 |
// | 0111XXXX | 7168 | $1C00 |
// | 1000XXXX | 8192 | $2000 |
// | 1001XXXX | 9216 | $2400 |
// | 1010XXXX | 10240 | $2800 |
// | 1011XXXX | 11264 | $2C00 |
// | 1100XXXX | 12288 | $3000 |
// | 1101XXXX | 13312 | $3400 |
// | 1110XXXX | 14336 | $3800 |
// | 1111XXXX | 15360 | $3C00 |
// +------------+---------+-------------------+
//
?bits = (%%address / $0400) << 4
lda $d018
and #%00001111
ora #?bits
sta $d018
.endm
//
// Set location of bitmap.
//
// Args:
// address: Address relative to VIC-II bank address.
// Valid values: $0000 (bitmap at $0000-$1FFF)
// $2000 (bitmap at $2000-$3FFF)
//
.macro SetBitmapAddress(address)
//
// In standard bitmap mode the location of the bitmap area can
// be set to either BANK address + $0000 or BANK address + $2000
//
// By setting bit 3, we can configure which of the locations to use.
//
lda $d018
ift %%address == $0000
and #%11110111
eli %%address == $2000
ora #%00001000
eif
sta $d018
.endm
//
// Once this is done, random values appear in location $D41B (RANDOM)
//
.macro InitializeSIDrnd
LDA #$FF ; maximum frequency value
STA $D40E ; voice 3 frequency low byte
STA $D40F ; voice 3 frequency high byte
LDA #$80 ; noise waveform, gate bit off
STA $D412 ; voice 3 control register
.endm
;-------------------------------------
.MACRO rolw
ROL :1
ROL :1+1
.ENDM
;-------------------------------------
.MACRO aslw
ASL :1
ROL :1+1
.ENDM
;-------------------------------------
.MACRO rorw
ROR :1+1
ROR :1
.ENDM
;-------------------------------------
.MACRO lsrw
LSR :1+1
ROR :1
.ENDM
;-------------------------------------
.macro randomize
;usage: randomize floor ceiling
;returns (in A) a random .byte between "floor" and "ceiling"
.if :2 < :1
.error "floor higher than ceiling"
.endif
?rand
lda random
cmp #:1 ;floor
bcc ?rand
cmp #:2+1 ;ceiling
bcs ?rand
.endm
;-------------------------------------
.macro phx
txa
pha
.endm
;-------------------------------------
.macro phy
tya
pha
.endm
;-------------------------------------
.macro plx
pla
tax
.endm
;-------------------------------------
.macro ply
pla
tay
.endm
;-------------------------------------
.MACRO WAIT
; WAIT
; waits one frame (1/50 s(PAL) or 1/60s(NTSC))
?ze LDA $D012
cmp #16 ; if line<16 then wait for line>15 (long VBI protection)
bcc ?ze
sbc #10 ; last lines correction
?wa cmp $D012
bcc ?wa
?wf cmp $D012
bcs ?wf
.ENDM
;-------------------------------------
.macro halt
?s jmp ?s
.endm
+333
View File
@@ -0,0 +1,333 @@
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
.IF *>0
WeaponsListDL = 0
NamesOfLevels = 0
;----------------------------------------
; this module contains routines used in text mode
; like shop and start-up options
;----------------------------------------
;--------------------------------------------------
.proc Options
;--------------------------------------------------
; start-up screen - options, etc.
; this function returns:
; - number of players (NumberOfPlayers)
; - money each player has on the beginning of the game (moneyL i moneyH)
; - and I am sure maxwind, gravity, no_of_rounds in a game, speed of shell flight
ldx #$08
@ lda Autoplay_OptionsTable,x
sta OptionsTable,x
dex
bpl @-
rts
Autoplay_OptionsTable .by 4,4,2,2,4,1,3,2,4
.endp
.proc SelectNextGradient
lda OptionsY ; if "Wind" option selected
cmp #$03
bne NotWind
lda WindChangeInRound ; wind change after each turn (not round only) flag
eor #$1f ; '?' character
sta WindChangeInRound
rts
NotWind
ldy GradientNr
iny
cpy #$03
bne NoGradientLoop
ldy #$00
NoGradientLoop
sty GradientNr
lda GradientAddrL,y
sta GradientColors
lda GradientAddrH,y
sta GradientColors+1
rts
.endp
;-------------------------------------------
; call of the purchase (and activate) screens for each tank
.proc CallPurchaseForEveryTank
mva #0 TankNr
sta isInventory
@
ldx TankNr
lda SkillTable,x
beq ManualPurchase
jsr PurchaseAI ; remember to make ActivateAI :) !!!
jmp AfterManualPurchase
ManualPurchase
lda JoyNumber,x
sta JoystickNumber ; set joystick port for player
mva #0 isInventory
jsr Purchase ; purchase weapons
bit escFlag
spl:rts
jsr DefensivesActivate ; activate weapons
bit escFlag
spl:rts
AfterManualPurchase
inc:lda TankNr
cmp NumberOfPlayers
bne @-
rts
.endp
;--------------------------------------------------
.proc DefensivesActivate
;--------------------------------------------------
; This proc call Inventory and set Defensives activation first
mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons
mva #$ff IsInventory
mva #%10000000 WhichList
; offensive weapon - 0, defensive - %10000000
jmp Purchase.GoToActivation
.endp
;--------------------------------------------------
.proc Purchase ;
;--------------------------------------------------
; In tanknr there is a number of the tank (player)
; that is buying weapons now (from 0).
; Rest of the data is taken from appropriate tables
; and during the purchase these tables are modified.
; we are clearing list of the weapons
mva #$00 WhichList
; offensive weapon - 0, deffensive - %10000000
GoToActivation
rts
.endp
; -----------------------------------------------------
.proc EnterPlayerNames
;entering names of players
mva #0 TankNr
sta COLBAKS ; set color of background
@ tax
lda TankStatusColoursTable,x
sta COLOR2 ; set color of player name line
jsr EnterPlayerName
bit escFlag
spl:rts
jsr CheckTankCheat
inc TankNr
lda TankNr
cmp NumberOfPlayers
bne @-
rts
.endp
; -----------------------------------------------------
.proc EnterPlayerName
; in: TankNr
; Out: TanksNames, SkillTable
; this little thing is for choosing Player's skill (if computer)
; and entering his name
; If no name entered, there should be name "1st Tank", etc.
; Default tanks names are in table TanksNamesDefault
; -----------------------------------------------------
;
EndOfNick
; storing name of the player and its level
; level of the computer opponent goes to
; the table of levels (difficulties)
ldx tanknr
lda #6 ; Spoiler
sta DifficultyLevel
sta skilltable,x
beq NotRobot
lda #$03 ; shape for robotanks
sta TankShape,x
NotRobot
; storing name of the tank in the right space
; (without cursor!)
ldy #$00
txa ; ldx TankNr
asl
asl
asl ; 8 chars per name
tax ; in X where to put new name
mva #sfx_next_player sfx_effect
; check if all chars are empty (" ")
ldy #7
lda #0
@ ora #0 ; NameAdr,y
and #$7F ; remove inverse (Cursor)
dey
bpl @-
tay
beq MakeDefaultName
ldy #0
nextchar04
lda #0 ; NameAdr,y
and #$7f ; remove inverse (Cursor)
sta tanksnames,x
inx
iny
cpy #$08
bne nextchar04
rts
MakeDefaultName
nextchar05
lda tanksnamesDefault,x
sta tanksnames,x
inx
iny
cpy #$08
bne nextchar05
rts
.endp
;--------------------------------------------------
.proc displaydec5 ;decimal (word), displayposition (word)
;--------------------------------------------------
; displays decimal number as in parameters (in text mode)
; leading zeroes are removed
; the range is (00000..65565 - two bytes)
ldy #4 ; there will be 5 digits
NextDigit
ldx #16 ; 16-bit dividee so Rotate 16 times
lda #$00
Rotate000
aslw decimal
rol ; scroll dividee
; (as highest byte - additional - byte is A)
cmp #10 ; divider
bcc TooLittle000 ; if A is smaller than divider
; there is nothing to substract
sbc #10 ; divider
inc decimal ; lowest bit set to 1
; because it is 0 and this is the fastest way
TooLittle000 dex
bne Rotate000 ; and Rotate 16 times, Result will be in decimal
tax ; and the rest in A
; (and it goes to X because
; it is our decimal digit)
lda digits,x
sta decimalresult,y
dey
bpl NextDigit ; Result again /10 and we have next digit
;rightnumber
; displaying without leading zeroes (if zeroes exist then display space at this position)
ldy #0
ldx #0 ; digit flag (cut leading zeroes)
displayloop
lda decimalresult,y
cpx #0
bne noleading0
cpy #4
beq noleading0 ; if 00000 - last 0 must stay
cmp zero
bne noleading0
lda #space
beq displaychar ; space = 0 !
noleading0
inx ; set flag (no leading zeroes to cut)
displaychar
sta (displayposition),y
nexdigit
iny
cpy #5
bne displayloop
rts
.endp
;--------------------------------------------------
.proc displaybyte ;decimal (byte), displayposition (word)
;--------------------------------------------------
; displays decimal number as in parameters (in text mode)
; leading zeores are removed
; the range is (00..99 - one byte)
ldy #1 ; there will be 2 digits
NextDigit2
ldx #8 ; 8-bit dividee so Rotate 8 times
lda #$00
Rotate001
asl decimal
rol ; scroll dividee
; (as highest byte - additional - byte is A)
cmp #10 ; divider
bcc TooLittle001 ; if A is smaller than divider
; there is nothing to substract
sbc #10 ; divider
inc decimal ; because it is 0 and this is the fastest way
TooLittle001 dex
bne Rotate001 ; and Rotate 8 times, Result will be in decimal
tax ; and the rest in A
; (and it goes to X because
; it is our decimal digit)
lda digits,x
sta decimalresult,y
dey
bpl NextDigit2 ; Result again /10 and we have next digit
; now cut leading zeroes (02 goes 2)
lda decimalresult
cmp zero
bne decimalend1
lda #space
sta decimalresult
decimalend1
; displaying
ldy #1
displayloop1
lda decimalresult,y
sta (displayposition),y
dey
bpl displayloop1
rts
.endp
;-------------------------------------------------
.proc RoundOverSprites
; fill sprites with bytes
rts
.endp
;--------------------------------------------------
.proc GameOverScreen
;--------------------------------------------------
rts
.endp
;-------------------------------------------------
.proc PutTankNameOnScreen
;-------------------------------------------------
.endp
;-------------------------------------------------
.proc DisplayStatus
;-------------------------------------------------
DisplayAngle
ldx TankNr
rts
.endp
;-------------------------------------------------
.endif
+61 -30
View File
@@ -3,69 +3,96 @@
You can play using the keyboard (all functionality) or the joystick in the first port (all functionality necessary for gameplay). You can play using the keyboard (all functionality) or the joystick in the first port (all functionality necessary for gameplay).
## 1. Game Option Selection. ## 1. Game Option Selection.
![Game options screen.](images/MainMenu.png)
On the first screen, you can configure gameplay options: On the first screen, you can configure gameplay options:
* number of players (2 - 6) includes both human and computer-controlled players * number of players (2 - 6) includes both human and computer-controlled players
* the initial amount of cash of each player (2K is the optimal value we chose, but for short games, it is worth choosing a higher value) * the initial amount of cash of each player (2K is the optimal value we chose, but for short games, it is worth choosing a higher value)
* gravity * gravity
* maximum wind strength (wind is drawn at the beginning of each round, here you can choose how strong it can be) * maximum wind strength (wind is drawn at the beginning of each round or during the round between turns, here we can choose how strong it can be):
* 1B - maximum wind strength: 5
* 3B - maximum wind strength: 20
* 5B - maximum wind strength: 40
* 7B - maximum wind strength: 70
* 9B - maximum wind strength: 99
* number of rounds in a game * number of rounds in a game
* missile speed (does not affect the flight path - only changes the apparent missile speed - does not change anything in the gameplay itself) * missile speed (does not affect the flight path - only changes the apparent missile speed - does not change anything in the gameplay itself)
* frequency of suicides :) - if for a number of turns the game has not recorded hits (tanks are constantly shooting inaccurately), after one of such misses a tank commits suicide - here you determine how long they can "shooting for the stars" :) - if only people play the optimal setting is "norm", in the case of computer-controlled players ... you choose. * frequency of suicides :) - if for a number of turns the game has not recorded hits (tanks are constantly shooting inaccurately), after one of such misses a tank commits suicide - here you determine how long they can "shooting for the stars" :) - if only people play the optimal setting is "norm", in the case of computer-controlled players ... you choose.
* The height (and undulation) of the mountains from almost flat (NL - Kingdom of the Netherlands), to soaring and high (NP - Federal Democratic Republic of Nepal) * The height (and undulation) of the mountains from almost flat (NL - Kingdom of the Netherlands), to soaring and high (NP - Federal Democratic Republic of Nepal)
* the way the walls (edges of the screen) work: * the way the walls (edges of the screen) work:
* none - projectiles that flew off the screen do not return * none - projectiles that flew off the screen do not return (black color of the screen frame)
* wrap - the screen "wraps" and projectiles that flew to the right appear on the left side (and vice versa) * wrap - the screen "wraps" and projectiles that flew to the right appear on the left side and vice versa (purple color of the screen frame)
* bump - the right and left walls deflect projectiles that want to fly through them * bump - the right and left walls deflect projectiles that want to fly through them (dark blue color of the screen frame)
* boxy - just like bump, except that the "ceiling" also reflects projectiles * boxy - just like bump, except that the "ceiling" also reflects projectiles (green color of the screen frame)
* rand - at the beginning of each round, one of the above 4 ways the walls work is drawn. * rand - at the beginning of each round, one of the above 4 ways the walls work is drawn.
During gameplay, the current mode of the walls is represented by the color of the screen frame: none - black, wrap - purple, bump - blue, boxy - green. During gameplay, the current mode of the walls is represented by the color of the screen frame: none - black, wrap - purple, bump - dark blue, boxy - green.
Select options with cursor keys or a joystick. Select options with cursor keys or a joystick.
The [TAB] or [SELECT] key, and on the Atari 5200 console, the [5] controller key change the color of the mountains (3 versions to choose from) or (if the cursor indicates the wind strength selection option "Wind") change the way the wind strength is drawn from "every round" to "every turn" and vice versa. Drawing every turn is indicated by the "?" sign next to the word "Wind".
The [RETURN] key or a joystick button moves to the next screen. The [RETURN] key or a joystick button moves to the next screen.
## 2. Entering the name of players and selecting the level of computer-controlled players ## 2. Entering the name of players and selecting the level of computer-controlled players
![Name of players and game level screen.](images/DiffMenu.png)
The second screen is shown for each player. Here you can use the cursor keys or joystick to select whether the tank will be driven by a human (HUMAN option) or a computer (other options). At the same time, you can enter the name of the selected player from the keyboard. The second screen is shown for each player. Here you can use the cursor keys or joystick to select whether the tank will be driven by a human (HUMAN option) or a computer (other options).
The [TAB] or [SELECT] key, and on the Atari 5200 console the [5] controller key allow you to choose which joystick port the player will use.
The [INVERSE] or [OPTION] key allows you to select one of the 3 available tank shapes. On the Atari 5200 console, this is achieved by cycling through joystick ports with the [5] key.
At the same time, you can enter the name of the selected player from the keyboard.
When the [RETURN] key is pressed or the Joystick button is pressed briefly, the screen switches to the next player until the difficulty levels for each player are selected. When the [RETURN] key is pressed or the Joystick button is pressed briefly, the screen switches to the next player until the difficulty levels for each player are selected.
The player's name can also be entered with the joystick. After pressing and holding the button for more than 1s. you can use up/down movements to change the letter being entered, and left/right movements to change its position in the name. Releasing the button ends the name entry and returns to the level selection. The player's name can also be entered with the joystick. After pressing and holding the button for more than 1s. you can use up/down movements to change the letter being entered, and left/right movements to change its position in the name. Releasing the button ends the name entry and returns to the level selection.
If the name is not entered, it will be supplemented with the default name. If the name is not entered, it will be supplemented with the default name.
## 3. Shopping screen (before each round) ## 3. Shopping screen (before each round)
![Shopping offensives screen.](images/PurOffensive.png)
![Shopping defensives screen.](images/PurDefensive.png)
On this screen, you can make purchases of offensive and defensive weapons. Only those weapons that the player can afford are visible, along with information about the price and the number of units of a given weapon that will be obtained for that price. The information on the screen probably needs no more description. You move through the lists with the cursor keys (up and down) or with the joystick, the [TAB] key or the left arrow or the left joystick tilt change the screen to defensive or offensive weapons, the [SPACE] key or the right arrow and also the joystick to the right does the purchase of the indicated weapon. On this screen, you can make purchases of offensive and defensive weapons. Only those weapons that the player can afford are visible, along with information about the price and the number of units of a given weapon that will be obtained for that price. The information on the screen probably needs no more description. You move through the lists with the cursor keys (up and down) or with the joystick, the [TAB] key or the left arrow or the left joystick tilt change the screen to defensive or offensive weapons, the [SPACE] key or the right arrow and also the joystick to the right does the purchase of the indicated weapon.
The [RETURN] key or the joystick button press switches to the defensive weapon activation screen. Here you can activate previously bought defensive (or offensive after switching with [TAB], etc) weapons. This makes it possible to activate shields and others before the round starts. The [RETURN] key or the joystick button press switches to the defensive weapon activation screen. Here you can activate previously bought defensive (or offensive after switching with [TAB], etc) weapons.
![Defensives activation screen.](images/ActDefensive.png)
This makes it possible to activate shields and others before the round starts.
Another [RETURN] key or joystick button press switches to the next player's shopping screen. Another [RETURN] key or joystick button press switches to the next player's shopping screen.
(For computer players this screen is not shown.) (For computer players this screen is not shown.)
## 4. The main screen of the game ## 4. The main screen of the game
![Main game screen.](images/StatusLine.png)
The status line shows which player is currently allowed to take a shot and a set of other information: The status line shows which player is currently allowed to take a shot and a set of other information:
* player's tank name, * player's tank name,
* currently selected offensive weapon, * active joystick number or difficulty level of computer-controlled player (1-**Moron** - 8-**Unknown**),
* currently selected offensive weapon (symbol quantity and name),
* the player's remaining energy points and if he has an active defensive weapon that has its energy - in parentheses the energy level, * the player's remaining energy points and if he has an active defensive weapon that has its energy - in parentheses the energy level,
* the angle and the direction of the barrel set by the player, * the angle and the direction of the barrel set by the player,
* the shot strength set by the player (the maximum shot strength is limited by the player's energy - it can not exceed the energy * 10 . This means that you can fire weaker shots only when having a small amount of energy, * the shot strength set by the player (the maximum shot strength is limited by the player's energy - it can not exceed the energy * 10 . This means that you can fire weaker shots only when having a small amount of energy,
* the current round number, * the current round number,
* wind speed and direction, * wind speed and direction,
* "computer" symbol if **Auto Defense** is active,
* in parentheses is the name of the active defensive weapon - if there is any activated by the player. * in parentheses is the name of the active defensive weapon - if there is any activated by the player.
The keyboard controls here are simple, cursor keys or joystick: left/right - change the angle of the barrel, up/down - change the the force of the shot. The keyboard controls here are simple, cursor keys or joystick: left/right - change the angle of the barrel, up/down - change the the force of the shot.
* [SPACE] or joystick button pressed briefly - firing a shot.
* [TAB] or [SELECT] - selection of offensive weapons (this option is not available directly with the joystick - you need to select Inventory). | A800 | 5200 | function |
* [I] or longer holding the joystick button - go to Inventory. It is a screen (actually two) with the same layout as the shopping menu, it also works similarly except that here you don't buy weapons, but choose one of the offensive ones to shoot or activate a defensive weapon. | --- | --- | --- |
* [A] or [OPTION] - go directly to the defensive weapons activation. | [SPACE] | [0] | or joystick button pressed briefly - firing a shot. |
* [M] key - disable/enable background music. | [TAB] or [SELECT] | [5] | selection of offensive weapons (this option is not available directly with the joystick - you need to select Inventory). |
* [S] key - disable/enable effect sounds. | [I] | [9] | or longer holding the joystick button - go to Inventory. It is a screen (actually two) with the same layout as the shopping menu, it also works similarly except that here you don't buy weapons, but choose one of the offensive ones to shoot or activate a defensive weapon. |
* [START] - speed up some game animations. | [A] or [OPTION] | [7] | go directly to the defensive weapons activation.
* [O] - end the current game and jump to the Game Over screen with a summary. The summary of the results does not take into account the current round of the game, but only the rounds completed earlier. This corresponds to pressing the [ESC] key with the difference that the summary and credits are displayed. | [M] | [PAUSE] | disable/enable background music. |
* [START] + [OPTION] - immediately force the end of the game (Game Over), just like [O] but without confirmation. | [S] | [RESET] | disable/enable effect sounds. |
* [ESC] - during the entire game at any time (unless the computer is playing, then sometimes you have to wait a while) you can press the [ESC] key, which allows you to abort the game and return to the beginning (of course, there is protection against accidental pressing). | [START] | N/A | speed up some game animations. |
| [O] | [3] | end the current game and jump to the Game Over screen with a summary. The summary of the results does not take into account the current round of the game, but only the rounds completed earlier. This corresponds to pressing the [ESC] key with the difference that the summary and credits are displayed. |
| [START] + [OPTION] | N/A | immediately force the end of the game (Game Over), just like [O] but without confirmation.
| [G] | N/A | changes the mountain shading |
| [ESC] | [*] | during the entire game at any time (unless the computer is playing, then sometimes you have to wait a while) you can press the [ESC] key, which allows you to abort the game and return to the beginning (of course, there is protection against accidental pressing). |
| [Y] | [1] | when asked to abort or terminate the game - confirmation |
| [CTRL] + [HELP] | N/A | Toggle "visual debug" mode. It displays distances measured, laser aiming, and aiming technique. It leaves a mess on the screen, but it does not impair the game, just makes it a bit harder. |
## 5. Game mechanics - offensive weapons ## 5. Game mechanics - offensive weapons
@@ -73,15 +100,15 @@ The keyboard controls here are simple, cursor keys or joystick: left/right - cha
- At the beginning of each round, each tank has 99 ash units of energy. - At the beginning of each round, each tank has 99 ash units of energy.
- Tanks' energy is depleted in 3 ways: - Tanks' energy is depleted in 3 ways:
* one unit after each shot is fired * one unit after each shot is fired
* while falling (one pixel down 2 units). * while falling (one pixel down - 2 units).
* when a projectile hits the tank or next to it - and here the amount of energy subtracted depends on the distance from the center of the explosion and the type/power of the projectile. * when a projectile hits the tank or next to it - and here the amount of energy subtracted depends on the distance from the center of the explosion and the type/power of the projectile.
### How energy subtraction works (and earning money!). ### How energy subtraction works (and earning money!).
After each round the amount of money gained/lost is calculated this is done on the basis of two variables accumulated by each tank during the round. These variables are: After each round the amount of money gained/lost is calculated, this is done on the basis of two variables accumulated by each tank during the round. These variables are:
`gain` - energy "captured" from tanks hit (also if you hit yourself :) and here's the catch, if you have very little energy left it can be profitable to hit yourself with a powerful weapon! `gain` - energy "captured" from tanks hit (also if you hit yourself :) and here's the catch, if you have very little energy left it can be profitable to hit yourself with a powerful weapon!
`lose` - energy lost due to explosion/fall (and here it is important to count the total loss of energy even if the tank has less at the moment of hit). `lose` - energy lost due to explosion/fall (and here it is important - to count the total loss of energy even if the tank has less at the moment of hit).
In addition, the tank that won the round has a parameter gain (captured from hit tanks energy) increased by the remaining energy at the end of the round (because it did not die and should have it - although it also happens otherwise :) ) In addition, the tank that won the round has a parameter gain (captured from hit tanks energy) increased by the remaining energy at the end of the round (because it did not die and should have it - although it also happens otherwise :) )
@@ -125,7 +152,7 @@ And here are the values of maximum energy loss for individual weapons. If a weap
| Missile | 136 | | Missile | 136 |
| Baby Nuke | 200 | | Baby Nuke | 200 |
| Nuke | 240 | | Nuke | 240 |
| LeapFrog| 136 120 104 | | LeapFrog| 136 112 112 |
| Funky Bomb | 168 88 (* 5) | | Funky Bomb | 168 88 (* 5) |
| MIRV | 136 (* 5) | | MIRV | 136 (* 5) |
| Death's Head | 240 (* 5) | | Death's Head | 240 (* 5) |
@@ -135,7 +162,7 @@ And here are the values of maximum energy loss for individual weapons. If a weap
| Roller | 168 | | Roller | 168 |
| Heavy Roller | 240 | | Heavy Roller | 240 |
| Riot Charge | 0 (no energy is subtracted, but a portion of the ground upward from the hit point in a 31-pixel radius is removed) | | Riot Charge | 0 (no energy is subtracted, but a portion of the ground upward from the hit point in a 31-pixel radius is removed) |
| Riot Blast | 0 (as in Dirt Charge, but in a radius of 61 pixels) | | Riot Blast | 0 (as in Riot Charge, but in a radius of 61 pixels) |
| Riot Bomb | 0 (no energy is subtracted, but the ground in a radius of 17 pixels from the hit point is destroyed - as in the case of Missile. The weapon is useful for digging out after being buried, or for undermining an opponent) | | Riot Bomb | 0 (no energy is subtracted, but the ground in a radius of 17 pixels from the hit point is destroyed - as in the case of Missile. The weapon is useful for digging out after being buried, or for undermining an opponent) |
| Heavy Riot Bomb | 0 (as in Riot Bomb, but the explosion radius is 29 pixels from the point of impact - as in the case of Nuke) | | Heavy Riot Bomb | 0 (as in Riot Bomb, but the explosion radius is 29 pixels from the point of impact - as in the case of Nuke) |
| Baby Digger | 0 (no energy is subtracted, but a portion of the ground is undermined in a radius of 60 pixels from the point of impact) | | Baby Digger | 0 (no energy is subtracted, but a portion of the ground is undermined in a radius of 60 pixels from the point of impact) |
@@ -156,7 +183,7 @@ Only these points determine the order in the summary
## 6. And now for defensive weapons: ## 6. And now for defensive weapons:
* **White Flag** - causes the surrender of the player (can sometimes be useful in a hopeless situation). The advantage is that by surrendering you don't give a big point to your opponents and don't cause one of them to gain by killing us, you also limit the loss of your energy and also cash. An important note - this is the only defensive weapon that can be deactivated. All you have to do is re-enter inventory and once again select its activation. * **White Flag** - causes the surrender of the player (can sometimes be useful in a hopeless situation). The advantage is that by surrendering you don't give a big point to your opponents and don't cause one of them to gain by killing us, you also limit the loss of your energy and also cash. An important note - this is the only defensive weapon that can be deactivated. All you have to do is re-enter inventory and once again select its activation.
* **Battery** - when activated, it recharges the tank's energy to full (99 units) and at the same time is the only defensive weapon that does not deactivate other defensive weapons when used. * **Battery** - when activated, it recharges the tank's energy to full (99 units). It is one of three defensive weapons that does not deactivate other defensive weapons when used.
* **Hovercraft** - a weapon that allows the tank to move. It has its own fuel supply in form of electric eels and in addition, it can be activated multiple times during the same turn, and after using it, you can activate another defensive weapon and fire a shot in the same turn. After using it, the tank rises above the mountains and using the cursor keys or a joystick you can move the tank to a new position. [SPACE] or the joystick button cause the tank to land in a new place. You can fly until the tank runs out of eels (presented on the status bar like the energy of a defensive weapon), if the eel fuel runs out the tank will fall down on its own. It is not possible to land on other tanks. * **Hovercraft** - a weapon that allows the tank to move. It has its own fuel supply in form of electric eels and in addition, it can be activated multiple times during the same turn, and after using it, you can activate another defensive weapon and fire a shot in the same turn. After using it, the tank rises above the mountains and using the cursor keys or a joystick you can move the tank to a new position. [SPACE] or the joystick button cause the tank to land in a new place. You can fly until the tank runs out of eels (presented on the status bar like the energy of a defensive weapon), if the eel fuel runs out the tank will fall down on its own. It is not possible to land on other tanks.
* **Parachute** - does not protect against loss of energy due to a neighboring explosion, makes you not lose energy during ONE fall. After such a fall, it deactivates and a new parachute must be activated. * **Parachute** - does not protect against loss of energy due to a neighboring explosion, makes you not lose energy during ONE fall. After such a fall, it deactivates and a new parachute must be activated.
* **Shield** - the simplest shield works exactly the opposite of **Parachute**, it does not protect against energy loss while falling, instead it protects against energy loss caused by ONE adjacent explosion. It protects once, no matter how strong the explosion is (whether tis but a scratch or a direct hit with a nuke), and deactivates immediately afterward. * **Shield** - the simplest shield works exactly the opposite of **Parachute**, it does not protect against energy loss while falling, instead it protects against energy loss caused by ONE adjacent explosion. It protects once, no matter how strong the explosion is (whether tis but a scratch or a direct hit with a nuke), and deactivates immediately afterward.
@@ -166,8 +193,12 @@ Only these points determine the order in the summary
* **Mag Deflector** - the second passive-aggressive weapon :) . In case of a direct hit on a tank (and shield), it causes the hit point to move randomly to the left or right side of the protected tank, but not very far, so you can get "shrapnel" with stronger weapons. As in the case of **Bouncy Castle**, it is also a shield that corresponds to the action of **Heavy Shield** and has 99 units at the start (probably here we will have also to rethink this value and give a smaller one). * **Mag Deflector** - the second passive-aggressive weapon :) . In case of a direct hit on a tank (and shield), it causes the hit point to move randomly to the left or right side of the protected tank, but not very far, so you can get "shrapnel" with stronger weapons. As in the case of **Bouncy Castle**, it is also a shield that corresponds to the action of **Heavy Shield** and has 99 units at the start (probably here we will have also to rethink this value and give a smaller one).
* **Nuclear Winter** - adds nothing, takes nothing away :) - in fact, it is not so much a defensive weapon as a double-edged one. It floods the area with "radioactive" fallout, which is ordinary soil. If you do not have at hand any weapon that digs up the terrain, and for that a shield (preferably disposable), then after such "fallout" you will have to shoot yourself - because being underground is otherwise impossible. Alternatively, **White Flag** always remains. * **Nuclear Winter** - adds nothing, takes nothing away :) - in fact, it is not so much a defensive weapon as a double-edged one. It floods the area with "radioactive" fallout, which is ordinary soil. If you do not have at hand any weapon that digs up the terrain, and for that a shield (preferably disposable), then after such "fallout" you will have to shoot yourself - because being underground is otherwise impossible. Alternatively, **White Flag** always remains.
* **Long Schlong** - a special weapon :) - Costs a lot, doesn't really help with anything (except possibly digging yourself out but only when slightly buried but it has a cool name and looks cool :) - It can be activated independently of other defensive weapons and remains active until the end of the round (it cannot be deactivated). * **Long Schlong** - a special weapon :) - Costs a lot, doesn't really help with anything (except possibly digging yourself out but only when slightly buried but it has a cool name and looks cool :) - It can be activated independently of other defensive weapons and remains active until the end of the round (it cannot be deactivated).
* **Lazy Boy** - it is not actually a defensive weapon. It is an aiming aid. When it is activated, the tank tries to aim at the nearest enemy and automatically adjusts the power of the shot and angle. If it has too little energy, it can sometimes aim wrong (it uses a method like **Cyborg** to aim). Like **Battery**, it does not deactivate other defensive weapons when used. Note: There is no point in activating this weapon before the round, targeting will not take place because there is nothing to target yet.
* **Lazy Darwin** - works just like **Lazy Boy** but targets the weakest opponent. In this weapon, after automatic targeting, "visual targeting" remains active, so you can easily change the target and independently select another opponent by seeing if you hit him.
* **Auto Defense** - activates the mode of automatic activation of defensive weapons. After its activation, the tank automatically activates the strongest shield it has (consuming it, of course) at any time when there is no shield (also between shots of other players). At the same time, if the tank's energy level drops below 30 units, it automatically activates **Battery** if it has it. This weapon remains active until the end of the round and is indicated by the "computer" symbol before the name of the active defensive weapon in the status line. It is the second defensive weapon that does not deactivate other defensive weapons when used.
* **Spy Hard** - Help for the forgetful :) . When activated, it shows a preview of information about the next opponents one by one. Left/Right - changes the "spied" tank. Fire/Space/Return/Esc - ends the "spying". This is the last defensive weapon, which does not deactivate other defensive weapons when used.
Due to the different operations of **MIRV**, defensive weapons **Bouncy Castle** and **Mag Deflector** only use the shielding function when hit by these weapons. In addition, **MIRV** heads do not bounce or fly through sidewalls during descent! Due to the different warhead tracking system of **MIRV** weapons, the **Bouncy Castle** and **Mag Deflector** defensive weapons only use the shielding function when hit by these weapons. In addition, **MIRV** warheads do not bounce or fly through sidewalls when falling!
None of the shields protect against **Napalm**. **Bouncy Castle** or **Mag Deflector** on a direct hit will deflect it or carry it past, but just hit very close to a tank and its shield will not save it. None of the shields protect against **Napalm**. **Bouncy Castle** or **Mag Deflector** on a direct hit will deflect it or carry it past, but just hit very close to a tank and its shield will not save it.
@@ -179,7 +210,7 @@ And of course, activating a weapon when you already have some other weapon activ
## 7. "Other" weapons: ## 7. "Other" weapons:
* **Buy me!** - this is a 'loot box', not a weapon per se. Buying it draws one of the offensive or (rarely) defensive weapons and adds it to the player's arsenal. It is a lottery in which you can lose (if you draw a weapon cheaper than the **Buy Me!** price) but also gain. You can get a weapon otherwise not affordable at all! * **Best F...g Gifts** - this is a 'loot box', not a weapon per se. Buying it draws one of the offensive or (rarely) defensive weapons and adds it to the player's arsenal. It is a lottery in which you can lose (if you draw a weapon cheaper than the **Best F...g Gifts** price) but also gain. You can get a weapon otherwise not affordable at all! There is a small probability of drawing by **Best F...g Gifts** itself :). You can then try to use it in battle.
## 8. difficulty levels of computer-controlled opponents: ## 8. difficulty levels of computer-controlled opponents:
@@ -191,13 +222,13 @@ The game has 8 difficulty levels of computer-controlled opponents. Or actually 7
* **Poolshark** - When attacking, he sets the nearest tank as his target, then selects the angle of the shot, and tries to select its strength by drawing it from the selected range. He always shoots with the best weapon he has. He uses defensive weapons. With a probability of 1:3, he activates the best defensive weapon he owns (the highest on the list of weapons he owns - that is, not necessarily the best) before firing. If his energy level drops below 30 units - he uses **Battery** (of course, if he bought it before), if the energy drops below 5 and he has no **Battery** he surrenders - **White Flag**. At the beginning of the round he makes 1 attemp to buy defensive weapons and 6 offensive weapons. * **Poolshark** - When attacking, he sets the nearest tank as his target, then selects the angle of the shot, and tries to select its strength by drawing it from the selected range. He always shoots with the best weapon he has. He uses defensive weapons. With a probability of 1:3, he activates the best defensive weapon he owns (the highest on the list of weapons he owns - that is, not necessarily the best) before firing. If his energy level drops below 30 units - he uses **Battery** (of course, if he bought it before), if the energy drops below 5 and he has no **Battery** he surrenders - **White Flag**. At the beginning of the round he makes 1 attemp to buy defensive weapons and 6 offensive weapons.
** **Tosser** - When attacking, he acts exactly like **Poolshark** however, he may have a "better" weapon inventory due to a different purchase tactic. He always activates the best defensive weapon he has before shooting. And just like **Poolshark** he uses **Battery** and **White Flag**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/5100) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/1250) attempts to buy offensive weapons. * **Tosser** - When attacking, he acts exactly like **Poolshark** however, he may have a "better" weapon inventory due to a different purchase tactic. He always activates the best defensive weapon he has before shooting. And just like **Poolshark** he uses **Battery** and **White Flag**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/5100) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/1250) attempts to buy offensive weapons.
** **Chooser** - Takes as a target the weakest opponent (with the least amount of energy) and aims very precisely, but before the shot the energy of the shot is modified by the parameter of luck :) , that is, despite the precise aiming it does not always hit. He shoots with the best weapon he has unless the target is close. Then he changes his weapon to **Baby Missile** to avoid hitting himself. He always activates the best defensive weapon he has before shooting and, like **Poolshark**, uses **Battery** and **White Flag**. He purchases just like **Tosser**. * **Chooser** - Takes as a target the weakest opponent (with the least amount of energy) and aims very precisely, but before the shot the energy of the shot is modified by the parameter of luck :) , that is, despite the precise aiming it does not always hit. He shoots with the best weapon he has unless the target is close. Then he changes his weapon to **Baby Missile** to avoid hitting himself. He always activates the best defensive weapon he has before shooting and, like **Poolshark**, uses **Battery** and **White Flag**. He purchases just like **Tosser**.
* **Spoiler** - He shoots exactly like **Chooser** except that he has more luck :) , which means that even if he doesn't hit the target of his choice, it can be a more precise shot than **Chooser**. He uses defensive weapons exactly like **Chooser**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/5100) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/320) attempts to buy offensive weapons. When buying defensive weapons, he buys only strong and precise weapons - that is, weapons that won't accidentally hurt him. * **Spoiler** - He shoots exactly like **Chooser** except that he has more luck :) , which means that even if he doesn't hit the target of his choice, it can be a more precise shot than **Chooser**. He uses defensive weapons exactly like **Chooser**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/5100) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/320) attempts to buy offensive weapons. When buying defensive weapons, he buys only strong and precise weapons - that is, weapons that won't accidentally hurt him.
** **Cyborg** - Takes aim at the weakest opponent (with the least amount of energy) but prefers human-controlled opponents. Aims very accurately and in the vast majority of cases hits on the first shot. He fires the shot with the best weapon he has unless the target is close. Then he changes his weapon to **Baby Missile** to avoid hitting himself. He uses defensive weapons exactly like **Chooser**. He shops exactly like **Spoiler**. * **Cyborg** - Takes aim at the weakest opponent (with the least amount of energy) but prefers human-controlled opponents. Aims very accurately and in the vast majority of cases hits on the first shot. He fires the shot with the best weapon he has unless the target is close. Then he changes his weapon to **Baby Missile** to avoid hitting himself. He uses defensive weapons exactly like **Chooser**. He shops exactly like **Spoiler**.
* **Unknown** - Before firing each shot, he randomly chooses a course of action from **Poolshark** to **Cyborg** and applies his tactics. However, the tactics of weapon purchases are always identical to **Tosser**. * **Unknown** - Before firing each shot, he randomly chooses a course of action from **Poolshark** to **Cyborg** and applies his tactics. However, the tactics of weapon purchases are always identical to **Tosser**.
+75 -44
View File
@@ -3,84 +3,112 @@
Grać można przy użyciu klawiatury (wszystkie funkcjonalności) lub joysticka (wszystkie funkcjonalności niezbędne w rozgrywce). Grać można przy użyciu klawiatury (wszystkie funkcjonalności) lub joysticka (wszystkie funkcjonalności niezbędne w rozgrywce).
## 1. Wybór opcji gry. ## 1. Wybór opcji gry.
Na pierwszym ekranie możemy skonfigurować opcje rozgrywwki: ![Ekran wyboru opcji gry.](images/MainMenu.png)
Na pierwszym ekranie możemy skonfigurować opcje rozgrywki:
* ilość graczy (2 - 6) obejmuje tak ludzi jak graczy sterowanych przez komputer * ilość graczy (2 - 6) obejmuje tak ludzi jak graczy sterowanych przez komputer
* początkową ilość gotówki każdego z graczy (8k to wybrana przez nas wartość optymalna, jecz przy krótkich rozgrywkach warto wybrać większą wartość) * początkową ilość gotówki każdego z graczy (8k to wybrana przez nas wartość optymalna, lecz przy krótkich rozgrywkach warto wybrać większą wartość)
* grawitacja * grawitacja
* maksymalna siła wiatru (wiatr jest losowany na początku każdej z rund, tu możemy wybrać jak silny może być) * maksymalna siła wiatru (wiatr jest losowany na początku każdej z rund lub w czasie rundy pomiędzy turami, tu możemy wybrać jak silny może być):
* 1B - maksymalna siła wiatru: 5
* 3B - maksymalna siła wiatru: 20
* 5B - maksymalna siła wiatru: 40
* 7B - maksymalna siła wiatru: 70
* 9B - maksymalna siła wiatru: 99
* liczba rozgrywanych rund * liczba rozgrywanych rund
* szybkość lotu pocisków (nie ma wpływu na tor lotu - zmienia jedynie widoczną prędkość rysowania - nie zmienia nic w samej rozgrywce) * szybkość lotu pocisków (nie ma wpływu na tor lotu - zmienia jedynie widoczną prędkość rysowania - nie zmienia nic w samej rozgrywce)
* częstotliwość samobójstw :) - jeśli przez ileś tur gra nie odnotowała trafień (czołgi ciągle strzelają niecelnie) jeden z takich pudłujących czołgów popełnia samobójstwo - tu określamy jak długo mogą “strzelać w próżnię” :) - jeśli grają tylko ludzie optymalne ustawienie to “norm”, w przypadku graczy sterowanych przez komputer… wedle uznania. * częstotliwość samobójstw :) - jeśli przez ileś tur gra nie odnotowała trafień (czołgi ciągle strzelają niecelnie) jeden z takich pudłujących czołgów popełnia samobójstwo - tu określamy jak długo mogą “strzelać w próżnię” :) - jeśli grają tylko ludzie optymalne ustawienie to “norm”, w przypadku graczy sterowanych przez komputer… wedle uznania.
* wysokość (i pofałdowanie) gór od prawie płaskich (NL - Królestwo Niderlandów), do strzelistych i wysokich (NP - Federalna Demokratyczna Republika Nepalu) * wysokość (i pofałdowanie) gór od prawie płaskich (NL - Królestwo Niderlandów), do strzelistych i wysokich (NP - Federalna Demokratyczna Republika Nepalu)
* sposób działania ścian (krawędzi ekranu): * sposób działania ścian (krawędzi ekranu):
* none - pociski, które wyleciały poza ekran nie wracają * none - pociski, które wyleciały poza ekran nie wracają (czarny kolor ramki ekranu)
* wrap - ekran "zawija się" i pociski, które wyleciały w prawo pojawiają się z lewej strony (i odwrotnie) * wrap - ekran "zawija się" i pociski, które wyleciały w prawo pojawiają się z lewej strony i odwrotnie (fioletowy kolor ramki ekranu)
* bump - prawa i lewa ściana odbijają pociski, które chcą przez nie przelecieć * bump - prawa i lewa ściana odbijają pociski, które chcą przez nie przelecieć (granatowy kolor ramki ekranu)
* boxy - tak jak bump, tyle że "sufit" także odbija pociski * boxy - tak jak bump, tyle że "sufit" także odbija pociski (zielony kolor ramki ekranu)
* rand - na początku każdej rundy losowany jest jeden z 4 powyższych sposobów działania ścian * rand - na początku każdej rundy losowany jest jeden z 4 powyższych sposobów działania ścian
W trakcie rozgrywki aktualny sposób działania ścian reprezentowany jest przez kolor ramki ekranu: none - czarny, wrap - fioletowy, bump - niebieski, boxy - zielony. W trakcie rozgrywki aktualny sposób działania ścian reprezentowany jest przez kolor ramki ekranu: none - czarny, wrap - fioletowy, bump - granatowy, boxy - zielony.
Wybór opcji klawiszami kursora lub joystickiem. Wybór opcji klawiszami kursora lub joystickiem.
Klawisz [TAB] lub [SELECT], a na konsoli Atari 5200 klawisz [5] kontrolera zmieniają kolor gór (3 wersje do wyboru) lub (jeśli kursor wskazuje opcję wyboru siły wiatru "Wind") zmieniają sposób losowania siły wiatru z "co rundę" na "co turę" i odwrotnie. Losowanie co turę jest sygnalizowane znakiem "?" przy słowie "Wind".
Klawisz [RETURN] lub przycisk Joysticka przechodzi do następnego ekranu. Klawisz [RETURN] lub przycisk Joysticka przechodzi do następnego ekranu.
## 2. Wprowadzanie nazwy graczy i wybór poziomu graczy sterowanych przez komputer ## 2. Wprowadzanie nazwy graczy i wybór poziomu graczy sterowanych przez komputer
Drugi ekran powtarza się dla każdego z graczy można na nim klawiszami kursora lub joysticjiem wybrać czy danym czołgiem będzie kierował człowiek (opcja HUMAN) czy też kompute (pozostałe opcje). Jednocześnie z klawiatury można wprowadzić nazwę wybranego gracza. ![Ekran wyboru graczy i poziomu trudności.](images/DiffMenu.png)
Po naciśnięciu klawisza [RETURN] lub krótkim naciśnięciu przycisku Joysticka ekran przechodzi na następnego gracza aż zostaną wybrane poziomy trudności dla każdego z nich.
Drugi ekran powtarza się dla każdego z graczy można na nim klawiszami kursora lub joystickiem wybrać czy danym czołgiem będzie kierował człowiek (opcja HUMAN) czy też komputer (pozostałe opcje).
Klawisz [TAB] lub [SELECT], a na konsoli Atari 5200 klawisz [5] kontrolera pozwalają wybrać z którego portu joysticka będzie korzystał gracz.
Klawisz [INVERSE] lub [OPTION] umożliwiają wybór jednego z 3 dostępnych kształtów czołgów. Na konsoli Atari 5200 uzyskuje się to poprzez cykliczne wybieranie kolejnych portów joysticka klawiszem [5].
Jednocześnie z klawiatury można wprowadzić nazwę wybranego gracza.
Po naciśnięciu klawisza [RETURN] lub krótkim naciśnięciu przycisku Joysticka ekran przechodzi na następnego gracza aż zostaną wybrane poziomy trudności dla wszystkich.
Nazwę gracza można wprowadzać także przy pomocy joysticka. Po wciśnięciu i przytrzymaniu przycisku ponad 1s. za pomocą ruchów góra/dół można zmienić wprowadzaną literę, a lewo/prawo jej pozycję w nazwie. Puszczenie przycisku kończy wprowadzanie nazwy i wraca do wyboru poziomu. Nazwę gracza można wprowadzać także przy pomocy joysticka. Po wciśnięciu i przytrzymaniu przycisku ponad 1s. za pomocą ruchów góra/dół można zmienić wprowadzaną literę, a lewo/prawo jej pozycję w nazwie. Puszczenie przycisku kończy wprowadzanie nazwy i wraca do wyboru poziomu.
Jeśli nazwa nie zostanie wpisana, to zostanie uzupełniona nazwą domyślną. Jeśli nazwa nie zostanie wpisana, to zostanie uzupełniona nazwą domyślną.
## 3. Ekran zakupów (przed każdą rundą) ## 3. Ekran zakupów (przed każdą rundą)
![Ekran zakupów broni ofensywnych.](images/PurOffensive.png)
![Ekran zakupów broni defensywnych.](images/PurDefensive.png)
Na tym ekranie można dokonywać zakupów broni ofensywnych i defensywnych. Widoczne są tylko te bronie na które gracza stać wraz z informacją o cenie i ilości jednostek danej broni, którą za ten cenę otrzymamy. Informacje na ekranie nie wymagają chyba więcej opisu. Po listach poruszamy się klawiszami kursora (góra i dół) lub joystickiem, klawisz [TAB] lub strzałka w lewo czy też ruch joystickiem w lewo zmieniają ekran na bronie defensywne lub ofensywne, klawisz [SPACJA] lub strzałka w prawo a także joystick w prawo realizują zakup wskazanej broni. Na tym ekranie można dokonywać zakupów broni ofensywnych i defensywnych. Widoczne są tylko te bronie na które gracza stać wraz z informacją o cenie i ilości jednostek danej broni, którą za ten cenę otrzymamy. Informacje na ekranie nie wymagają chyba więcej opisu. Po listach poruszamy się klawiszami kursora (góra i dół) lub joystickiem, klawisz [TAB] lub strzałka w lewo czy też ruch joystickiem w lewo zmieniają ekran na bronie defensywne lub ofensywne, klawisz [SPACJA] lub strzałka w prawo a także joystick w prawo realizują zakup wskazanej broni.
Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu aktywacji broni defensywnych. Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu aktywacji broni defensywnych.
![Ekran aktywacji broni defensywnych.](images/ActDefensive.png)
Na ekranie tym można aktywować zakupione wcześniej bronie defensywne czy też ofensywne. Obsługiwany jest identycznie jak ekran zakupów, jednak [SPACJA] lub strzałka w prawo a także joystick w prawo realizują aktywacje wskazanej broni. Umożliwia to aktywowanie osłon jeszcze przed rozpoczęciem rundy. Na ekranie tym można aktywować zakupione wcześniej bronie defensywne czy też ofensywne. Obsługiwany jest identycznie jak ekran zakupów, jednak [SPACJA] lub strzałka w prawo a także joystick w prawo realizują aktywacje wskazanej broni. Umożliwia to aktywowanie osłon jeszcze przed rozpoczęciem rundy.
Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu zakupów następnego gracza. Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu zakupów następnego gracza.
(oczywiście dla graczy komputerowych ten ekran się nie pojawia) (oczywiście dla graczy komputerowych ten ekran się nie pojawia)
## 4. Główny ekran gry ## 4. Główny ekran gry
![Główny ekran gry.](images/StatusLine.png)
W linii statusowej widoczna jest informacja o tym który z graczy aktualnie może oddać strzał oraz zestaw innych informacji: W linii statusowej widoczna jest informacja o tym który z graczy aktualnie może oddać strzał oraz zestaw innych informacji:
* nazwa czołgu gracza * nazwa czołgu gracza
* wybrana aktualnie broń ofensywna * numer aktywnego joysticka lub poziom gracza sterowanego przez komputer (1-**Moron** - 8-**Unknown**),
* wybrana aktualnie broń ofensywna (symbol ilość nazwa),
* pozostała ilość punktów energii gracza i jeśli ma on aktywną broń defensywną posiadającą swój zasób energii - w nawiasie ten zasób * pozostała ilość punktów energii gracza i jeśli ma on aktywną broń defensywną posiadającą swój zasób energii - w nawiasie ten zasób
* ustawiony przez gracza kąt nachylenia lufy i kierunek jej nachylenia * ustawiony przez gracza kąt nachylenia lufy i kierunek jej nachylenia
* ustawiona przez gracza siła strzału (maksymalna siła strzału jest ograniczana przez energię gracza - nie może przekroczyć energii * 10 . Oznacza to, że mając małą ilość energii możemy oddać słabsze strzały * ustawiona przez gracza siła strzału (maksymalna siła strzału jest ograniczana przez energię gracza - nie może przekroczyć energii * 10 . Oznacza to, że mając małą ilość energii możemy oddać słabsze strzały
* numer aktualnej rundy rozgrywki * numer aktualnej rundy rozgrywki
* prędkość i kierunek wiatru * prędkość i kierunek wiatru
* w nawiasie nazwę aktywnej broni defensywnej - jeśli jest jakaś aktywowana przez gracz * symbol "komputera" jeśli aktywna jest **Auto Defense**
* w nawiasie nazwę aktywnej broni defensywnej - jeśli jest jakaś aktywowana przez gracza
Tutaj klawiszologia jest prosta, klawisze kursora lub joystick: lewo/prawo - zmiana kąta nachylenia lufy, góra/dół - zmiana ustawienia siły strzału. Tutaj klawiszologia jest prosta, klawisze kursora lub joystick: lewo/prawo - zmiana kąta nachylenia lufy, góra/dół - zmiana ustawienia siły strzału.
* [SPACJA] lub przycisk joysticka naciśnięte krótko - oddanie strzału
* [TAB] lub [SELECT]- wybór broni ofensywnej (ta opcja nie jest dostępna bezpośrednio joystickiem - trzeba wybrać Inventory) | A800 | 5200 | funkcja |
* Klawisz [I] lub dłuższe przytrzymanie przycisku joysticka - przejście do Inventory (aktywacji broni). Inventory to ekran (a w zasadzie dwa) bliźniaczo podobny do ekranu zakupów. Zasady poruszania się są identyczne z tym, że tu nie kupujemy broni, ale wybieramy jedną z ofensywnych, którą będziemy strzelać lub aktywujemy broń defensywną. | --- | --- | --- |
* Klawisz [A] lub [OPTION]- bezpośrednie przejście na ekran Inventory aktywacji broni defensywnych. | [SPACJA] | [0] | lub przycisk joysticka naciśnięte krótko - oddanie strzału |
* Klawisz [M] - wyłączenie/włączenie muzyki w tle | [TAB] lub [SELECT] | [5] | wybór broni ofensywnej (ta opcja nie jest dostępna bezpośrednio joystickiem - trzeba wybrać Inventory). |
* Klawisz [S] - wyłączenie/włączenie dźwięków efektów. | [I] | [9] | lub dłuższe przytrzymanie przycisku joysticka - przejście do Inventory (aktywacji broni). Inventory to ekran (a w zasadzie dwa) bliźniaczo podobny do ekranu zakupów. Zasady poruszania się są identyczne z tym, że tu nie kupujemy broni, ale wybieramy jedną z ofensywnych, którą będziemy strzelać lub aktywujemy broń defensywną. |
* [START] - przyspiesza/pomimja niektóre animacje w grze | [A] lub [OPTION] | [7] | bezpośrednie przejście na ekran Inventory aktywacji broni defensywnych. |
* Klawisz [O] - wymuszenie zakończenia gry (Game Over). W podsumowaniu wyników nie jest brana pod uwagę przerwana właśnie runda rozgrywki, a wyłącznie rundy zakończone wcześniej. Odpowiada to wciśnięciu klawisza [ESC] z tą różnicą, że wyświetlane jest podsumowanie oraz creditsy. | [M] | [PAUSE] | wyłączenie/włączenie muzyki w tle |
* [START] + [OPTION] - natychmiastowe wymuszenie zakończenia gry (Game Over), tak jak [O] ale bez potwierdzenia. | [S] | [RESET] | wyłączenie/włączenie dźwięków efektów. |
* [ESC] - w czasie całej gry w dowolnym momencie (chyba że akurat gra komputer, wtedy czasem trzeba chwilę poczekać) można nacisnąć klawisz [ESC], który umożliwia przerwanie gry i powrót na początek (oczywiście jest zabezpieczenie przed przypadkowym naciśnięciem). | [START] | brak | przyspiesza/pomija niektóre animacje w grze |
| [O] | [3] | wymuszenie zakończenia gry (Game Over). W podsumowaniu wyników nie jest brana pod uwagę przerwana właśnie runda rozgrywki, a wyłącznie rundy zakończone wcześniej. Odpowiada to wciśnięciu klawisza [ESC] z tą różnicą, że wyświetlane jest podsumowanie oraz creditsy. |
| [START] + [OPTION] | brak | natychmiastowe wymuszenie zakończenia gry (Game Over), tak jak [O] ale bez potwierdzenia. |
| [G] | brak | zmienia cieniowanie gór |
| [ESC] | [*] | w czasie całej gry w dowolnym momencie (chyba że akurat gra komputer, wtedy czasem trzeba chwilę poczekać) można nacisnąć klawisz [ESC], który umożliwia przerwanie gry i powrót na początek (oczywiście jest zabezpieczenie przed przypadkowym naciśnięciem). |
| [Y] | [1] | w przypadku pytania o przerwanie lub zakończenie gry - potwierdzenie decyzji |
| [CTRL] + [HELP] | brak | Przełącza tryb "visual debug". Wizualizuje mierzone odległości, celowanie lasera oraz technikę celowania komputera. Pozostawia bałagan na ekranie, co nie zmienia rozgrywki, tylko ją nieco utrudnia. |
## 5. Zasady gry - bronie ofensywne ## 5. Zasady gry - bronie ofensywne
### Energia czołgów ### Energia czołgów
- Na początku każdej rundy każdy czołg ma 99 jesnostek energii. - Na początku każdej rundy każdy czołg ma 99 jednostek energii.
- Energii czołgom ubywa na 3 sposoby: - Energii czołgom ubywa na 3 sposoby:
* jedna jednostka po oddaniu każdego strzału * jedna jednostka po oddaniu każdego strzału
* w czasie spadania (jeden piksel w dół 2 jednostki) * w czasie spadania (jeden piksel w dół - 2 jednostki)
* w chwili trafienia w czołg lub obok niego jakiegoś pocisku - i tu ilość odejmowanej energii zależy od odległości od centrum eksplozji i typu/siły rażenia pocisku. * w chwili trafienia w czołg lub obok niego jakiegoś pocisku - i tu ilość odejmowanej energii zależy od odległości od centrum eksplozji i typu/siły rażenia pocisku.
### Jak działa odejmowanie energii (i zarabianie kasy!) ### Jak działa odejmowanie energii (i zarabianie kasy!)
Po każdej rundzie wyliczana jest ilość zdobytych/straconych pieniędzy robione jest to na podstawie dwóch zmiennych gromadzonych przez każdy z czołgów w trakcie rundy. Te zmienne to: Po każdej rundzie wyliczana jest ilość zdobytych/straconych pieniędzy, robione jest to na podstawie dwóch zmiennych gromadzonych przez każdy z czołgów w trakcie rundy. Te zmienne to:
`gain` - energia "przechwycona" od trafionych czołgów (także jeśli trafimy w samego siebie :) i tu haczyk, jeśli pozostało nam bardzo mało energii opłacalne może być trafienie w siebie mocną bronią! `gain` - energia "przechwycona" od trafionych czołgów (także jeśli trafimy w samego siebie :) i tu haczyk, jeśli pozostało nam bardzo mało energii opłacalne może być trafienie w siebie mocną bronią!
`lose` - energia stracona w wyniku eksplozji/upadku (i tu ważne liczona jest całkowita utrata energii nawet jeśli czołg ma w chwili trafienia mniej). `lose` - energia stracona w wyniku eksplozji/upadku (i tu ważne - liczona jest całkowita utrata energii nawet jeśli czołg ma w chwili trafienia mniej).
Dodatkowo czołg który wygrał rundę ma parametr gain (przechwyconej od trafionych czołgów energii) zwiększany o pozostałą mu na koniec rundy energię (bo nie zginął i powinien ją mieć - choć bywa też inaczej :) ) Dodatkowo czołg który wygrał rundę ma parametr gain (przechwyconej od trafionych czołgów energii) zwiększany o pozostałą mu na koniec rundy energię (bo nie zginął i powinien ją mieć - choć bywa też inaczej :) )
@@ -91,7 +119,7 @@ Konkretnie:
`money = money - (10 * lose)` `money = money - (10 * lose)`
`if money <0 then money=0` `jeśli money <0 to money=0`
(na starcie każdej rundy `gain` i `lose` mają wartość 0) (na starcie każdej rundy `gain` i `lose` mają wartość 0)
@@ -111,10 +139,10 @@ Każda broń, która skutkuje eksplozją, ma swój promień rażenia.
Po eksplozji każdy czołg w jej zasięgu traci energię. Po eksplozji każdy czołg w jej zasięgu traci energię.
Działa to tak, że jeśli trafienie jst dokładnie w centralny punkt czołgu `EnergyDecrease` otrzymuje maksymalną wartość dla danej broni, a za każdym pikselem odległości od centrum czołgu wartość ta jest zmniejszana o 8. Działa to tak, że jeśli trafienie jest dokładnie w centralny punkt czołgu `EnergyDecrease` otrzymuje maksymalną wartość dla danej broni, a z każdym pikselem odległości od centrum czołgu wartość ta jest zmniejszana o 8.
Przykładowo jeśli strał oddany za pomocą broni Baby Missile trafi idelanie w centum czołgu to straci on dokładnie 88 jednostek energii (plus to co straci spadając po eksplozji). Przykładowo jeśli strzał oddany za pomocą broni Baby Missile trafi idealnie w centum czołgu to straci on dokładnie 88 jednostek energii (plus to co straci spadając po eksplozji).
W przypadku tafienia tą samą bronią w odległości 10ciu pikseli od centrum czołgu strata ta będzie wynośiła już tyko 8 jednostek. W przypadku trafienia tą samą bronią w odległości 10ciu pikseli od centrum czołgu strata ta będzie wynosiła już tyko 8 jednostek.
A oto wartości maksymalnego ubytku energii dla poszczególnych broni. Jeśli broń eksploduje kilka razy, każda z eksplozji jest obliczana niezależnie (dodatkowe wartości w tabeli): A oto wartości maksymalnego ubytku energii dla poszczególnych broni. Jeśli broń eksploduje kilka razy, każda z eksplozji jest obliczana niezależnie (dodatkowe wartości w tabeli):
@@ -124,7 +152,7 @@ A oto wartości maksymalnego ubytku energii dla poszczególnych broni. Jeśli br
| Missile | 136 | | Missile | 136 |
| Baby Nuke | 200 | | Baby Nuke | 200 |
| Nuke | 240 | | Nuke | 240 |
| LeapFrog| 136 120 104 | | LeapFrog| 136 112 112 |
| Funky Bomb | 168 88 (* 5) | | Funky Bomb | 168 88 (* 5) |
| MIRV | 136 (* 5) | | MIRV | 136 (* 5) |
| Death's Head | 240 (* 5) | | Death's Head | 240 (* 5) |
@@ -134,7 +162,7 @@ A oto wartości maksymalnego ubytku energii dla poszczególnych broni. Jeśli br
| Roller | 168 | | Roller | 168 |
| Heavy Roller | 240 | | Heavy Roller | 240 |
| Riot Charge | 0 (nie jest odejmowana energia, ale usuwana jest część gruntu w górę od punktu trafienia w promieniu 31 pikseli) | | Riot Charge | 0 (nie jest odejmowana energia, ale usuwana jest część gruntu w górę od punktu trafienia w promieniu 31 pikseli) |
| Riot Blast | 0 (jak w Dirt Charge, tyle że w promieniu 61 pikseli) | | Riot Blast | 0 (jak w Riot Charge, tyle że w promieniu 61 pikseli) |
| Riot Bomb | 0 (nie jest odejmowana energia, ale niszczony jest grunt w promieniu 17 pikseli od punktu trafienia - tak jak w wypadku Missile. Broń przydatna do odkopywania się po zasypaniu, bądź podkopywania przeciwnika) | | Riot Bomb | 0 (nie jest odejmowana energia, ale niszczony jest grunt w promieniu 17 pikseli od punktu trafienia - tak jak w wypadku Missile. Broń przydatna do odkopywania się po zasypaniu, bądź podkopywania przeciwnika) |
| Heavy Riot Bomb | 0 (jak w Riot Bomb, ale promień eksplozji to 29 pikseli od punktu trafienia - tak jak w wypadku Nuke) | | Heavy Riot Bomb | 0 (jak w Riot Bomb, ale promień eksplozji to 29 pikseli od punktu trafienia - tak jak w wypadku Nuke) |
| Baby Digger | 0 (nie jest odejmowana energia, ale podkopywana jest część gruntu promieniu 60 pikseli od punktu trafienia) | | Baby Digger | 0 (nie jest odejmowana energia, ale podkopywana jest część gruntu promieniu 60 pikseli od punktu trafienia) |
@@ -154,22 +182,26 @@ Duże punkty otrzymane przez gracza to ilość czołgów, które zginęły wcze
Tylko te punkty decydują o kolejności w podsumowaniu Tylko te punkty decydują o kolejności w podsumowaniu
## 6. A teraz bronie defensywne: ## 6. A teraz bronie defensywne:
* **White Flag** - powoduje poddanie gracza (może czasem przydać się w sytuacji beznadziejnej). Zaletą jest to, że poddając się nie dajemy dużego punktu przeciwnikom i nie powodujemy, że któryś zyska na tym, że nas zgładzi, ograniczamy też stratę swojej energii czyli także kasy. I tu także ważna uwaga - to jedyna broń defensywna, którą można deaktywować. Wystarczy ponownie wejść do inventory i jeszcze raz wybrać jej aktywację. * **White Flag** - powoduje poddanie gracza (może czasem przydać się w sytuacji beznadziejnej). Zaletą jest to, że poddając się nie dajemy dużego punktu przeciwnikom i nie powodujemy, że któryś zyska na tym, że nas zgładzi, ograniczamy też stratę swojej energii czyli także kasy. I tu także ważna uwaga - to jedyna broń defensywna, którą można dezaktywować. Wystarczy ponownie wejść do inventory i jeszcze raz wybrać jej aktywację.
* **Battery** - w momencie aktywacji doładowuje energię czołgu do pełna (99 jednostek) i jednocześnie jest to jedyna broń defensywna, która nie deaktywuje innych broni defensywnych w przypadku jej użycia. * **Battery** - w momencie aktywacji doładowuje energię czołgu do pełna (99 jednostek). Jest to jedna z trzech broni defensywnych, która nie dezaktywuje innych broni defensywnych w przypadku jej użycia.
* **Hovercraft** - broń umożliwiająca przemieszczanie się czołgu. Posiada własny zasób paliwa a dodatkowo może być aktywowana wielokrotnie w czasie tej samej tury, a po jej użyciu możemy w tej samej turze aktywować inną broń defensywną i oddać strzał. Po jej użyciu czołg uniesie się ponad góry i za pomocą klawiszy kursora lub joysticka: lewo/prawo możemy przemieścić czołg na nową pozycję a [SPACJA] lub przycisk joysticka powodują wylądowanie czołgu w nowym miejscu. Latać można do chwili skończenia się "paliwa" (prezentowanego na pasku statusu tak jak energia broni defensywnej), jeśli paliwo się skończy czołg opadnie samodzielnie. Nie da się lądować na innych czołgach. * **Hovercraft** - broń umożliwiająca przemieszczanie się czołgu. Posiada własny zasób paliwa a dodatkowo może być aktywowana wielokrotnie w czasie tej samej tury, a po jej użyciu możemy w tej samej turze aktywować inną broń defensywną i oddać strzał. Po jej użyciu czołg uniesie się ponad góry i za pomocą klawiszy kursora lub joysticka: lewo/prawo możemy przemieścić czołg na nową pozycję a [SPACJA] lub przycisk joysticka powodują wylądowanie czołgu w nowym miejscu. Latać można do chwili skończenia się "paliwa" (prezentowanego na pasku statusu tak jak energia broni defensywnej), jeśli paliwo się skończy czołg opadnie samodzielnie. Nie da się lądować na innych czołgach.
* **Parachute** - nie chroni przed ubytkiem energii z powodu sąsiedniej eksplozji, powoduje że nie ubywa energii w czasie JEDNEGO spadania. Po takim upadku deaktywuje się i trzeba aktywować nowy spadochron. * **Parachute** - nie chroni przed ubytkiem energii z powodu sąsiedniej eksplozji, powoduje że nie ubywa energii w czasie JEDNEGO spadania. Po takim upadku dezaktywuje się i trzeba aktywować nowy spadochron.
* **Strong Parachute** - spadochron z własną energią (na starcie 99 jednostek), działa tak samo jak Parachute (nie chroni przed eksplozjami) ma za to swój własny zasób energii przy spadaniu w pierwszej kolejności zmniejszana jest energia tego spadochronu (1 jednostka na jeden pixel opadania - inaczej niż czołg!) i jeśli dojdzie ona do 0 to spadochron deaktywuje się i dalej zmniejszana jest energia czołgu (tutaj już standardowo - 2 jednoski na jeden pikxel). * **Strong Parachute** - spadochron z własną energią (na starcie 99 jednostek), działa tak samo jak Parachute (nie chroni przed eksplozjami) ma za to swój własny zasób energii przy spadaniu w pierwszej kolejności zmniejszana jest energia tego spadochronu (1 jednostka na jeden pixel opadania - inaczej niż czołg!) i jeśli dojdzie ona do 0 to spadochron dezaktywuje się i dalej zmniejszana jest energia czołgu (tutaj już standardowo - 2 jednostki na jeden pikxel).
* **Shield** - najprostsza osłona działa dokładnie przeciwnie niż Parachute, nie chroni przed ubytkiem energii w czasie spadania, chroni za to przed ubytkiem energii spowodowanym JEDNĄ sąsiednią eksplozją. Chroni jednorazowo, bez znaczenia jak silna jest eksplozja (czy jest to tylko "draśnięcie", czy też bezpośrednie trafienie atomówką) i od razu po niej deaktywuje się. * **Shield** - najprostsza osłona działa dokładnie przeciwnie niż Parachute, nie chroni przed ubytkiem energii w czasie spadania, chroni za to przed ubytkiem energii spowodowanym JEDNĄ sąsiednią eksplozją. Chroni jednorazowo, bez znaczenia jak silna jest eksplozja (czy jest to tylko "draśnięcie", czy też bezpośrednie trafienie atomówką) i od razu po niej dezaktywuje się.
* **Heavy Shield** - osłona z własną energią (na starcie 99 jednostek), działa tak samo jak Shield (nie chroni przed upadkiem) z tym wyjątkiem, że ma własny zasób energii. Przy eksplozji w pierwszej kolejności zmniejszana jest energia tej osłony i jeśli dojdzie ona do 0 to osłona deaktywuje się i dalej zmniejszana jest energia czołgu. W związku z takim działaniem, czołg z tym typem osłony można "zabić" podkopując go, bo spadanie zmniejsza energię czołgu a nie osłony. * **Heavy Shield** - osłona z własną energią (na starcie 99 jednostek), działa tak samo jak Shield (nie chroni przed upadkiem) z tym wyjątkiem, że ma własny zasób energii. Przy eksplozji w pierwszej kolejności zmniejszana jest energia tej osłony i jeśli dojdzie ona do 0 to osłona dezaktywuje się i dalej zmniejszana jest energia czołgu. W związku z takim działaniem, czołg z tym typem osłony można "zabić" podkopując go, bo spadanie zmniejsza energię czołgu a nie osłony.
* **Force Shield** - najmocniejsza osłona - działa tak jak Heavy Shield tyle że połączona z Parachute. Co ważne w jej przypadku upadek nie zabiera energii osłonie ani czołgowi. Zabierają ją tylko trafienia. * **Force Shield** - najmocniejsza osłona - działa tak jak Heavy Shield tyle że połączona z Parachute. Co ważne w jej przypadku upadek nie zabiera energii osłonie ani czołgowi. Zabierają ją tylko trafienia.
* **Bouncy Castle** - broń agresywna :) . Działa następująco. W przypadku bezpośredniego trafienia w czołg (i osłonę) powoduje "odbicie" pocisku w przeciwnym kierunku z tą samą siłą z jaką był wystrzelony. W przypadku braku wiatru i różnicy poziomów broń trafia wtedy w czołg, który ją wystrzelił. Po takim odbiciu deaktywuje się. W związku z tym, że broń ta reaguje w ten sposób tylko na precyzyjne trafienia, jest także osłoną odpowiadającą działaniu Heavy Shield i ma na starcie 99 jednostek (prawdopodobnie trzeba będzie przemyśleć tę wartość i dać tu mniejszą). * **Bouncy Castle** - broń agresywna :) . Działa następująco. W przypadku bezpośredniego trafienia w czołg (i osłonę) powoduje "odbicie" pocisku w przeciwnym kierunku z tą samą siłą z jaką był wystrzelony. W przypadku braku wiatru i różnicy poziomów broń trafia wtedy w czołg, który ją wystrzelił. Po takim odbiciu dezaktywuje się. W związku z tym, że broń ta reaguje w ten sposób tylko na precyzyjne trafienia, jest także osłoną odpowiadającą działaniu Heavy Shield i ma na starcie 99 jednostek (prawdopodobnie trzeba będzie przemyśleć tę wartość i dać tu mniejszą).
* **Mag Deflector** - druga broń agresywna :) . W przypadku bezpośredniego trafienia w czołg (i osłonę) powoduje przesunięcie punktu trafienia losowo w lewo lub prawą stronę chronionego czołgu, ale niezbyt daleko, więc można dostać "odłamkiem" przy silniejszej broni. Tak jak w przypadku Bouncy Castle jest także osłoną odpowiadającą działaniu Heavy Shield i ma na starcie 99 jednostek (prawdopodobnie i tutaj trzeba będzie przemyśleć tę wartość i dać mniejszą). * **Mag Deflector** - druga broń agresywna :) . W przypadku bezpośredniego trafienia w czołg (i osłonę) powoduje przesunięcie punktu trafienia losowo w lewo lub prawą stronę chronionego czołgu, ale niezbyt daleko, więc można dostać "odłamkiem" przy silniejszej broni. Tak jak w przypadku Bouncy Castle jest także osłoną odpowiadającą działaniu Heavy Shield i ma na starcie 99 jednostek (prawdopodobnie i tutaj trzeba będzie przemyśleć tę wartość i dać mniejszą).
* **Nuclear Winter** - nic nie dodaje, nic nie zabiera :) - w zasadzie to broń nie tyle defensywna co obosieczna. Zasypuje teren opadem "radioaktywnym", który jest zwyczajną glebą. Jeśli nie mamy pod ręką żadnej broni odkopującej teren i do tego osłony (najlepiej jednorazowej), to po takim "opadzie" będzie trzeba strzelić do siebie - bo będąc pod ziemią inaczej się nie da. Ewentualnie pozostaje zawsze White Flag. * **Nuclear Winter** - nic nie dodaje, nic nie zabiera :) - w zasadzie to broń nie tyle defensywna co obosieczna. Zasypuje teren opadem "radioaktywnym", który jest zwyczajną glebą. Jeśli nie mamy pod ręką żadnej broni odkopującej teren i do tego osłony (najlepiej jednorazowej), to po takim "opadzie" będzie trzeba strzelić do siebie - bo będąc pod ziemią inaczej się nie da. Ewentualnie pozostaje zawsze White Flag.
* **Long Schlong** - broń specjalna :) - kosztuje dużo, nie bardzo w czymkolwiek pomaga (poza ewentualnym odkopaniem się ale tylko przy niewielkim przysypaniu ale fanie się nazywa i wygląda :) - Można ją aktywować niezależnie od innych broni defensywnych i pozostaje aktywna do końca rundy (nie da się jej deaktywować). * **Long Schlong** - broń specjalna :) - kosztuje dużo, nie bardzo w czymkolwiek pomaga (poza ewentualnym odkopaniem się ale tylko przy niewielkim przysypaniu ale fajnie się nazywa i wygląda :) - Można ją aktywować niezależnie od innych broni defensywnych i pozostaje aktywna do końca rundy (nie da się jej dezaktywować).
* **Lazy Boy** - nie jest to właściwie broń defensywna. Jest to wspomaganie celowania. Po jej aktywacji czołg stara się wycelować w najbliższego przeciwnika i automatycznie ustawia siłę strzału oraz kąt. W przypadku posiadania zbyt małej ilości energii może czasem wycelować źle (do celowania stosuje metodę taką jak **Cyborg**). Tak jak **Battery** nie dezaktywuje innych broni defensywnych w przypadku jej użycia. Uwaga! Nie ma sensu aktywacja tej broni przed rundą, celowanie nie odbędzie się bo nie ma jeszcze do czego celować.
* **Lazy Darwin** - działa tak jak **Lazy Boy** ale celuje w najsłabszego przeciwnika. W tej broni po automatycznym celowaniu pozostaje aktywne "celowanie wizualne" można więc łątwo zmienić cel i samodzielnie wybrać innego przeciwnika widząc czy w niego trafimy.
* **Auto Defense** - włącza tryb automatycznej aktywacji broni defensywnych. Po jej aktywowaniu czołg automatycznie aktywuje najmocniejszą posiadaną osłonę (zużywając ją oczywiście) w każdej chwili, kiedy nie ma żadnej osłony (także pomiędzy strzałami innych graczy). Jednocześnie jeżeli poziom energii czołgu spadnie poniżej 30 jednostek, automatycznie aktywuje **Battery** jeżeli ją posiada. Ta broń pozostaje aktywna do końca rundy i jest sygnalizowana symbolem "komputera" przed nazwą aktywnej broni defensywnej w linii statusowej. Jest to druga broń defensywna, która nie dezaktywuje innych broni defensywnych w przypadku jej użycia.
* **Spy Hard** - Pomoc dla zapominalskich :) . Po aktywacji pokazuje kolejno podgląd informacji o kolejnych przeciwnikach. Lewo/Prawo - zmienia "szpiegowany" czołg. Fire/Space/Return/Esc - kończy "szpiegowanie". Jest to ostatnia broń defensywna, która nie dezaktywuje innych broni defensywnych w przypadku jej użycia.
W związku z odmiennym działaniem broni **MIRV**, bronie defensywne **Bouncy Castle** i **Mag Deflector** wykorzystują tylko funkcję osłony przy trafieniu tą bronią. Dodatkowo głowice **MIRV** w czasie opadania nie odbijają się i nie przelatują przez ściany boczne! W związku z odmiennym działaniem broni **MIRV**, bronie defensywne **Bouncy Castle** i **Mag Deflector** wykorzystują tylko funkcję osłony przy trafieniu tą bronią. Dodatkowo głowice **MIRV** w czasie opadania nie odbijają się i nie przelatują przez ściany boczne!
Żadna z osłon nie chroni przed **Napalm**. **Auto Defense** czy **Mag Deflector** przy bezpośrednim trafieniu odbije je lub przeniesie obok, ale wystarczy trafić bardzo blisko czołgu i nie zadziała jego osłona. Żadna z osłon nie chroni przed **Napalm**. **Bouncy Castle** czy **Mag Deflector** przy bezpośrednim trafieniu odbije je lub przeniesie obok, ale wystarczy trafić bardzo blisko czołgu i nie zadziała jego osłona.
Bronie **White Flag**, **Hovercraft** i **Nuclear Winter** po aktywacji wymagają uruchomienia, jest to realizowanie przez "oddanie strzału" po aktywacji tej broni. Oczywiście strzał bronią ofensywną nie jest wtedy oddawany, a jedynie uruchamiana jest wybrana broń defensywna. Bronie **White Flag**, **Hovercraft** i **Nuclear Winter** po aktywacji wymagają uruchomienia, jest to realizowanie przez "oddanie strzału" po aktywacji tej broni. Oczywiście strzał bronią ofensywną nie jest wtedy oddawany, a jedynie uruchamiana jest wybrana broń defensywna.
@@ -179,8 +211,7 @@ Oczywiście aktywacja broni w momencie kiedy mamy już aktywowaną jakąś inną
## 7. Bronie 'inne' :) : ## 7. Bronie 'inne' :) :
* **Buy me!** - tej 'broni' nie można używać w rozgrywce. Jej zakup powoduje wylosowanie jesdnej z broni ofensywnych lub (żadziej) defensywnych i dodanie jej do arsenału gracza. Jest to loteria w której można stracić (jeśli wylosuje się broń tańsza niż cena **Buy Me!** ale też zyskać. Jeśli wylosuje się broń dużo droższa możemy otrzymać do dyspozycji broń, na którą nie było nas stać! * **Best F...g Gifts** - tej 'broni' nie używa śię w rozgrywce. Jej zakup powoduje wylosowanie jednej z broni ofensywnych lub (rzadziej) defensywnych i dodanie jej do arsenału gracza. Jest to loteria w której można stracić (jeśli wylosuje się broń tańsza niż cena **Best F...g Gifts** ale też zyskać. Jeśli wylosuje się broń dużo droższa możemy otrzymać do dyspozycji broń, na którą nie było nas stać! Istnieje niewielkie prawdopodobieństwo wylosowania przez **Best F...g Gifts** samej siebie :). Można wtedy spróbować użyć jej w walce.
## 8. Poziomy trudności przeciwników sterowanych przez komputer: ## 8. Poziomy trudności przeciwników sterowanych przez komputer:
@@ -190,7 +221,7 @@ Gra posiada 8 poziomów trudności przeciwników sterowanych przez komputer. A w
* **Shooter** - Ten przeciwnik nie strzela na oślep. Wybiera sobie jeden kierunek. Na podstawie własnej pozycji - strzela w stronę z której jest więcej przestrzeni zakładając, że to tam są inne czołgi. Ostrzeliwanie zaczyna od wysokiego kąta i strzał po strzale zmienia ten kąt na coraz niższy starając się ostrzelać cały obszar po wybranej stronie. Strzał oddaje zawsze najlepszą posiadaną bronią (najwyższą na liście posiadanych broni - czyli nie koniecznie najlepszą). Nie używa broni defensywnych mimo, że je kupuje! Na początku rundy podejmuje 1 próbę zakupu broni defensywnych (tylko z zakresu **Battery** - **Strong Parachute**) i 4 ofensywnych (z zakresu **Missile** - **Heavy Roller**). * **Shooter** - Ten przeciwnik nie strzela na oślep. Wybiera sobie jeden kierunek. Na podstawie własnej pozycji - strzela w stronę z której jest więcej przestrzeni zakładając, że to tam są inne czołgi. Ostrzeliwanie zaczyna od wysokiego kąta i strzał po strzale zmienia ten kąt na coraz niższy starając się ostrzelać cały obszar po wybranej stronie. Strzał oddaje zawsze najlepszą posiadaną bronią (najwyższą na liście posiadanych broni - czyli nie koniecznie najlepszą). Nie używa broni defensywnych mimo, że je kupuje! Na początku rundy podejmuje 1 próbę zakupu broni defensywnych (tylko z zakresu **Battery** - **Strong Parachute**) i 4 ofensywnych (z zakresu **Missile** - **Heavy Roller**).
* **Poolshark** - Atakując wyznacza sobie za cel najbliższy czołg, następnie dobiera kąt strzału, a jego siłę stara się dobrać losując ją z wybranego przedziału. Strzał oddaje zawsze najlepszą posiadaną bronią. Używa broni defensywnych. Z prawdopodobieństwem 1:3 aktywuje przed oddaniem strzału najlepszą posiadaną broń defensywną (najwyższą na liście posiadanych broni - czyli nie koniecznie najlepszą). Jeżeli poziom jego energii spadnie poniżej 30 jednostek - używa **Battery** (oczywiście jeśli wcześniej ją kupił), jeżeli energia spadniej poniżej 5 i nie ma **Battery** poddaje się - **White Flag**. Na początku rundy podejmuje 1 próbę zakupu broni defensywnych i 6 ofensywnych. * **Poolshark** - Atakując wyznacza sobie za cel najbliższy czołg, następnie dobiera kąt strzału, a jego siłę stara się dobrać losując ją z wybranego przedziału. Strzał oddaje zawsze najlepszą posiadaną bronią. Używa broni defensywnych. Z prawdopodobieństwem 1:3 aktywuje przed oddaniem strzału najlepszą posiadaną broń defensywną (najwyższą na liście posiadanych broni - czyli nie koniecznie najlepszą). Jeżeli poziom jego energii spadnie poniżej 30 jednostek - używa **Battery** (oczywiście jeśli wcześniej ją kupił), jeżeli energia spadnie poniżej 5 i nie ma **Battery** poddaje się - **White Flag**. Na początku rundy podejmuje 1 próbę zakupu broni defensywnych i 6 ofensywnych.
* **Tosser** - Atakując działa dokładnie tak jak **Poolshark** jednak może posiadać "lepszy" zasób broni dzięki innej taktyce zakupów. Zawsze przed strzałem aktywuje najlepszą posiadaną broń defensywną. i tak jak **Poolshark** stosuje **Battery** i **White Flag**. Na początku rundy ocenia ile ma pieniędzy i w zależności od tego podejmuje (pieniądze/5100) prób zakupu broni defensywnych a następnie jeszcze raz sprawdza ile pieniędzy mu zostało i podejmuje (pieniądze/1250) prób zakupu broni ofensywnych. * **Tosser** - Atakując działa dokładnie tak jak **Poolshark** jednak może posiadać "lepszy" zasób broni dzięki innej taktyce zakupów. Zawsze przed strzałem aktywuje najlepszą posiadaną broń defensywną. i tak jak **Poolshark** stosuje **Battery** i **White Flag**. Na początku rundy ocenia ile ma pieniędzy i w zależności od tego podejmuje (pieniądze/5100) prób zakupu broni defensywnych a następnie jeszcze raz sprawdza ile pieniędzy mu zostało i podejmuje (pieniądze/1250) prób zakupu broni ofensywnych.
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

+289 -79
View File
@@ -5,48 +5,257 @@ Scorch is a multi-player, turn-based, artillery video game. Tanks do turn-based
by Tomasz 'Pecus' Pecko and Pawel 'pirx' Kalinowski by Tomasz 'Pecus' Pecko and Pawel 'pirx' Kalinowski
Warsaw, Miami 2000, 2001, 2002, 2003, 2009, 2012, 2013, 2022 Warsaw, Miami 2000, 2001, 2002, 2003, 2009, 2012, 2013, 2022, 2023
Contributors: Contributors:
- Kaz - splash screen, ideas - Miker ([mikerro](https://github.com/mikerro)) - in-game music and sfx, ideas, QA
- Miker (@mikerro) - game sfx, ideas, QA - Kaz - original splash screen, SV Atari 50 splash screen, ideas
- Adam (@6502adam) - font, ideas, QA - Adam ([6502adam](https://github.com/6502adam)) - font, design, QA
- Bocianu (@bocianu) - important ideas, FujiNet implementation, QA - Bocianu ([bocianu](https://github.com/bocianu)) - important ideas, FujiNet implementation, QA
- Emkay - splash screen music - Emkay - splash screen music
- Fox (@pfusik) - plot and point optimization - Fox ([pfusik](https://github.com/pfusik)) - plot and point optimization
- xorcerer ([xauberer](https://github.com/xauberer)) - AI generated splash and sticker
QA: Probabilitydragon, KrzysRog, Beeblebrox, EnderDude, lopezpb, Dracon, brad-colbert, archon800, Shaggy the Atarian
QA: Probabilitydragon, EnderDude, Dracon, Beeblebrox, KrzysRog, lopezpb,
brad-colbert, archon800, nowy80, Saberman, Shaggy the Atarian, RetroBorsuk, ZPH,
x=usr(1536), Aking, RB5200
Special thanks to tebe ([tebe6502](https://github.com/tebe6502)), JAC! ([peterdell](https://github.com/peterdell)) and phaeron ([Altirra](https://www.virtualdub.org/altirra.html)) for their fantastic tools and support.
You can contact us via [AtariAge](https://atariage.com) or [AtariOnLine](https://atarionline.pl) forums. You can contact us via [AtariAge](https://atariage.com) or [AtariOnLine](https://atarionline.pl) forums.
This source code was originally compiled with [OMC65 crossassembler](https://github.com/pkali/omc65) and on 2012-06-21 translated to [mads](https://github.com/tebe6502/Mad-Assembler). This source code was originally compiled with [OMC65 crossassembler](https://github.com/pkali/omc65) and on 2012-06-21 translated to [mads](https://github.com/tebe6502/Mad-Assembler).
Compilation: `mads scorch.asm -o:scorch.xex` Compilation:
- `mads scorch.asm -o:scorch.xex -d:TARGET=800` for Atari800 version
- `mads scorch.asm -o:scorch.bin -d:TARGET=5200` for Atari 5200 version
- `mads scorchC64.asm -o:scorchC64.prg` for C64 version (WIP, not playable yet)
Game source code is split into 5+4 parts: Game source code is split into several parts:
- scorch.asm is the main game code (with many assorted routines) - `scorch.asm` is the main game startup code
- grafproc.asm - graphics routines like line or circle - `game.asm` - it all happens here
- textproc.asm - text routines like list of weapons and shop - `grafproc.asm` - graphics routines like line or circle
- variables.asm - all non-zero page variables - `textproc.asm` - text routines like list of weapons and shop
- constants.asm - various tables of constants - `variables.asm` - all non-zero page variables
- display.asm - display lists and text screen definitions - `constants.asm` - various tables of constants
- ai.asm - artificial stupidity of computer opponents - `display_*.asm` - display lists and text screen definitions
- weapons.asm - general arsenal of tankies - `ai.asm` - artificial stupidity of computer opponents
- definitions.asm - label definitions, moved to make it work better with Altirra debug (it doesn't). - `weapons.asm` - general arsenal of tankies
- `definitions.asm` - label definitions, moved to make it work better with Altirra debug (it doesn't).
We were trying to use macros, pseudo-ops and simple graphics primitives as much as possible. We were trying to use macros, pseudo-ops, and simple graphics primitives as much as possible. This way, it should be relatively easy to port this code to, for example, the C64.
This way it should be relatively easy to port this code to e.g. C64
After those N years of working on this piece of code we are sure it would be much wiser to write it in C, Action! or MadPascal but on the other hand it is so much fun to type 150 chars where all you want to have y=a*x+b :) After working on this piece of code for N years, we are sure it would be much wiser to write it in C, Action!, or MadPascal. On the other hand, it is so much fun to type 150 characters when all you want to have is y = a * x + b. :)
Originally most variables were in Polish, comments were sparse, but we wanted to release this piece of code to public. Originally, most variables were in Polish, and comments were sparse. However, we wanted to release this piece of code to the public. Because we were always short of time and energy (to finish the game), we decided to translate it into English so that other people could work on it. This never happened, but we received some encouraging comments, and we are still trying to do something from time to time.
Because of being always short of time/energy (to finish the game) we decided it must go in 'English' to let other people work on it.
It never happened, but we got some encouraging comments and we are still trying to do something from time to time.
With the advent of [fujinet](https://fujinet.online/) we are thinking about making the game interplanetary, err, with multiplayer over the net. We'll see. With the advent of [fujinet](https://fujinet.online/) we are thinking about making the game interplanetary, err, with multiplayer over the net. We'll see.
## Changes: ## Changelog:
###### Version 1.30
2023-05-21
Okay, okay, we promised that the single-machine game was done, and it was. However, some bug reports came in, and development of the C64 version unearthed some mostly peaceful and dormant pests. As a result, it appears that a new release is happening.
The most important changes:
- Most machine-dependent code moved to appropriate folders (`Atari/` and `C64/`).
- Game Over results table improved by sorting all 3 values - points, hits and money earned. It was possible in the past to get a lower podium place with e.g., more money.
- Game Over screen now displays level of robo tanks and controller number for organic players.
- Gains calculations bug fixed.
- Manuals now include pictures!
- More than 6 tanks possible (not for Atari / 5200 where sprites and memory are the limiting factor)
- Shield stays up after White Flag bug fixed https://github.com/pkali/scorch_src/issues/138. Finally!!!
- Quit from game and quit to Game Over is now checked much more often, especially when robo tanks are fighting.
- Numerous binary size and source code clarity improvements, mainly to facilitate the above changes.
###### Version 1.28
2023-04-22
Greetings and salutations,
Allow me to present the release notes for Version 1.28 of our esteemed hobby game for 8-bit computers.
First and foremost, let it be known that we have reached the end of an era. We bid adieu to the solitary player versions, as we are determined to preserve the sanctity of this auspicious round version number.
Moving on to the technical enhancements and embellishments, we are proud to introduce a simulated stereo feature for those fortunate enough to possess the dual pokey hardware. This auditory wonder was brought to fruition by the esteemed Arthur "Two Pokeys" Jackson, whose mastery in the field of sound engineering knows no bounds.
Furthermore, we have bestowed upon our beloved creation a splash screen of unrivaled brilliance, crafted by the masterful xorcerer. This work of art, by the Artificial Unintelligence and Machine Forgetting, shall leave an indelible mark on all who behold it.
Our developers have also painstakingly refined the game's performance with a plethora of improvements, including a refined round and final results sorting mechanism, additional keyboard usage assistance in the main menu, and a significant acceleration of the 8x8 and 4x4 put char routines. Additionally, we have incorporated configurable hardware and screen memory layout agnostic put char routines to accommodate future ports and ensure seamless compatibility.
Last but certainly not least, our mountain drawing optimization shall elevate the visual experience to new heights, ensuring an immersive and enjoyable experience for all.
We hope that these improvements shall enhance your gaming experience, and we eagerly anticipate your feedback.
Yours sincerely,
The Developers
###### Version 1.27
2023-02-07
Late evening edition. It is 2:11 am and I am writing this instead of dreaming of electric sheep.
Our Senior Executive Art Director @+Adam+ ordered us to stop procrastinating and finally release the version with colorized mountains. So here it is. Enjoy :)
Please note you can still press [Tab] or [5] in the main menu and revert to the classic or classy look of the "Polish rainbow" (it's a reference to a strangely accurate Wulffmorgenthaler comic strip: https://i.imgur.com/HMctP.jpg)
Other changes:
- nicer Lazy targeting and "visual Debug" for Lazy Boys
- extreme memory optimizations to fit 2 new texts from @RB5200 based on "Sandford and Son"
- fix for [G] key bug when turn wind changes were selected
- fix for Lazy Boys deactivation bug
- PAL mode now has got the full-color table, so it is possible to adjust colors better
- the x-position of tanks was always adjusted to even X values, this is no more, which saves some hassle and unnecessary tank shakes left and right. As tanks are painted with sprites of a lower resolution, a rare artifact might appear here and there.
- improved tank shapes
###### Version 1.26
2023-01-23
Early morning edition. It is 5:11 am and I am writing this instead of dreaming of electric sheep.
For the last 6 weeks, the versions we released had an awful bug - the conversations of tanks were completely invisible. Thanks for pointing this out, RB5200.
- tanks talk to each other again
- better stochastic non-blocking wait one frame
- rare distance measurement bug fixed (rarely a tank survived a direct hit)
- 5200: second fire (by RB5200)
- "visual debug" mode in A800 version, triggered by pressing [CTRL]+[HELP]. It displays distances measured, laser aiming, and aiming technique. It leaves a mess on the screen, but it does not impair the game, just makes it a bit harder.
###### Version 1.25
2023-01-17
Y2K Compliance Edition
This version is 5200 SuperSystem focused.
- the correct production year in the splash screens!!!
- very rare hangups when accessing the inventory seemingly eliminated, thanks @RB5200 for testing!
- a new feature - pressing [Tab] (atari800) or [5] (5200) when selecting the wind power switches wind mode to changing with each turn, which makes aiming arguably more challenging! It is indicated by "?" next to the "Wind" in the main menu.
- pressing [G] during the game changes the color scheme (classic, Polish rainbow, Xmas).
- all these changes were made possible thanks to the extensive code size optimization by @Pecus
###### Version 1.23
2023-01-01
New year edition! Who could imagine?
The new feature is that pressing [Tab] in the main menu now changes colors of the small tank area down the screen and makes it clear what color version you are going to run (classic/ Polish rainbow/ Christmas colors).
Also a small gradient optimization.
###### Version 1.22
2022-12-24
Christmas colors edition! Can you carve a quarter of a page of memory from two decades old code? Sure @Pecusx can! So finally we have the most requested feature - C0L0RS on the game screen, adjusted with Adam's help.
Press [TAB] twice in the main menu to switch to a screen with colors.
Other (dubious) improvements:
- New Lazy Darwin, it is spectacular, check it out!!!
- Smoke Tracer does not smoke when targeting with Lazy Darwin
- Lazy Boy works well with joystick
- Another fix for self-destructing tanks shooting low angles (0-4 degrees)
- New, better tank shapes by Adam
- Barrel start point correction fixes very rare aiming issues
- Soil slide after Hovercraft usage optimized
###### Version 1.21
2022-12-10
We couldn't resist! This is the Senior Executive Director's Cut.
By virtue of byte misering we squeezed in a few new features:
- new selectable tank shapes - change the controller enough times to get a different tank model
- lonely bad pixel after Liquid Dirt fixed
- mountain colors (or shades) possible, switch with [Tab] in the main menu
- active controller number display in the game, store, and inventory screens
- a very special terminator mode for Moron
###### Version 1.20
2022-11-23
It's the final cut. Director's Cut.
We squeezed the code and saved some bytes to add the joystick/controller selection. No more fights for the stick, up to 4 players can have fun with their own manipulators. And the fifth one can still use the keyboard :).
Our most prolific testers Arek and Alex called for a number of fixes. Thank you, guys!
- Players can select their controllers.
- Better Auto Defense symbol in the status line.
- Battery performance in AI and Auto Defense fixed.
- More accurate and faster Laser.
- Boost For Gifts includes a secret, quite powerful weapon.
- Points counting fix-up (edge cases eliminated).
- Long lists in inventory and shop were pointing to a weapon outside the screen. Fixed.
- Lazy Boys now remember the last weapon used.
- Especially for XEGS - SELECT key changes the joystick similarly to TAB.
- Rare P/M glitches fixed.
- ExplosionRange variable glitched (rarely) due to byte/word mix-up. Fixed.
- Bouncy Castle was bouncing the laser from inside. Fixed.
- Shielded tanks were autodestructing when shooting with angle 0. Fixed.
- Physics of bouncing off the walls was incorrect for some weapons. Fixed.
###### Version 1.19
2022-11-04
This is the final round of weapon additions! Also. our beloved testers and players found a number of issues and we were extremely happy to address them.
- New defensive weapon "Lazy Boy" - aims at the closest enemy.
- New defensive weapon "Lazy Darwin" - aims at the weakest link, an enemy I mean.
- New defensive weapon "Auto Defense" - activate it to be automatically protected by shields and stuff (where available)
- New defensive weapon "Spy Hard" - quickly view energies, weapons and shields of your opponents.
- New SFXes, improvements in SFX, and music by @mikerro
- Shooting with angle 0 caused the sudden death of the operator. Fixed.
- Angles were asymmetrical, now you can go from 0 to 90 and to 0 again (181 degrees of freedom). Fixed with an improved arithmetic rounding of our sub-pixel accuracy.
- Drawing a barrel when a tank was on the edge of X==256 pixels caused a lonely pixel to appear randomly. Fixed.
- Liquid Dirt was overflowing from the right edge of the screen to the left. Fixed.
- Liquid Dirt volume increased significantly, it is now a formidable attack!
- A single pixel was erroneously plotted when measuring distance (was visible in e.g., Death's Head). Fixed.
- Not all traces were correctly erased after Funky Bomb, fixed again (for the 3rt time I guess).
- Soil sedimentation speed after Funky Bomb improved.
- Pressing [ESC] when in inventory/store was quitting the game, now it quits the menu only.
- A bug in MADS optimization was causing parts of SEPPUKU message to stay on screen.
- BIGGEST OF ALL: the lonely pixel after Nuclear Winter was eliminated. https://github.com/pkali/scorch_src/issues/103 We have spent a disproportionately large amount of time trying to slap this bug. It is still there, but is not manifesting itself ;)
###### Version 1.18
2022-11-07
Possibly the final single-player version of the game, unless our dear players find another breaking issue!
- 5200 keypad works as it should. You can now press these finicky foils to your heart's desire.
- "Unknown" type Robotanks were attacking with Nuclear Winter every time. Fixed!
- One of the variables was declared as a byte but used as a word that might cause some rare instabilities.
- Page zero variables are cleared prior to the game start to eliminate rare issues in some software/hardware configurations.
- The new version of music in NTSC eliminates issues with tempo (not that anyone but the artist noticed that, but still it is an improvement!)
- You can now wrap around inventory and shop to faster access these options far down below.
- Visual improvement of the main menu and fixed some color issues with the title headers.
- Hovercraft was always flying to the top of the screen, it was not intended, it is now hovering just above the mountains!
- The main menu does not blink now when changing options. This was a very minor thing but it bothered me to some extent. Fixing it required a complete rewrite of this portion of the menu.
###### Version 1.17
2022-10-31
Mostly 5200 console port and NTSC improvements.
- Updated songs from Miker do not require skipping frames on NTSC machines. Crucial for the next point.
- Bouncy Castle bouncing of Funky Bomb fixed https://github.com/pkali/scorch_src/issues/129
- 5200 version had various graphical and sound glitches. Although mostly harmless, it hurt our sense of aesthetics. First of all the flickering credits roll is all good now.
- Rare hang-ups on NTSC machines fixed
- Screen lowered down by 7 scan lines to help top status line on NTSC CRTs.
- 5200 ATTRACT mode not going away fixed
- Autorepeat added to menus what should help 5200 users with their non-centering abomination of a controller.
- DLI interrupts optimized, few cycles saved.
- 5200 keypad sort-of-works. Please refer to manual for key bindings.
###### Version 1.16
2022-10-16
The official release of our game for the Atari 5200 SuperSystem. Grab the `scorch.bin` file and burn a cart!
This is all thanks to @miker who supported us all this time of uncertainty and despair.
Cramming the game into a 32KiB cart and 16KiB RAM was a big task - it required a rewrite of the RMT player, a crazy number of size optimizations, and counting each byte.
The release is not perfect - we have a number of glitches and improvements to the 5200 controller procedures to work on, but the game is playable.
Changes:
- numerous, but not very visible
###### Version 1.14 ###### Version 1.14
2022-09-05 2022-09-05
@@ -55,12 +264,12 @@ Minor bugfixes and optimizations.
Just a small update to allow for more testing and having fun before the bigger release. Just a small update to allow for more testing and having fun before the bigger release.
Changes: Changes:
* Numerous optimizations that require a solid test. Please have fun and report issues! - Numerous optimizations that require a solid test. Please have fun and report issues!
* Small DrawTanks fix. - Small DrawTanks fix.
* Bouncy Castle bounces like it should. - Bouncy Castle bounces like it should.
* Tracer and Smoke Tracer are not causing defense weapons to trigger anymore. - Tracer and Smoke Tracer are not causing defense weapons to trigger anymore.
* In rare cases direct hit was not accounted for correctly. - In rare cases direct hit was not accounted for correctly.
* Manuals updated. - Manuals updated. https://github.com/pkali/scorch_src/releases/tag/v1.16
###### Version 1.13 ###### Version 1.13
@@ -71,13 +280,13 @@ Getting ready for porting the game!
Several heavy optimizations and code cleanups in preparation for an unexpected port. Several heavy optimizations and code cleanups in preparation for an unexpected port.
Changes: Changes:
* Overhaul of AI - Cyborgs, Spoilers, and Choosers aim much better. - Overhaul of AI - Cyborgs, Spoilers, and Choosers aim much better.
* Cyborgs prefer to kill humans. - Cyborgs prefer to kill humans.
* Fine tuning of AI purchases makes the difficulty level aligned with the robot level. - Fine tuning of AI purchases makes the difficulty level aligned with the robot level.
* Fixed a very difficult and elusive bug that was causing tanks to freeze when falling close to the right edge of the screen fixed. - Fixed a very difficult and elusive bug that was causing tanks to freeze when falling close to the right edge of the screen fixed.
* Updated music by @Miker - Updated music by @Miker
* It is now possible to enter tank names with a joystick - all essential game functions are available without touching the keyboard! - It is now possible to enter tank names with a joystick - all essential game functions are available without touching the keyboard!
* Manuals updated with AI strategy information and more. - Manuals updated with AI strategy information and more.
###### Version 1.12 ###### Version 1.12
@@ -86,12 +295,12 @@ Changes:
What is going on? Are we getting crazy or what? What is going on? Are we getting crazy or what?
Changes: Changes:
* Background color indicates the type of walls. This is very useful when the rand option is selected. - Background color indicates the type of walls. This is very useful when the rand option is selected.
* XEGS users requested that console keys are used when no keyboard is attached! We delivered! [SELECT] to select an offensive weapon, [OPTION] to jump into inventory, defensive section, [START] + [OPTION] - immediate Game Over (no confirmation for you keyboardless folks) - XEGS users requested that console keys are used when no keyboard is attached! We delivered! [SELECT] to select an offensive weapon, [OPTION] to jump into inventory, defensive section, [START] + [OPTION] - immediate Game Over (no confirmation for you keyboardless folks)
* A very silly bug detected by our young testers fixed - the game crashed when you built a very high mountain using Dirt Balls :) - A very silly bug detected by our young testers fixed - the game crashed when you built a very high mountain using Dirt Balls :)
* Boxy infinite bounce bug fixed. - Boxy infinite bounce bug fixed.
* Funky bombs bounce off the walls! - Funky bombs bounce off the walls!
* The first letter entered for a tank name was inserted in the wrong spot. How did it work at all? Magic. - The first letter entered for a tank name was inserted in the wrong spot. How did it work at all? Magic.
[ESC] now correctly exits the purchase screen. [ESC] now correctly exits the purchase screen.
@@ -103,8 +312,8 @@ A release lollapalooza.
The silliness indicator crashed. What are we doing? The silliness indicator crashed. What are we doing?
Changes: Changes:
* A very silly buffer overflow bug fixed - it allowed for infinite (well... to the point) lengths of tank names, or rather for overwriting code with arbitrary values. - A very silly buffer overflow bug fixed - it allowed for infinite (well... to the point) lengths of tank names, or rather for overwriting code with arbitrary values.
* Gamefield walls added https://github.com/pkali/scorch_src/issues/50. Choosing a different wall effect from the main options menu allows for a sophisticated tactics change. - Gamefield walls added https://github.com/pkali/scorch_src/issues/50. Choosing a different wall effect from the main options menu allows for a sophisticated tactics change.
###### Version 1.10 ###### Version 1.10
2022-08-21 2022-08-21
@@ -116,22 +325,22 @@ This release brings a swath of gameplay updates and a generous dose of a new sil
Version number bump reflects number of unreleased versions and amount of changes. Version number bump reflects number of unreleased versions and amount of changes.
Changes: Changes:
* Defensive weapons can be activated before the round to make for the unbeatable aiming precision of the robotanks. - Defensive weapons can be activated before the round to make for the unbeatable aiming precision of the robotanks.
* Fixed bug with Long Schlong activation taking one Schlong too many. - Fixed bug with Long Schlong activation taking one Schlong too many.
* Smoke Tracer not disappearing smoke fixed. - Smoke Tracer not disappearing smoke fixed.
* Bug allowing for infinite shooting outside the screen fixed. - Bug allowing for infinite shooting outside the screen fixed.
* Tank colors and P/M sequence as devised by Adam, the gfx artist. Tanks differ more and look better. https://github.com/pkali/scorch_src/issues/119 - Tank colors and P/M sequence as devised by Adam, the gfx artist. Tanks differ more and look better. https://github.com/pkali/scorch_src/issues/119
* New item in the shop - loot box "Buy me!" with a surprise inside. https://github.com/pkali/scorch_src/issues/97 - New item in the shop - loot box "Buy me!" with a surprise inside. https://github.com/pkali/scorch_src/issues/97
* Tank names can have s p a c e s now! https://github.com/pkali/scorch_src/issues/120 - Tank names can have s p a c e s now! https://github.com/pkali/scorch_src/issues/120
* Tanks are mobile now thanks to the new defensive option - Hovercraft https://github.com/pkali/scorch_src/issues/52 - Tanks are mobile now thanks to the new defensive option - Hovercraft https://github.com/pkali/scorch_src/issues/52
* Main atari library switched to a more standard version based on Mapping the Atari - Main atari library switched to a more standard version based on Mapping the Atari
* Huge memory optimizations to allow for the new features. - Huge memory optimizations to allow for the new features.
* Narrow screen in shop / inventory (many bytes saved). - Narrow screen in shop / inventory (many bytes saved).
* Explosion range corrections for a rare event of non-lethal Nuke explosions. - Explosion range corrections for a rare event of non-lethal Nuke explosions.
* Pressing [A] jumps into defensive weapons activation directly. - Pressing [A] jumps into defensive weapons activation directly.
* Elusive randomize force error causing rare hangups for Tosser fixed. - Elusive randomize force error causing rare hangups for Tosser fixed.
* Activation of defensive weapons moved to front. - Activation of defensive weapons moved to front.
* Additional SFX for new weapons. - Additional SFX for new weapons.
###### Version 1.00 ###### Version 1.00
2022-08-13 2022-08-13
@@ -145,18 +354,18 @@ All 48KB+ 8-bit Atari computers are supported.
Thank you @Pecusx and @Miker for your hard work over the last few weeks - I was almost entirely absent because of the real-world attack. Thank you @Pecusx and @Miker for your hard work over the last few weeks - I was almost entirely absent because of the real-world attack.
Most important changes: Most important changes:
* New Game Over screen with a summary of wins, direct hits and earned cash. https://github.com/pkali/scorch_src/issues/9 - New Game Over screen with a summary of wins, direct hits and earned cash. https://github.com/pkali/scorch_src/issues/9
* Tank barrels are drawn procedurally to make aiming easier.. - Tank barrels are drawn procedurally to make aiming easier..
* Various SFX and music updates with new tunes for all parts of the game. https://github.com/pkali/scorch_src/issues/112 - Various SFX and music updates with new tunes for all parts of the game. https://github.com/pkali/scorch_src/issues/112
* AI can use White Flag. - AI can use White Flag.
* 3 different tank shapes https://github.com/pkali/scorch_src/issues/64. - 3 different tank shapes https://github.com/pkali/scorch_src/issues/64.
* All AI levels are programmed. Cyborg is tough! https://github.com/pkali/scorch_src/issues/40 - All AI levels are programmed. Cyborg is tough! https://github.com/pkali/scorch_src/issues/40
* New weapon - Long Schlong! - New weapon - Long Schlong!
* New splash screen. - New splash screen.
* Game mechanics improved. - Game mechanics improved.
* [O] key skips to the Game Over screen. - [O] key skips to the Game Over screen.
* The game works on Atari 800. - The game works on Atari 800.
* Huge amount of optimizations to squeeze the game into 48K. - Huge amount of optimizations to squeeze the game into 48K.
And now the new adventure begins! And now the new adventure begins!
@@ -232,10 +441,10 @@ The new inventory system has been added. Call it by pressing the "I" key or shor
Another significant playability change is #54 - it is not finished yet, but keeping the joystick up or down makes force increase/decrease faster. Also - short press of fire calls Inventory, long press fires the shell. The timings are experimental, please let me know if this needs a modification/improvement. Another significant playability change is #54 - it is not finished yet, but keeping the joystick up or down makes force increase/decrease faster. Also - short press of fire calls Inventory, long press fires the shell. The timings are experimental, please let me know if this needs a modification/improvement.
Tickets closed: Tickets closed:
* https://github.com/pkali/scorch_src/issues/92 - less unnecessary cleaning of the offensive texts - https://github.com/pkali/scorch_src/issues/92 - less unnecessary cleaning of the offensive texts
* https://github.com/pkali/scorch_src/issues/89 - improved collisions with tank - https://github.com/pkali/scorch_src/issues/89 - improved collisions with tank
* https://github.com/pkali/scorch_src/issues/71 - ditto - https://github.com/pkali/scorch_src/issues/71 - ditto
* https://github.com/pkali/scorch_src/issues/11, https://github.com/pkali/scorch_src/issues/26, https://github.com/pkali/scorch_src/issues/8, https://github.com/pkali/scorch_src/issues/20 - new inventory system - https://github.com/pkali/scorch_src/issues/11, https://github.com/pkali/scorch_src/issues/26, https://github.com/pkali/scorch_src/issues/8, https://github.com/pkali/scorch_src/issues/20 - new inventory system
###### Build 143 ###### Build 143
2022-06-05 2022-06-05
@@ -521,4 +730,5 @@ For the first time Scorched Earth for Atari XL/XE (build 103) published.
Together with Pecus we were working on this piece of code for four years and it does not look like it is accelerating so we decided to publish what we have. Last few weeks I was translating source code comments and labels to English to let other people work on this project with us. In other words Scorched Earth becomes an open source project :) Together with Pecus we were working on this piece of code for four years and it does not look like it is accelerating so we decided to publish what we have. Last few weeks I was translating source code comments and labels to English to let other people work on this project with us. In other words Scorched Earth becomes an open source project :)
Now it's your turn to help this idea happen! Now it's your turn to help this idea happen!
...transmission error...former history missing... ...transmission error...former history missing...
+698 -741
View File
File diff suppressed because it is too large Load Diff
-877
View File
@@ -1,877 +0,0 @@
/***************************************/
/* Use MADS http://mads.atari8.info/ */
/* Mode: DLI (char mode) */
/***************************************/
;icl "Scorch50.h"
;icl "../lib/ATARISYS.ASM"
;icl "../lib/macro.hea"
; --- dmsc LZSS player routine on zero page
org $80
chn_copy .ds 9
chn_pos .ds 9
bptr .ds 2
cur_pos .ds 1
chn_bits .ds 1
bit_data .ds 1
fcnt .ds 2
fadr .ds 2
fhlp .ds 2
cloc .ds 1
regA .ds 1
regX .ds 1
regY .ds 1
WIDTH = 40
HEIGHT = 30
; --- BASIC switch OFF
org $2000\ mva #$ff portb\ rts\ ini $2000
; --- MAIN PROGRAM
org $2000
ant dta $C2,a(scr)
dta $02,$82,$02,$02,$82,$02,$82,$02,$82,$02,$02,$02,$82,$02,$82,$82
dta $02,$02,$82,$02,$02,$82,$02,$02,$82,$82,$02,$82,$22
;dta $42,a(verline)
dta $41,a(ant)
;verline
; :37 dta d" "
; dta build
scr ins "Scorch50.scr"
.ds 0*40
.ALIGN $0400
fnt ins "Scorch50.fnt"
ift USESPRITES
.ALIGN $0800
pmg .ds $0300
ift FADECHR = 0
SPRITES
els
.ds $500
eif
eif
song_data
ins 'mmm_16.lzs'
song_end
buffers
.ds 256 * 9
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Song Initialization - this runs in the first tick:
;
.proc init_song
mva #1 bit_data
; Example: here initializes song pointer:
;mwa #song_data song_ptr
; Init all channels:
ldx #8
ldy #0
clear
; Read just init value and store into buffer and POKEY
jsr get_byte
sta POKEY, x
sty chn_copy, x
cbuf
sta buffers + 255
inc cbuf + 2
dex
bpl clear
; Initialize buffer pointer:
sty bptr
sty cur_pos
rts
.endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Wait for next frame
;
.proc wait_frame
lda 20
delay
cmp 20
beq delay
.endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Play one frame of the song
;
.proc play_frame
lda #>buffers
sta bptr+1
lda song_data
sta chn_bits
ldx #8
; Loop through all "channels", one for each POKEY register
chn_loop:
lsr chn_bits
bcs skip_chn ; C=1 : skip this channel
lda chn_copy, x ; Get status of this stream
bne do_copy_byte ; If > 0 we are copying bytes
; We are decoding a new match/literal
lsr bit_data ; Get next bit
bne got_bit
jsr get_byte ; Not enough bits, refill!
ror ; Extract a new bit and add a 1 at the high bit (from C set above)
sta bit_data ;
got_bit:
jsr get_byte ; Always read a byte, it could mean "match size/offset" or "literal byte"
bcs store ; Bit = 1 is "literal", bit = 0 is "match"
sta chn_pos, x ; Store in "copy pos"
jsr get_byte
sta chn_copy, x ; Store in "copy length"
; And start copying first byte
do_copy_byte:
dec chn_copy, x ; Decrease match length, increase match position
inc chn_pos, x
ldy chn_pos, x
; Now, read old data, jump to data store
lda (bptr), y
store:
ldy cur_pos
sta POKEY, x ; Store to output and buffer
sta (bptr), y
skip_chn:
; Increment channel buffer pointer
inc bptr+1
dex
bpl chn_loop ; Next channel
inc cur_pos
.endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Check for ending of song and jump to the next frame
;
; not checking really so the tune gets funky :)))
;lda song_ptr + 1
;cmp #>song_end
;bne wait_frame
;lda song_ptr
;cmp #<song_end
;bne wait_frame
end_loop
rts
song_ptr = get_byte + 1
.proc get_byte
lda song_data+1
inc song_ptr
bne skip
inc song_ptr+1
skip
rts
.endp
main
jsr init_song
; ; copy system font to $a000
; ldx #0
;@ lda $e000,x
; sta $a000,x
; ;lda $e100,x ; i need digits only :]
; ;sta $a100,x
; ;lda $e200,x
; ;sta $a200,x
; ;lda $e300,x
; ;sta $a300,x
; inx
; bne @-
; --- init PMG
ift USESPRITES
mva >pmg pmbase ;missiles and players data address
mva #$03 GRACTL ;enable players and missiles
eif
lda:cmp:req $14 ;wait 1 frame
sei ;stop IRQ interrupts
mva #$00 nmien ;stop NMI interrupts
sta dmactl
;mva #$fe portb ;switch off ROM to get 16k more ram
;mwa #NMI $fffa ;new NMI handler
sta COLOR4
lda #$0E
sta COLOR1
lda #$84
sta COLOR2
lda #$0E
sta COLOR3
lda #$02
VMAIN NMI.vbl,6 ;jsr SetVBL
VDLI DLI.dli_start
mva #1 vscrol
mva #$c0 nmien ;switch on NMI+DLI again
_lp lda trig0 ; FIRE #0
beq stop
lda trig1 ; FIRE #1
beq stop
lda consol ; START
and #1
beq stop
lda skctl
and #$04
bne _lp ;wait to press any key; here you can put any own routine
stop
cli
vmain sysvbv,6
mva #$00 GRACTL ;PMG disabled
tax
sta:rne hposp0,x+
;mva #$ff portb ;ROM switch on
mva #$40 nmien ;only NMI interrupts, DLI disabled
;cli ;IRQ enabled
lda #0
ldx #8
@ sta POKEY,x
dex
bpl @-
;no glitching please (issue #67)
lda #0
sta $D400 ;dmactl
sta $022F ;dmactls
rts ;return to ... DOS
; --- DLI PROGRAM
.local DLI
?old_dli = *
dli_start
dli13
sta regA
sta wsync ;line=8
sta wsync ;line=9
sta wsync ;line=10
sta wsync ;line=11
sta wsync ;line=12
sta wsync ;line=13
c9 lda #$14
sta wsync ;line=14
sta colpm3
DLINEW DLI.dli2 1 0 0
dli2
sta regA
lda >fnt+$400*$01
sta wsync ;line=24
sta chbase
DLINEW dli3 1 0 0
dli3
sta regA
lda >fnt+$400*$02
sta wsync ;line=48
sta chbase
sta wsync ;line=49
sta wsync ;line=50
sta wsync ;line=51
s3 lda #$07
sta wsync ;line=52
sta sizem
DLINEW dli14 1 0 0
dli14
sta regA
stx regX
sty regY
x8 lda #$A3
sta wsync ;line=64
sta hposp3
x9 lda #$AB
sta wsync ;line=65
sta hposm3
sta wsync ;line=66
sta wsync ;line=67
sta wsync ;line=68
sta wsync ;line=69
sta wsync ;line=70
s4 lda #$13
x10 ldx #$A6
sta wsync ;line=71
sta sizem
stx hposm2
s5 lda #$01
x11 ldx #$72
x12 ldy #$62
sta wsync ;line=72
sta sizep2
sta sizep3
stx hposp2
sty hposp3
x13 lda #$A9
sta wsync ;line=73
sta hposp1
DLINEW dli4 1 1 1
dli4
sta regA
lda >fnt+$400*$03
sta wsync ;line=80
sta chbase
DLINEW dli5 1 0 0
dli5
sta regA
stx regX
lda >fnt+$400*$04
sta wsync ;line=112
sta chbase
sta wsync ;line=113
sta wsync ;line=114
sta wsync ;line=115
sta wsync ;line=116
sta wsync ;line=117
sta wsync ;line=118
s6 lda #$07
x14 ldx #$A3
sta wsync ;line=119
sta sizem
stx hposm1
s7 lda #$01
x15 ldx #$93
sta wsync ;line=120
sta sizep1
stx hposp1
DLINEW dli15 1 1 0
dli15
sta regA
stx regX
sta wsync ;line=128
sta wsync ;line=129
sta wsync ;line=130
sta wsync ;line=131
x16 lda #$4A
sta wsync ;line=132
sta hposp1
c10 lda #$D4
sta wsync ;line=133
sta colpf2
s8 lda #$C3
x17 ldx #$5A
sta wsync ;line=134
sta sizem
stx hposm3
DLINEW dli6 1 1 0
dli6
sta regA
stx regX
sty regY
lda >fnt+$400*$05
sta wsync ;line=136
sta chbase
sta wsync ;line=137
sta wsync ;line=138
sta wsync ;line=139
sta wsync ;line=140
sta wsync ;line=141
sta wsync ;line=142
s9 lda #$C7
x18 ldx #$A9
sta wsync ;line=143
sta sizem
stx hposm1
s10 lda #$D7
x19 ldx #$9E
c11 ldy #$02
sta wsync ;line=144
sta sizem
stx hposm2
sty colpm2
sta wsync ;line=145
c12 lda #$04
sta wsync ;line=146
sta colpm1
sta wsync ;line=147
sta wsync ;line=148
sta wsync ;line=149
s11 lda #$00
x20 ldx #$74
c13 ldy #$02
sta wsync ;line=150
sta sizep3
stx hposp3
sty colpm3
sta wsync ;line=151
sta wsync ;line=152
sta wsync ;line=153
sta wsync ;line=154
sta wsync ;line=155
sta wsync ;line=156
sta wsync ;line=157
c14 lda #$04
sta wsync ;line=158
sta colpf0
DLINEW dli7 1 1 1
dli7
sta regA
lda >fnt+$400*$06
sta wsync ;line=160
sta chbase
DLINEW dli8 1 0 0
dli8
sta regA
stx regX
sty regY
lda >fnt+$400*$07
sta wsync ;line=184
sta chbase
sta wsync ;line=185
s12 lda #$00
x21 ldx #$8E
c15 ldy #$08
sta wsync ;line=186
sta sizep2
stx hposp2
sty colpm2
x22 lda #$4C
c16 ldx #$0E
sta wsync ;line=187
sta hposp3
stx colpm3
c17 lda #$0A
c18 ldx #$34
sta wsync ;line=188
sta colpf1
stx colpm3
s13 lda #$43
x23 ldx #$49
sta wsync ;line=189
sta sizem
stx hposm3
c19 lda #$08
c20 ldx #$34
sta wsync ;line=190
sta colpf1
stx colpm2
sta wsync ;line=191
c21 lda #$0A
sta wsync ;line=192
sta colpf1
c22 lda #$08
sta wsync ;line=193
sta colpf1
c23 lda #$0A
sta wsync ;line=194
sta colpf1
c24 lda #$34
sta wsync ;line=195
sta colpf2
c25 lda #$0C
sta wsync ;line=196
sta colpf1
c26 lda #$0A
sta wsync ;line=197
sta colpf1
c27 lda #$0C
sta wsync ;line=198
sta colpf1
sta wsync ;line=199
sta wsync ;line=200
c28 lda #$0E
sta wsync ;line=201
sta colpf1
c29 lda #$0C
sta wsync ;line=202
sta colpf1
c30 lda #$0E
sta wsync ;line=203
sta colpf1
c31 lda #$0C
sta wsync ;line=204
sta colpf1
c32 lda #$0E
sta wsync ;line=205
sta colpf1
DLINEW dli16 1 1 1
dli16
sta regA
sta wsync ;line=208
sta wsync ;line=209
c33 lda #$0C
sta wsync ;line=210
sta colpf1
c34 lda #$0E
sta wsync ;line=211
sta colpf1
c35 lda #$0C
sta wsync ;line=212
sta colpf1
DLINEW dli9 1 0 0
dli9
sta regA
stx regX
sty regY
lda >fnt+$400*$08
c36 ldx #$0A
sta wsync ;line=216
sta chbase
stx colpf1
c37 lda #$0C
sta wsync ;line=217
sta colpf1
c38 lda #$0A
x24 ldx #$9D
c39 ldy #$34
sta wsync ;line=218
sta colpf1
stx hposm1
sty colpm1
s14 lda #$03
x25 ldx #$7D
sta wsync ;line=219
sta sizep3
stx hposp3
c40 lda #$08
s15 ldx #$13
x26 ldy #$45
sta wsync ;line=220
sta colpf1
stx sizem
sty hposm2
s16 lda #$03
x27 ldx #$59
sta wsync ;line=221
sta sizep2
stx hposp2
s17 lda #$53
x28 ldx #$49
x29 ldy #$79
sta wsync ;line=222
sta sizem
stx hposp1
sty hposm3
c41 lda #$06
c42 ldx #$00
sta wsync ;line=223
sta colpf1
stx colpf2
lda >fnt+$400*$01
s18 ldx #$50
x30 ldy #$44
sta wsync ;line=224
sta chbase
stx sizem
sty hposm0
sta wsync ;line=225
c43 lda #$08
sta wsync ;line=226
sta colpf1
c44 lda #$0C
sta wsync ;line=227
sta colpf1
sta wsync ;line=228
sta wsync ;line=229
c45 lda #$0E
sta wsync ;line=230
sta colpf1
DLINEW dli10 1 1 1
dli10
sta regA
lda >fnt+$400*$00
sta wsync ;line=232
sta chbase
;DLINEW dli11 1 0 0
lda regA
rti
;dli11
; sta regA
;
; lda #>$a000 ; system font
; sta wsync ;line=232
; sta chbase
; lda #$01
; sta gtictl
;
; lda regA
; rti
.endl
; ---
CHANGES = 1
FADECHR = 0
SCHR = 127
dliv = $0200
; ---
.proc NMI
bit nmist
bpl VBL
jmp DLI.dli_start
VBL
sta regA
stx regX
sty regY
;sta nmist ;reset NMI flag
mwa #ant dlptr ;ANTIC address program
mva #@dmactl(standard|dma|lineX1|players|missiles) dmactl ;set new screen width
inc cloc ;little timer
; Initial values
lda >fnt+$400*$00
sta chbase
c0 lda #$00
sta colbak
c1 lda #$0E
sta colpf1
c2 lda #$84
sta colpf2
c3 lda #$0E
sta colpf3
lda #$02
sta CHACTL
lda #$01
sta PRIOR
sta sizep0
s0 lda #$03
sta sizem
x0 lda #$D0
sta hposp0
x1 lda #$28
sta hposm0
c4 lda #$00
sta colpm0
x2 lda #$A2
sta hposm3
c5 lda #$0E
sta colpm3
s1 lda #$00
sta sizep2
sta sizep3
x3 lda #$92
sta hposp2
x4 lda #$8A
sta hposp3
c6 lda #$14
sta colpm2
s2 lda #$00
sta sizep1
x5 lda #$9A
sta hposp1
c7 lda #$14
sta colpm1
x6 lda #$A4
sta hposm2
x7 lda #$A6
sta hposm1
c8 lda #$00
sta colpf0
mwa #DLI.dli_start dliv ;set the first address of DLI interrupt
;this area is for yours routines
jsr play_frame
quit
lda regA
ldx regX
ldy regY
jmp sysvbv
.endp
; ---
ini main
; ---
opt l-
.MACRO SPRITES
missiles
.he 00 00 00 00 00 00 00 00 03 03 C3 03 03 03 03 03
.he 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
.he 03 03 03 03 03 03 03 03 03 83 83 83 C3 C3 C3 C3
.he C3 C3 C3 C3 C3 E3 E3 E3 E3 E3 E3 F3 F3 F3 F3 FB
.he FB FB FB FB FF FF FF FF F3 33 83 83 83 83 C3 D3
.he D3 D3 13 03 03 03 03 03 03 03 03 03 03 03 03 03
.he 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
.he 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 0F
.he 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 03 03 03 03 C3 C3
.he C3 C3 C3 C3 C3 C3 C3 C3 C3 D3 FF FF 3F 3F 3F 3F
.he 3F 3F 33 13 03 03 03 03 03 03 03 03 03 03 03 03
.he 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
.he 03 03 03 03 03 03 03 43 43 C3 C3 C3 C3 03 03 03
.he 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
.he 03 03 0F 0F 3F 3F FF FC FE FE FF DB 03 03 03 03
.he 03 03 03 03 03 03 03 03 00 00 00 00 00 00 00 00
player0
.he 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.he FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00
player1
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 F0 FC FE FE FF FF FF FF
.he FF 0F 0F 0F 0F 0F 0F 0F 0F 0F 07 07 07 07 07 07
.he 03 03 03 FF FF FF FF FF CF CF FF FF FF FF FF 9F
.he 9F FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00
.he 00 F0 F0 F0 F0 78 F8 78 78 78 78 38 78 38 3C 3C
.he 3C 3C 1C 3C 1C 1C 1C 1C 1E 1E 1E 1E 0E 1E 0E 0E
.he 0E 0F 07 0F 07 0F 07 07 07 07 07 07 06 06 06 06
.he FF FF FF FF FF FF FF FF FF FF FF 00 00 3E 3F 7F
.he 7F 7F 7F 7F 7F 7F 7F 3F 3F 3F 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 FF FF FF FF FF FF 00 00 00 00
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
player2
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF
.he FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 FF FF FF FF FF 99 99 FF FF FF FF FF 33
.he 33 FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00
.he 00 00 80 F0 F8 F8 F8 FC FC FC FC FC FC FC FC FC
.he FC FE FE FE FE FE FE FF FF FF FF FF FF FF FE FC
.he F8 F8 F8 F8 F0 F0 F0 F0 F0 F0 F0 F0 E0 E0 E0 E0
.he E0 E0 E0 FC FE FE FF FF 8F 87 87 87 07 07 07 07
.he 07 07 07 07 07 07 07 03 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 F8 FC FC FE FE FF FF 00 00 00
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 FF FF FF FF FF FF 00 00 00 00
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
player3
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 01 07 0F 1F 1F 3F 3F 7F
.he 7F 78 78 F0 F0 F0 F0 F8 F8 F8 78 7C 7C 7C 3C 3E
.he 3E 3E 1E 1F 1F 1F 0F 0F 0F 0F 0F 1F 1F 1F 1F 1F
.he 1F 3F 3F 3F 3F 3F 3F 3F FF 7F 7F 3F 3F 1F 1F 0F
.he 1F 1F 1F 3F 3F 3F 3F 3F 3F 3B 30 30 30 30 30 30
.he 30 30 30 30 38 3E 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F
.he 7F 7F 7F 7F 7F 7F 7F FF FF FF FF FF FF FF FF FF
.he FF FF FF FF FF FF FF FF 7F 7F 7F 7F 7F 7F FF FF
.he FF FF FF FF FE FE FE FE FE FE FE FE FC 1C FF 7E
.he 7E FE FE FE FE FF FF FF 7F 7E 7E 3C 00 00 00 00
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 7C FE FE FF FF FF 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 FF FF FF FF FF FF FF FF FF 00 00 00 00
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.ENDM
USESPRITES = 1
.MACRO DLINEW
mva <:1 dliv
ift [>?old_dli]<>[>:1]
mva >:1 dliv+1
eif
ift :2
lda regA
eif
ift :3
ldx regX
eif
ift :4
ldy regY
eif
rti
.def ?old_dli = *
.ENDM
Binary file not shown.
Binary file not shown.
+5 -6
View File
@@ -1,10 +1,10 @@
icl '../lib/atari.hea' icl '../lib/atari.hea'
org $2000 org $2000
joytest joytest
mva #0 dmactls mva #0 dmactls
@ @
lda trig0 lda trig0
beq pressed beq pressed
@@ -15,6 +15,5 @@ pressed
;ora jstick0 ;ora jstick0
sta colbak sta colbak
jmp @- jmp @-
run joytest run joytest
File diff suppressed because it is too large Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+152
View File
@@ -0,0 +1,152 @@
; --- dmsc LZSS player routine
song_data
ins 'mmm_16.lzs'
song_end
buffers
.ds 256 * 9
POKEY2 = POKEY+$10 ; stereo
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Song Initialization - this runs in the first tick:
;
.proc init_song
; pokeys init
lda #3 ; stereo
sta POKEY+$0f ; stereo
sta POKEY2+$0f ; stereo
mva #1 bit_data
; Example: here initializes song pointer:
;mwa #song_data song_ptr
; Init all channels:
ldx #8
ldy #0
clear
; Read just init value and store into buffer and POKEY
jsr get_byte
sta POKEY, x
sta POKEY2,x ; stereo
sta stereo_buff,x ; stereo
sty chn_copy, x
cbuf
sta buffers + 255
inc cbuf + 2
dex
bpl clear
; Initialize buffer pointer:
sty bptr
sty cur_pos
rts
.endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Wait for next frame
;
.proc wait_frame
lda 20
delay
cmp 20
beq delay
.endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Play one frame of the song
;
.proc play_frame
ldx #8 ; stereo
@ lda stereo_buff,x ; stereo
sta POKEY2,x ; stereo
dex ;stereo
bpl @- ; stereo
lda #>buffers
sta bptr+1
lda song_data
sta chn_bits
ldx #8
; Loop through all "channels", one for each POKEY register
chn_loop:
lsr chn_bits
bcs skip_chn ; C=1 : skip this channel
lda chn_copy, x ; Get status of this stream
bne do_copy_byte ; If > 0 we are copying bytes
; We are decoding a new match/literal
lsr bit_data ; Get next bit
bne got_bit
jsr get_byte ; Not enough bits, refill!
ror ; Extract a new bit and add a 1 at the high bit (from C set above)
sta bit_data ;
got_bit:
jsr get_byte ; Always read a byte, it could mean "match size/offset" or "literal byte"
bcs store ; Bit = 1 is "literal", bit = 0 is "match"
sta chn_pos, x ; Store in "copy pos"
jsr get_byte
sta chn_copy, x ; Store in "copy length"
; And start copying first byte
do_copy_byte:
dec chn_copy, x ; Decrease match length, increase match position
inc chn_pos, x
ldy chn_pos, x
; Now, read old data, jump to data store
lda (bptr), y
store:
ldy cur_pos
sta POKEY,x ; Store to output and buffer
sta stereo_buff,x ; stereo
sta (bptr), y
skip_chn:
; Increment channel buffer pointer
inc bptr+1
dex
bpl chn_loop ; Next channel
inc cur_pos
.endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Check for ending of song and jump to the next frame
;
; not checking really so the tune gets funky :)))
;lda song_ptr + 1
;cmp #>song_end
;bne wait_frame
;lda song_ptr
;cmp #<song_end
;bne wait_frame
end_loop
rts
song_ptr = get_byte + 1
.proc get_byte
lda song_data+1
inc song_ptr
bne skip
inc song_ptr+1
skip
rts
.endp
stereo_buff ; stereo
.ds 9 ; stereo
Binary file not shown.
+73
View File
@@ -0,0 +1,73 @@
; ----------------------------------
; RastaConverter by Ilmenit v.Beta7
; ----------------------------------
missiles
.ds $100
player0
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 60 A0 26 1E 00 00 00 00
.he 08 04 0E 0E 0F 0F 1E 07 03 02 02 C7 D7 F7 F7 77
.he 77 37 F7 37 57 46 6E B0 B0 A0 C1 60 7C 1E 07 05
.he 01 03 03 07 07 19 1F 1B 1B B2 53 BB 43 D3 60 38
.he 01 7C 7B 41 C3 87 E7 85 75 02 C8 C8 9F 12 1E 9E
.he 1E 9E 9E 9E F2 EB BF 1F 3F C7 00 7F 7F 7F 7F 7F
.he 3F 3D 1D 0D 38 38 0F 1F 00 0C 04 04 08 10 E0 C0
.he E4 E2 E0 E8 E0 7A EE FD F4 78 7F 7B A1 31 C5 56
.he C6 D0 3C F7 90 CF 28 08 2C 3C 3C 3C 36 1D 14 36
.he 32 30 38 1C 1E 38 70 FC FB F3 FE 8F D7 EF 43 83
.he BA F9 F8 F8 1C 1C 0C 04 04 04 04 FA FB FA 30 70
.he 70 78 F8 38 3F 00 03 03 0B 0F 07 13 03 03 13 C0
.he CA 9A BF 9F 3F 5B 1F 9F FF CF 59 C4 0B EC 51 8F
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
player1
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 FE FE FE FE FE FF 03 03
.he FF FF FF FF FF 01 FF FF DF DF DF 0F 1F 0F 1F 0F
.he 1F 0F 1F 0E 1E CE DE DE FE 5F 3E 1E 83 C6 C3 C6
.he C3 C7 C7 43 E7 67 E7 77 7F 7F 3F 3F 7F 3F 3E 00
.he F0 3C E7 E0 60 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 77
.he 77 07 07 5F 07 7F C7 FF FF FF FF 3E FE 0C C0 C0
.he D8 C0 F0 C0 87 00 00 FC 01 00 20 20 50 10 50 5C
.he 4C 44 60 6C 3C 38 C0 C8 98 39 1D 1F 1E C8 00 01
.he 01 01 3F F2 F3 F6 E7 F7 D5 07 77 F7 FF FF DF 9F
.he 6F FF FF BF FF FF 48 80 80 80 80 FF FF FF FF FF
.he FF FF FF 7F 7F 7F 7F 5F DF FF FD FF FF FE F8 07
.he 67 3F 27 7F 27 3F 27 7F DF A0 F8 E4 F8 E4 FC E0
.he D8 E0 D8 20 95 E2 3F E0 7A E2 9E 81 5A CE 83 8C
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
player2
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 60 81 71 93 73 BB F9 BF
.he F8 BF FD FC FC FC FC 8C 0C 88 0C 8C 38 38 B8 3A
.he BA B8 3A BA BA B9 AC 0C CC 0C CC 1C 9C 7C 3C FC
.he FA FC FE FC F4 F2 F0 72 72 26 52 22 C2 06 C2 22
.he 38 C0 C0 0E 00 00 00 10 00 12 10 10 30 30 30 30
.he 70 30 10 30 FF EC 3F EC 3F EC 3F ED 3C EC 3F ED
.he 3F 6C 3F 2D 3F FE 10 18 1E 1E 1E 1C 1D E4 98 E4
.he E8 DC E8 38 20 50 A8 58 AB 7E 36 1B E0 02 21 10
.he 10 EC 20 05 EE 82 64 61 6D 24 6D 78 30 9C 75 5D
.he 5D 1D 3D 57 4D E7 E7 24 0A 0C 38 1A 08 08 0C 0C
.he 38 1C 18 0E 3E 3C 3E 3E 3E 3A 3A 3C 37 7A 3E 7E
.he 3E 3F 10 2A 19 3A 39 1B 19 38 3E 38 18 3B 00 E0
.he 50 C0 72 F8 68 DE 0A FF 1E 5A 1E 2B 16 FB DF FB
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
player3
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 06 DF CE FF 6E FF 60 47
.he 60 E7 C0 D0 D8 D0 D8 DE CE EE EE E4 E6 E4 F1 F4
.he F0 F0 D8 D8 D8 D0 D0 C6 C1 C6 D4 DF FF FF FF FE
.he FE FE FE FE FE FE FE FF FF FF FF FF FE FF FE FF
.he FF FE FE FF FF FF FF FF FF FF FF FC FE FF FF FF
.he FF FF FF FF FF FF FF FF FF FF FF 03 43 F2 DF FF
.he DD FF 9F FE BF FE 1E FE 1C FC FF 4E DE 2A 1C 00
.he 04 2F 10 8E CC 5C 80 D0 A0 40 20 00 3A 0F FE 16
.he 01 BB 5B DB 53 53 F3 F3 F3 E3 F3 F3 F3 F3 F6 FF
.he FF FF FF FF FF FF 15 E1 92 C2 36 6B FF FF FF FE
.he FE FA FC FA FC F8 FC FD 07 1F 2E 7F 7F FF 7F DF
.he 7F FF 7F DF 7F DF 7F FF 7F FF 3A FF E7 FF E7 7F
.he A7 FF 27 1F 0F 07 07 20 3F 3F 1F 38 F0 62 D0 E0
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
File diff suppressed because it is too large Load Diff
+41
View File
@@ -0,0 +1,41 @@
; ----------------------------------
; RastaConverter by Ilmenit v.Beta7
; ----------------------------------
; Initial values
lda #$0E
sta colpf0
lda #$96
sta colpf1
lda #$88
sta colpf2
lda #$00
sta COLBAK
lda #$74
sta COLPM0
lda #$EE
sta COLPM1
lda #$85
sta COLPM2
lda #$95
sta COLPM3
lda #$5E
sta HPOSP0
lda #$9F
sta HPOSP1
lda #$45
sta HPOSP2
lda #$30
sta HPOSP3
lda #$0
ldx #$0
ldy #$0
; Set proper count of wsyncs
:2 sta wsync
; Set proper picture height
PIC_HEIGHT = 200
Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

+282
View File
@@ -0,0 +1,282 @@
/***************************************/
/* Use MADS http://mads.atari8.info/ */
/* Mode: GED- (bitmap mode) */
/***************************************/
icl "splash.h"
; --- dmsc LZSS player routine on zero page
org $80
chn_copy .ds 9
chn_pos .ds 9
bptr .ds 2
cur_pos .ds 1
chn_bits .ds 1
bit_data .ds 1
; ---
org $00
fcnt .ds 2
fadr .ds 2
fhlp .ds 2
cloc .ds 1
regA .ds 1
regX .ds 1
regY .ds 1
byt2 .ds 1
zc .ds ZCOLORS
* --- BASIC switch OFF
org $2000\ mva #$ff portb\ rts\ ini $2000
* --- MAIN PROGRAM
org $2010
IFT PIC_HEIGHT>=204
scr ins "output.png.mic", 0, 8160
:16 .byte 0
ins "output.png.mic" , +8160
ELS
scr ins "output.png.mic"
EIF
.ifdef nil_used
nil :8*40 brk
eif
.ALIGN $0400
ant ANTIC_PROGRAM scr,ant
fnt
ift USESPRITES
.ALIGN $0800
.ds $0300
pmg SPRITES
eif
FontSplash
ins '../../artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt'
mother
; dta d" The Mother of All Games "
dta d" Father Unknown of All Games "
icl "lzss_player.asm" ; player (and data) for splash music
main
jsr init_song
* --- init PMG
ift USESPRITES
mva >pmg pmbase ;missiles and players data address
mva #$03 pmcntl ;enable players and missiles
eif
lda:cmp:req $14 ;wait 1 frame
sei ;stop interrups
mva #$00 nmien ;stop all interrupts
mva #$fe portb ;switch off ROM to get 16k more ram
ZPINIT
////////////////////
// RASTER PROGRAM //
////////////////////
; jmp line239
jmp raster_program_end
LOOP lda vcount ;synchronization for the first screen (picture) line
cmp #$02
;sta colpf0
;sta colpm0
;sta colbak
bne LOOP
mva #%00111110 dmactl ;set new screen width
mva <ant dlptr
mva >ant dlptr+1
icl "output.png.rp.ini"
;--- 16 lines down ---- !!!
:16 sta wsync
; wait 13 cycles !!!
:4 nop
inc byt2
;--- wait 18 cycles
; jsr _rts
; inc byt3
;--- set global offset (23 cycles)
jsr _rts
cmp byt3\ pha:pla
;--- empty line
jsr wait54cycle
inc byt2
icl "output.png.rp"
raster_program_end
lda >FontSplash
sta chbase
c0 lda #$00
sta colbak
c1 lda #$00
sta colpf0
c2 lda #$02
sta colpf1
c3 lda #$08
sta colpf2
c4 lda #$00
sta colpf3
s0 lda #$03
sta sizep0
sta sizep1
sta sizep2
sta sizep3
mva #$ff sizem
sta grafm
mva #$20 hposm0
mva #$28 hposm1
mva #$d0 hposm2
mva #$d8 hposm3
mva #$02 pmcntl
lda #$14
sta gtictl
//--------------------
// EXIT
//--------------------
lda trig0 ; FIRE #0
beq stop
lda trig1 ; FIRE #1
beq stop
lda consol ; START
and #1
beq stop
lda skctl ; ANY KEY
and #$04
bne skp
stop mva #$00 pmcntl ;PMG disabled
tax
sta:rne hposp0,x+
; silent
lda #0
ldx #8
@ sta POKEY,x
sta POKEY2,x ; stereo
dex
bpl @-
;no glitching please (issue #67)
lda #0
sta $D400 ;dmactl
sta $022F ;dmactls
mva #$ff portb ;ROM switch on
mva #$40 nmien ;only NMI interrupts, DLI disabled
cli ;IRQ enabled
rts ;return to ... DOS
skp
//--------------------
jsr play_frame
jmp LOOP
;---
wait54cycle
:2 inc byt2
wait44cycle
inc byt3
nop
wait36cycle
inc byt3
jsr _rts
wait18cycle
inc byt3
_rts rts
byt3 brk
;---
.MACRO ANTIC_PROGRAM
dta $70,$70
:+8 dta $4e,a(:1+$0000+#*40)
:+8 dta $4e,a(:1+$0140+#*40)
:+8 dta $4e,a(:1+$0280+#*40)
:+8 dta $4e,a(:1+$03C0+#*40)
:+8 dta $4e,a(:1+$0500+#*40)
:+8 dta $4e,a(:1+$0640+#*40)
:+8 dta $4e,a(:1+$0780+#*40)
:+8 dta $4e,a(:1+$08C0+#*40)
:+8 dta $4e,a(:1+$0A00+#*40)
:+8 dta $4e,a(:1+$0B40+#*40)
:+8 dta $4e,a(:1+$0C80+#*40)
:+8 dta $4e,a(:1+$0DC0+#*40)
:+8 dta $4e,a(:1+$0F00+#*40)
:+8 dta $4e,a(:1+$1040+#*40)
:+8 dta $4e,a(:1+$1180+#*40)
:+8 dta $4e,a(:1+$12C0+#*40)
:+8 dta $4e,a(:1+$1400+#*40)
:+8 dta $4e,a(:1+$1540+#*40)
:+8 dta $4e,a(:1+$1680+#*40)
:+8 dta $4e,a(:1+$17C0+#*40)
:+8 dta $4e,a(:1+$1900+#*40)
:+8 dta $4e,a(:1+$1A40+#*40)
:+8 dta $4e,a(:1+$1B80+#*40)
:+8 dta $4e,a(:1+$1CC0+#*40)
:+8 dta $4e,a(:1+$1E00+#*40)
; :+4 dta $4e,a(:1+$1F40+#*40)
; :+4 dta $4e,a(:1+$1FF0+#*40)
; :+8 dta $4e,a(:1+$2090+#*40)
; :+8 dta $4e,a(:1+$21D0+#*40)
; :+8 dta $4e,a(:1+$2310+#*40)
; :+8 dta $4e,a(:1+$2450+#*40)
dta $00
dta $42,a(mother)
dta $41,a(:2)
.ENDM
CL
.MACRO ZPINIT
.ENDM
ZCOLORS = 0
;---
ini main
;---
opt l-
.MACRO SPRITES
icl "output.png.pmg"
.ENDM
USESPRITES = 1
+55
View File
@@ -0,0 +1,55 @@
.enum @@dmactl
blank = %00
narrow = %01
standard= %10
wide = %11
missiles= %100
players = %1000
lineX1 = %10000
lineX2 = %00000
dma = %100000
.ende
.enum @@pmcntl
missiles= %1
players = %10
trigs = %100
.ende
.enum @@gtictl
prior0 = %0
prior1 = %1
prior2 = %10
prior4 = %100
prior8 = %1000
ply5 = %10000 ; Fifth Player Enable
mlc = %100000 ; Multiple Color Player Enable
mode9 = %01000000
mode10 = %10000000
mode11 = %11000000
.ende
* ---------------------------------------------------------------------------------------------
* --- GTIA
* ---------------------------------------------------------------------------------------------
gtictl = PRIOR ; rejestr kontroli uk³adu GTIA
gtiactl = gtictl
pmcntl = GRACTL ; rejestr kontroli graczy i pocisków
* ---------------------------------------------------------------------------------------------
* --- POKEY
* ---------------------------------------------------------------------------------------------
irqens = $0010 ; rejestr-cieñ IRQEN
irqstat = $0011 ; rejestr-cieñ IRQST
skstres = SKRES ; rejestr statusu z³¹cza szeregowego (Z)
* ---------------------------------------------------------------------------------------------
* --- ANTIC
* ---------------------------------------------------------------------------------------------
chrctl = CHACTL ; rejestr kontroli wyœwietlania znaków
+70 -68
View File
@@ -53,81 +53,83 @@ L49 dta d"DIE, TANK-SCUM!"
L50 dta d"I'M GONNA BREAK YOUR FACE!" L50 dta d"I'M GONNA BREAK YOUR FACE!"
L51 dta d"MAMA SAID KNOCK YOU OUT!" L51 dta d"MAMA SAID KNOCK YOU OUT!"
L52 dta d"I HOPE YOU ENJOY PAIN!" L52 dta d"I HOPE YOU ENJOY PAIN!"
L53 dta d"HOW'D YOU LIKE ONE ACROSS YOUR LIPS?" ;(sanford and son)
;-------------------------------- ;--------------------------------
L53 dta d"PARTING IS SUCH SWEET SORROW... NOT!" L54 dta d"PARTING IS SUCH SWEET SORROW... NOT!"
L54 dta d"UGH!" L55 dta d"UGH!"
L55 dta d"AARGH!" L56 dta d"AARGH!"
L56 dta d"AAAGGHHH!" L57 dta d"AAAGGHHH!"
L57 dta d"I'M MELTING!" L58 dta d"I'M MELTING!"
L58 dta d"OOF.." L59 dta d"OOF.."
L59 dta d"OH!" L60 dta d"OH!"
L60 dta d"EEEK!" L61 dta d"EEEK!"
L61 dta d"AACCH!" L62 dta d"AACCH!"
L62 dta d"I HATE IT WHEN THAT HAPPENS." L63 dta d"I HATE IT WHEN THAT HAPPENS."
L63 dta d"ONE DIRECT HIT CAN RUIN YOUR WHOLE DAY." L64 dta d"ONE DIRECT HIT CAN RUIN YOUR WHOLE DAY."
L64 dta d"OH NO!" L65 dta d"OH NO!"
L65 dta d"NOT ME!" L66 dta d"NOT ME!"
L66 dta d"OUCH." L67 dta d"OUCH."
L67 dta d"OH NO, NOT AGAIN." L68 dta d"OH NO, NOT AGAIN."
L68 dta d"ANOTHER ONE BITES THE DUST." L69 dta d"ANOTHER ONE BITES THE DUST."
L69 dta d"GOODBYE." L70 dta d"GOODBYE."
L70 dta d"HELP ME!" L71 dta d"HELP ME!"
L71 dta d"FAREWELL, CRUEL WORLD." L72 dta d"FAREWELL, CRUEL WORLD."
L72 dta d"REMEMBER THE ALAMO!" L73 dta d"REMEMBER THE ALAMO!"
L73 dta d"OH MAN!" L74 dta d"OH MAN!"
L74 dta d"DOOUGH!" L75 dta d"DOOUGH!"
L75 dta d"ANOTHER DAY, ANOTHER BOMB." L76 dta d"NEW DAY, NEW BOMB."
L76 dta d"THIS IS THE END, MY ONLY FRIEND." L77 dta d"THIS IS THE END, MY ONLY FRIEND."
L77 dta d"IT'S ALL OVER." L78 dta d"VERY FUNNY."
L78 dta d"THE FAT LADY SANG." L79 dta d"THE FAT LADY SANG."
L79 dta d"WHY DOES EVERYTHING HAPPEN TO ME?" L80 dta d"WHY DOES EVERYTHING HAPPEN TO ME?"
L80 dta d"I'M GOING DOWN." L81 dta d"I'M GOING DOWN."
L81 dta d"I'VE GOT A BAD FEELING ABOUT THIS." L82 dta d"I'VE GOT A BAD FEELING ABOUT THIS."
L82 dta d"CRAPOLA." L83 dta d"CRAPOLA."
L83 dta d"POW!" L84 dta d"POW!"
L84 dta d"BIF!" L85 dta d"BIF!"
L85 dta d"BAM!" L86 dta d"BAM!"
L86 dta d"ZONK!" L87 dta d"ZONK!"
L87 dta d"I SHOULD'VE LISTENED TO MY MOTHER..." L88 dta d"I SHOULD'VE LISTENED TO MY MOTHER."
L88 dta d"NO... A BUD LIGHT!" L89 dta d"I WALK THROUGH THE VALLEY OF THE SHADOW..."
L89 dta d"WHAT WAS THAT NOISE?" L90 dta d"WHAT WAS THAT NOISE?"
L90 dta d"MAMA SAID THERE'D BE DAYS LIKE THIS." L91 dta d"MAMA SAID THERE'D BE DAYS LIKE THIS."
L91 dta d"ITS JUST ONE OF THOSE DAYS..." L92 dta d"ITS JUST ONE OF THOSE DAYS..."
L92 dta d"I SEE A BRIGHT LIGHT..." L93 dta d"I SEE A BRIGHT LIGHT..."
L93 dta d"MOMMY? IS THAT YOU?" L94 dta d"MOMMY? IS THAT YOU?"
L94 dta d"I LET YOU HIT ME!" L95 dta d"I LET YOU HIT ME!"
L95 dta d"SUCKER SHOT!" L96 dta d"SUCKER SHOT!"
L96 dta d"I DIDN'T WANT TO LIVE ANYWAY." L97 dta d"I DIDN'T WANT TO LIVE ANYWAY."
L97 dta d"-<SOB>-" L98 dta d"-<SOB>-"
L98 dta d"WAS THAT AS CLOSE AS I THINK IT WAS?" L99 dta d"WAS THAT AS CLOSE AS I THINK IT WAS?"
L99 dta d"JOIN THE ARMY, SEE THE WORLD THEY SAID." L100 dta d"JOIN THE ARMY, SEE THE WORLD THEY SAID."
L100 dta d"IT WASN'T JUST A JOB IT WAS AN ADVENTURE!" L101 dta d"IT WASN'T JUST A JOB IT WAS AN ADVENTURE!"
L101 dta d"I DIDN'T LIKE VIOLENCE ANYWAY!" L102 dta d"I DIDN'T LIKE VIOLENCE ANYWAY!"
L102 dta d"I THOUGHT YOU LIKED ME?" L103 dta d"I THOUGHT YOU LIKED ME?"
L103 dta d"CTO XYEB" L104 dta d"CTO XYEB"
L104 dta d"I THINK THIS GUY'S A LITTLE CRAZY." L105 dta d"I THINK THIS GUY'S A LITTLE CRAZY."
L105 dta d"SOMEHOW I DON'T FEEL LIKE KILLING ANYMORE." L106 dta d"SOMEHOW I DON'T FEEL LIKE KILLING ANYMORE."
L106 dta d"HEY! KILLIN' AIN'T COOL." L107 dta d"HEY! KILLIN' AIN'T COOL."
L107 dta d"GEE... THANKS." L108 dta d"GEE... THANKS."
L108 dta d"I'VE FALLEN AND I CAN'T GET UP!" L109 dta d"I'VE FALLEN AND I CAN'T GET UP!"
L109 dta d"911?" L110 dta d"911?"
L110 dta d"OH NO! HERE I BLOW AGAIN!" L111 dta d"OH NO! HERE I BLOW AGAIN!"
L111 dta d"I'LL BE BACK..." L112 dta d"I'LL BE BACK..."
L112 dta d"HEY - I'VE GOT LAWYERS." L113 dta d"I'VE GOT LAWYERS!"
L113 dta d"TIME TO CALL 1-900-SUE-TANK." L114 dta d"CALL 1-900-SUE-TANK."
L115 dta d"YOU BIG DUMMY!" ;(sanford and son)
LEND LEND
OffensiveTextTableL OffensiveTextTableL
dta <L0,<L1,<L2,<L3,<L4,<L5,<L6,<L7,<L8,<L9,<L10,<L11,<L12,<L13,<L14,<L15,<L16,<L17,<L18,<L19,<L20,<L21,<L22,<L23,<L24,<L25,<L26,<L27,<L28,<L29,<L30,<L31,<L32,<L33,<L34,<L35,<L36,<L37,<L38,<L39,<L40,<L41,<L42,<L43,<L44,<L45,<L46,<L47,<L48,<L49,<L50,<L51,<L52 dta <L0,<L1,<L2,<L3,<L4,<L5,<L6,<L7,<L8,<L9,<L10,<L11,<L12,<L13,<L14,<L15,<L16,<L17,<L18,<L19,<L20,<L21,<L22,<L23,<L24,<L25,<L26,<L27,<L28,<L29,<L30,<L31,<L32,<L33,<L34,<L35,<L36,<L37,<L38,<L39,<L40,<L41,<L42,<L43,<L44,<L45,<L46,<L47,<L48,<L49,<L50,<L51,<L52,<L53
dta <L53,<L54,<L55,<L56,<L57,<L58,<L59,<L60,<L61,<L62,<L63,<L64,<L65,<L66,<L67,<L68,<L69,<L70,<L71,<L72,<L73,<L74,<L75,<L76,<L77,<L78,<L79,<L80,<L81,<L82,<L83,<L84,<L85,<L86,<L87,<L88,<L89,<L90,<L91,<L92,<L93,<L94,<L95,<L96,<L97,<L98,<L99,<L100,<L101,<L102,<L103,<L104,<L105,<L106,<L107,<L108,<L109,<L110,<L111,<L112,<L113 dta <L54,<L55,<L56,<L57,<L58,<L59,<L60,<L61,<L62,<L63,<L64,<L65,<L66,<L67,<L68,<L69,<L70,<L71,<L72,<L73,<L74,<L75,<L76,<L77,<L78,<L79,<L80,<L81,<L82,<L83,<L84,<L85,<L86,<L87,<L88,<L89,<L90,<L91,<L92,<L93,<L94,<L95,<L96,<L97,<L98,<L99,<L100,<L101,<L102,<L103,<L104,<L105,<L106,<L107,<L108,<L109,<L110,<L111,<L112,<L113,<L114,<L115
dta <LEND dta <LEND
OffensiveTextTableH OffensiveTextTableH
dta >L0,>L1,>L2,>L3,>L4,>L5,>L6,>L7,>L8,>L9,>L10,>L11,>L12,>L13,>L14,>L15,>L16,>L17,>L18,>L19,>L20,>L21,>L22,>L23,>L24,>L25,>L26,>L27,>L28,>L29,>L30,>L31,>L32,>L33,>L34,>L35,>L36,>L37,>L38,>L39,>L40,>L41,>L42,>L43,>L44,>L45,>L46,>L47,>L48,>L49,>L50,>L51,>L52 dta >L0,>L1,>L2,>L3,>L4,>L5,>L6,>L7,>L8,>L9,>L10,>L11,>L12,>L13,>L14,>L15,>L16,>L17,>L18,>L19,>L20,>L21,>L22,>L23,>L24,>L25,>L26,>L27,>L28,>L29,>L30,>L31,>L32,>L33,>L34,>L35,>L36,>L37,>L38,>L39,>L40,>L41,>L42,>L43,>L44,>L45,>L46,>L47,>L48,>L49,>L50,>L51,>L52,>L53
dta >L53,>L54,>L55,>L56,>L57,>L58,>L59,>L60,>L61,>L62,>L63,>L64,>L65,>L66,>L67,>L68,>L69,>L70,>L71,>L72,>L73,>L74,>L75,>L76,>L77,>L78,>L79,>L80,>L81,>L82,>L83,>L84,>L85,>L86,>L87,>L88,>L89,>L90,>L91,>L92,>L93,>L94,>L95,>L96,>L97,>L98,>L99,>L100,>L101,>L102,>L103,>L104,>L105,>L106,>L107,>L108,>L109,>L110,>L111,>L112,>L113 dta >L54,>L55,>L56,>L57,>L58,>L59,>L60,>L61,>L62,>L63,>L64,>L65,>L66,>L67,>L68,>L69,>L70,>L71,>L72,>L73,>L74,>L75,>L76,>L77,>L78,>L79,>L80,>L81,>L82,>L83,>L84,>L85,>L86,>L87,>L88,>L89,>L90,>L91,>L92,>L93,>L94,>L95,>L96,>L97,>L98,>L99,>L100,>L101,>L102,>L103,>L104,>L105,>L106,>L107,>L108,>L109,>L110,>L111,>L112,>L113,>L114,>L115
dta >LEND dta >LEND
NumberOfOffensiveTexts=54 NumberOfOffensiveTexts=54
NumberOfDeffensiveTexts=60 NumberOfDeffensiveTexts=62
.endp .endp
hoverFull dta d"MY HOVERCRAFT IS FULL OF EELS!", $ff hoverFull dta d"MY HOVERCRAFT IS FULL OF EELS!"
hoverFullEnd hoverFullEnd
hoverEmpty dta d"RUNNING OUT OF EELS", $ff hoverEmpty dta d"RUNNING OUT OF EELS"
hoverEmptyEnd hoverEmptyEnd
Binary file not shown.
Binary file not shown.
Binary file not shown.
+391 -323
View File
@@ -18,27 +18,7 @@ initialvaluesCount = *-initialvaluesstart ; MAX 128 bytes !
;=================================================================================== ;===================================================================================
;==========================CONSTANT TABLES, do not erase!=========================== ;==========================CONSTANT TABLES, do not erase!===========================
;=================================================================================== ;===================================================================================
TankColoursTable .BYTE $58,$2a,$96,$ca,$7a,$ed
;TankStatusColoursTable .BYTE $54,$24,$92,$c4,$74,$e4 ; standard order
;TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3
TankStatusColoursTable .BYTE $74,$c4,$24,$e4,$54,$94 ; Adam's order
TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3
TankShapesTable .BYTE char_tank1___________,char_tank2___________,char_tank3___________
.BYTE char_tank1___________,char_tank2___________,char_tank3___________
dliColorsBack
:10 .by $02,$00
dliColorsFore
.by $0a
CashOptionL ;(one zero less than on the screen)
.by 0,<200,<800,<1200,<2000
CashOptionH
.by 0,>200,>800,>1200,>2000
GravityTable .by 10,20,25,30,40
MaxWindTable .by 5,20,40,70,99
RoundsTable .by 10,20,30,40,50
AIForceTable .wo 375,470,630,720,820 ; starting shoot forces for different gravity
flyDelayTable .by 255,150,75,35,1
seppukuTable .by 255, 45,25,15,9
mountainsDeltaTableH .by 0,1,3,5,7 mountainsDeltaTableH .by 0,1,3,5,7
mountainsDeltaTableL .by $1f, $7f, $ff, $7f, $ff mountainsDeltaTableL .by $1f, $7f, $ff, $7f, $ff
;------------------------------------------------ ;------------------------------------------------
@@ -52,32 +32,58 @@ LevelNameBeginH
.by >(NamesOfLevels+64),>(NamesOfLevels+74),>(NamesOfLevels+84) .by >(NamesOfLevels+64),>(NamesOfLevels+74),>(NamesOfLevels+84)
;-------------- ;--------------
TanksWeaponsTableL TanksWeaponsTableL
.by <TanksWeapon1,<TanksWeapon2,<TanksWeapon3,<TanksWeapon4,<TanksWeapon5,<TanksWeapon6 .REPT MaxPlayers, #+1
.by <TanksWeapon:1
.ENDR
TanksWeaponsTableH TanksWeaponsTableH
.by >TanksWeapon1,>TanksWeapon2,>TanksWeapon3,>TanksWeapon4,>TanksWeapon5,>TanksWeapon6 .REPT MaxPlayers, #+1
.by >TanksWeapon:1
.ENDR
;-------------- ;--------------
XtankOffsetGO_L XtankOffsetGO_L
.by 6,56,106,156,206,0 .by 6,56,106,156,206,0
XtankOffsetGO_H XtankOffsetGO_H
.by 0,0,0,0,0,1 .by 0,0,0,0,0,1
;-----4x4 texts----- ;-----4x4 texts-----
LineTop LineTop
dta d"(%%%%%%%%%%%%)", $ff dta d"(%%%%%%%%%%%%)"
;# - vertical, () * +, % - horizontal ;# - vertical, () * +, % - horizontal
LineBottom LineBottom
dta d"*%%%%%%%%%%%%+", $ff dta d"*%%%%%%%%%%%%+"
LineEmpty LineEmpty
dta d"# #", $ff dta d"# #"
LineHeader2 LineHeader2
dta d"# RESULTS #", $ff dta d"# RESULTS #"
LineGameOver LineGameOver
dta d"# GAME OVER #", $ff dta d"# GAME OVER #"
seppukuText seppukuText
dta d"# SEPPUKU! #", $ff dta d"# SEPPUKU! #"
areYouSureText areYouSureText
dta d"# SURE? Y/N #", $ff .IF TARGET = 800
dta d"# SURE? Y/N #"
.ELIF TARGET = 5200
dta d"#END? Y-1/N-0#"
.ENDIF
lineClear lineClear
dta d" ", $ff dta d" "
TankColoursTable .BYTE $58,$2a,$96,$ca,$7a,$ed
;TankStatusColoursTable .BYTE $54,$24,$92,$c4,$74,$e4 ; standard order
TankStatusColoursTable .BYTE $74,$c4,$24,$e4,$54,$94 ; Adam's order
;-----------
GradientAddrL
.by <dliColorsFore, <dliColorsFore, <dliColorsFore2
GradientAddrH
.by >dliColorsFore, >dliColorsFore, >dliColorsFore2
dliColorsFore2 ; colors for NTSC
.by $0a ; one mountains color
.by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a
.by $3a,$1a,$1a,$ea,$ea,$d8,$d8,$b8,$b8,$b8
dliColorsFore2PAL ; colors for PAL
.by $0a ; one mountains color
.by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a
.by $3a,$1a,$1a,$ea,$ea,$c8,$c8,$a8,$a8,$a8
;----------- ;-----------
pmtableL ; addressess of the P/M memory for 6 tanks pmtableL ; addressess of the P/M memory for 6 tanks
@@ -96,7 +102,7 @@ pmtableH
.by >(pmgraph+$300) .by >(pmgraph+$300)
;----------- ;-----------
sintable sintable
.by 0 .by 1
.by 4 .by 4
.by 8 .by 8
.by 13 .by 13
@@ -200,12 +206,9 @@ bittable2
;---------------------------- ;----------------------------
disktance ;tanks distance disktance ;tanks distance
.by 0,0 .by 0,0
.by screenwidth/3 .REPT MaxPlayers-1, #+3
.by screenwidth/4 .by screenwidth/:1
.by screenwidth/5 .ENDR
.by screenwidth/6
.by screenwidth/7
;max number of players=6
; this table is for deciding where a tank should slide ; this table is for deciding where a tank should slide
; accordingly to what is below the tank ; accordingly to what is below the tank
@@ -218,108 +221,120 @@ SlideLeftTable
.BY %00000101 .BY %00000101
.BY %00000110 .BY %00000110
.BY %00000111 .BY %00000111
.BY %00001100 ; .BY %00001100
SlideLeftTableLen = *-SlideLeftTable
;------------------------------------------------- ;-------------------------------------------------
TanksNamesDefault TanksNamesDefault
dta d"1st.Tank" dta d"1st.Tank"
dta d"2nd.Tank" dta d"2nd.Tank"
dta d"3rd.Tank" dta d"3rd.Tank"
dta d"4th.Tank" .REPT MaxPlayers-3, #+4
dta d"5th.Tank" dta d":1th.Tank"
dta d"6th.Tank" .ENDR
;-------------------------------------------------
TankShapesTable .BYTE char_tank1
.BYTE char_tank2
.BYTE char_tank3
.BYTE char_tank4
;-------------------------------------------------
WeaponPriceH ; weapons prices (tables with prices of weapons) WeaponPriceH ; weapons prices (tables with prices of weapons)
.by >price_Baby_Missile___ .by >price_Baby_Missile
.by >price_Missile________ .by >price_Missile
.by >price_Baby_Nuke______ .by >price_Baby_Nuke
.by >price_Nuke___________ .by >price_Nuke
.by >price_LeapFrog_______ .by >price_LeapFrog
.by >price_Funky_Bomb_____ .by >price_Funky_Bomb
.by >price_MIRV___________ .by >price_MIRV
.by >price_Death_s_Head___ .by >price_Death_s_Head
.by >price_Napalm_________ .by >price_Napalm
.by >price_Hot_Napalm_____ .by >price_Hot_Napalm
.by >price_Tracer_________ .by >price_Tracer
.by >price_Smoke_Tracer___ .by >price_Smoke_Tracer
.by >price_Baby_Roller____ .by >price_Baby_Roller
.by >price_Roller_________ .by >price_Roller
.by >price_Heavy_Roller___ .by >price_Heavy_Roller
.by >price_Riot_Charge____ .by >price_Riot_Charge
.by >price_Riot_Blast_____ .by >price_Riot_Blast
.by >price_Riot_Bomb______ .by >price_Riot_Bomb
.by >price_Heavy_Riot_Bomb .by >price_Heavy_Riot_Bomb
.by >price_Baby_Digger____ .by >price_Baby_Digger
.by >price_Digger_________ .by >price_Digger
.by >price_Heavy_Digger___ .by >price_Heavy_Digger
.by >price_Baby_Sandhog___ .by >price_Baby_Sandhog
.by >price_Sandhog________ .by >price_Sandhog
.by >price_Heavy_Sandhog__ .by >price_Heavy_Sandhog
.by >price_Dirt_Clod______ .by >price_Dirt_Clod
.by >price_Dirt_Ball______ .by >price_Dirt_Ball
.by >price_Ton_of_Dirt____ .by >price_Ton_of_Dirt
.by >price_Liquid_Dirt____ .by >price_Liquid_Dirt
.by >price_Dirt_Charge____ .by >price_Dirt_Charge
.by >price_Buy_me_________ .by >price_Buy_me
.by >price_Laser__________ .by >price_Laser
.by >price_White_Flag_____ .by >price_White_Flag
.by >price_Battery________ .by >price_Battery
.by >price_Hovercraft_____ .by >price_Hovercraft
.by >price_Parachute______ .by >price_Parachute
.by >price_StrongParachute .by >price_StrongParachute
.by >price_Mag_Deflector__ .by >price_Mag_Deflector
.by >price_Shield_________ .by >price_Shield
.by >price_Heavy_Shield___ .by >price_Heavy_Shield
.by >price_Force_Shield___ .by >price_Force_Shield
.by >price_Bouncy_Castle__ .by >price_Bouncy_Castle
.by >price_Long_Barrel____ .by >price_Long_Barrel
.by >price_Nuclear_Winter_ .by >price_Nuclear_Winter_
.by >price_Lazy_Boy
.by >price_Lazy_Darwin
.by >price_Auto_Defense
.by >price_Spy_Hard
WeaponPriceL WeaponPriceL
.by <price_Baby_Missile___ .by <price_Baby_Missile
.by <price_Missile________ .by <price_Missile
.by <price_Baby_Nuke______ .by <price_Baby_Nuke
.by <price_Nuke___________ .by <price_Nuke
.by <price_LeapFrog_______ .by <price_LeapFrog
.by <price_Funky_Bomb_____ .by <price_Funky_Bomb
.by <price_MIRV___________ .by <price_MIRV
.by <price_Death_s_Head___ .by <price_Death_s_Head
.by <price_Napalm_________ .by <price_Napalm
.by <price_Hot_Napalm_____ .by <price_Hot_Napalm
.by <price_Tracer_________ .by <price_Tracer
.by <price_Smoke_Tracer___ .by <price_Smoke_Tracer
.by <price_Baby_Roller____ .by <price_Baby_Roller
.by <price_Roller_________ .by <price_Roller
.by <price_Heavy_Roller___ .by <price_Heavy_Roller
.by <price_Riot_Charge____ .by <price_Riot_Charge
.by <price_Riot_Blast_____ .by <price_Riot_Blast
.by <price_Riot_Bomb______ .by <price_Riot_Bomb
.by <price_Heavy_Riot_Bomb .by <price_Heavy_Riot_Bomb
.by <price_Baby_Digger____ .by <price_Baby_Digger
.by <price_Digger_________ .by <price_Digger
.by <price_Heavy_Digger___ .by <price_Heavy_Digger
.by <price_Baby_Sandhog___ .by <price_Baby_Sandhog
.by <price_Sandhog________ .by <price_Sandhog
.by <price_Heavy_Sandhog__ .by <price_Heavy_Sandhog
.by <price_Dirt_Clod______ .by <price_Dirt_Clod
.by <price_Dirt_Ball______ .by <price_Dirt_Ball
.by <price_Ton_of_Dirt____ .by <price_Ton_of_Dirt
.by <price_Liquid_Dirt____ .by <price_Liquid_Dirt
.by <price_Dirt_Charge____ .by <price_Dirt_Charge
.by <price_Buy_me_________ .by <price_Buy_me
.by <price_Laser__________ .by <price_Laser
.by <price_White_Flag_____ .by <price_White_Flag
.by <price_Battery________ .by <price_Battery
.by <price_Hovercraft_____ .by <price_Hovercraft
.by <price_Parachute______ .by <price_Parachute
.by <price_StrongParachute .by <price_StrongParachute
.by <price_Mag_Deflector__ .by <price_Mag_Deflector
.by <price_Shield_________ .by <price_Shield
.by <price_Heavy_Shield___ .by <price_Heavy_Shield
.by <price_Force_Shield___ .by <price_Force_Shield
.by <price_Bouncy_Castle__ .by <price_Bouncy_Castle
.by <price_Long_Barrel____ .by <price_Long_Barrel
.by <price_Nuclear_Winter_ .by <price_Nuclear_Winter_
.by <price_Lazy_Boy
.by <price_Lazy_Darwin
.by <price_Auto_Defense
.by <price_Spy_Hard
;------------------------------------------------- ;-------------------------------------------------
; how many units (bulletd) of a given weapon we get for a given price ; how many units (bulletd) of a given weapon we get for a given price
@@ -328,70 +343,75 @@ WeaponPriceL
; is not present in the game. ; is not present in the game.
; This is the slot for adding new weapons. ; This is the slot for adding new weapons.
WeaponUnits WeaponUnits
.by 10 ;Baby_Missile___;_00 .by 10 ;Baby_Missile ;_00
.by 5 ;Missile________;_01 .by 5 ;Missile ;_01
.by 2 ;Baby_Nuke______;_02 .by 2 ;Baby_Nuke ;_02
.by 1 ;Nuke___________;_03 .by 1 ;Nuke ;_03
.by 2 ;LeapFrog_______;_04 .by 2 ;LeapFrog ;_04
.by 3 ;Funky_Bomb_____;_05 .by 3 ;Funky_Bomb ;_05
.by 2 ;MIRV___________;_06 .by 2 ;MIRV ;_06
.by 1 ;Death_s_Head___;_07 .by 1 ;Death_s_Head ;_07
.by 4 ;Napalm_________;_08 .by 4 ;Napalm ;_08
.by 2 ;Hot_Napalm_____;_09 .by 2 ;Hot_Napalm ;_09
.by 20 ;Tracer_________;_10 .by 20 ;Tracer ;_10
.by 10 ;Smoke_Tracer___;_11 .by 10 ;Smoke_Tracer ;_11
.by 5 ;Baby_Roller____;_12 .by 5 ;Baby_Roller ;_12
.by 3 ;Roller_________;_13 .by 3 ;Roller ;_13
.by 2 ;Heavy_Roller___;_14 .by 2 ;Heavy_Roller ;_14
.by 5 ;Riot_Charge____;_15 .by 5 ;Riot_Charge ;_15
.by 2 ;Riot_Blast_____;_16 .by 2 ;Riot_Blast ;_16
.by 5 ;Riot_Bomb______;_17 .by 5 ;Riot_Bomb ;_17
.by 2 ;Heavy_Riot_Bomb;_18 .by 2 ;Heavy_Riot_Bomb;_18
.by 10 ;Baby_Digger____;_19 .by 10 ;Baby_Digger ;_19
.by 5 ;Digger_________;_20 .by 5 ;Digger ;_20
.by 2 ;Heavy_Digger___;_21 .by 2 ;Heavy_Digger ;_21
.by 10 ;Baby_Sandhog___;_22 .by 10 ;Baby_Sandhog ;_22
.by 5 ;Sandhog________;_23 .by 5 ;Sandhog ;_23
.by 2 ;Heavy_Sandhog__;_24 .by 2 ;Heavy_Sandhog ;_24
.by 5 ;Dirt_Clod______;_25 .by 5 ;Dirt_Clod ;_25
.by 3 ;Dirt_Ball______;_26 .by 3 ;Dirt_Ball ;_26
.by 1 ;Ton_of_Dirt____;_27 .by 1 ;Ton_of_Dirt ;_27
.by 4 ;Liquid_Dirt____;_28 .by 4 ;Liquid_Dirt ;_28
.by 2 ;Dirt_Charge____;_29 .by 2 ;Dirt_Charge ;_29
.by 1 ;Buy_me_________;_30 .by 1 ;Buy_me ;_30
.by 5 ;Laser__________;_31 .by 5 ;Laser ;_31
.by 1 ;White_Flag_____;_32 .by 1 ;White_Flag ;_32
.by 3 ;Battery________;_33 .by 3 ;Battery ;_33
.by 2 ;Floating_Tank__;_34 .by 2 ;Floating_Tank ;_34
.by 3 ;Parachute______;_35 .by 3 ;Parachute ;_35
.by 2 ;StrongParachute;_36 .by 2 ;StrongParachute;_36
.by 2 ;Mag_Deflector__;_37 .by 2 ;Mag_Deflector ;_37
.by 3 ;Shield_________;_38 .by 3 ;Shield ;_38
.by 2 ;Heavy_Shield___;_39 .by 2 ;Heavy_Shield ;_39
.by 3 ;Force_Shield___;_40 .by 3 ;Force_Shield ;_40
.by 1 ;Auto_Defense___;_41 .by 1 ;Auto_Defense ;_41
.by 2 ;Long_Barrel____;_42 .by 2 ;Long_Barrel ;_42
.by 1 ;Nuclear_Winter_;_43 .by 1 ;Nuclear_Winter_;_43
.by 2 ;Lazy_Boy ;_44
.by 2 ;Lazy_Darwin ;_45
.by 2 ;Auto_Defense ;_46
.by 4 ;Spy_Hard ;_47
PurchaseMeTable ;weapons good to be purchased by the robot PurchaseMeTable ;weapons good to be purchased by the robot
;the comment is an index in the tables ;the comment is an index in the tables
; "Baby Missile ","Missile ","Baby Nuke ","Nuke " ; "Baby Missile ","Missile ","Baby Nuke ","Nuke "
; "LeapFrog ","Funky Bomb ","MIRV ","Death's Head " ; "LeapFrog ","Funky Bomb ","MIRV ","Death's Head "
.by %01111111 .by %01111111
; "Napalm ","Hot Napalm ","Tracer ","Smoke Tracer " ; "Napalm ","Hot Napalm ","Tracer ","Smoke Tracer "
; "Baby Roller ","Roller ","Heavy Roller ","Riot Charge " ; "Baby Roller ","Roller ","Heavy Roller ","Riot Charge "
.by %11001110 .by %11001110
; "Riot Blast ","Riot Bomb ","Heavy Riot Bomb ","Baby Digger " ; "Riot Blast ","Riot Bomb ","Heavy Riot Bomb ","Baby Digger "
; "Digger ","Heavy Digger ","Baby Sandhog ","Sandhog " ; "Digger ","Heavy Digger ","Baby Sandhog ","Sandhog "
.by %00000000 .by %00000000
; "Heavy Sandhog ","Dirt Clod ","Dirt Ball ","Ton of Dirt " ; "Heavy Sandhog ","Dirt Clod ","Dirt Ball ","Ton of Dirt "
; "Liquid Dirt ","Dirt Charge ","Buy me! ","Laser " ; "Liquid Dirt ","Dirt Charge ","Buy me! ","Laser "
.by %00000000 .by %00000000
; "White Flag ","Battery ","Hovercraft ","Parachute " ; "White Flag ","Battery ","Hovercraft ","Parachute "
; "Strong Parachute","Mag Deflector ","Shield ","Heavy Shield " ; "Strong Parachute","Mag Deflector ","Shield ","Heavy Shield "
.by %01011111 .by %01011111
; "Force Shield ","Bouncy Castle ","Long Barrel ","Nuclear Winter " ; "Force Shield ","Bouncy Castle ","Long Barrel ","Nuclear Winter "
.by %11000000 ; "Lazy Boy ","Lazy Darwin ","Auto Defense ","Spy Hard "
.by %11000000
PurchaseMeTable2 ;weapons good to be purchased by the robot (Cyborg) PurchaseMeTable2 ;weapons good to be purchased by the robot (Cyborg)
;the comment is an index in the tables ;the comment is an index in the tables
@@ -411,55 +431,60 @@ PurchaseMeTable2 ;weapons good to be purchased by the robot (Cyborg)
; "Strong Parachute","Mag Deflector ","Shield ","Heavy Shield " ; "Strong Parachute","Mag Deflector ","Shield ","Heavy Shield "
.by %01001101 .by %01001101
; "Force Shield ","Bouncy Castle ","Long Barrel ","Nuclear Winter " ; "Force Shield ","Bouncy Castle ","Long Barrel ","Nuclear Winter "
; "Lazy Boy ","Lazy Darwin ","Auto Defense ","Spy Hard "
.by %11000000 .by %11000000
;------------------------------------------------- ;-------------------------------------------------
; Screen codes of icons (chars) representing a given weapon ; Screen codes of icons (chars) representing a given weapon
WeaponSymbols WeaponSymbols
.by $40 ;ind_Baby_Missile___ ;_00 .by $40 ;ind_Baby_Missile ;_00
.by $41 ;ind_Missile________ ;_01 .by $41 ;ind_Missile ;_01
.by $42 ;ind_Baby_Nuke______ ;_02 .by $42 ;ind_Baby_Nuke ;_02
.by $43 ;ind_Nuke___________ ;_03 .by $43 ;ind_Nuke ;_03
.by $44 ;ind_LeapFrog_______ ;_04 .by $44 ;ind_LeapFrog ;_04
.by $45 ;ind_Funky_Bomb_____ ;_05 .by $45 ;ind_Funky_Bomb ;_05
.by $46 ;ind_MIRV___________ ;_06 .by $46 ;ind_MIRV ;_06
.by $47 ;ind_Death_s_Head___ ;_07 .by $47 ;ind_Death_s_Head ;_07
.by $48 ;ind_Napalm_________ ;_08 .by $48 ;ind_Napalm ;_08
.by $49 ;ind_Hot_Napalm_____ ;_09 .by $49 ;ind_Hot_Napalm ;_09
.by $4a ;ind_Tracer_________ ;_10 .by $4a ;ind_Tracer ;_10
.by $4b ;ind_Smoke_Tracer___ ;_11 .by $4b ;ind_Smoke_Tracer ;_11
.by $4c ;ind_Baby_Roller____ ;_12 .by $4c ;ind_Baby_Roller ;_12
.by $4d ;ind_Roller_________ ;_13 .by $4d ;ind_Roller ;_13
.by $4e ;ind_Heavy_Roller___ ;_14 .by $4e ;ind_Heavy_Roller ;_14
.by $4f ;ind_Riot_Charge____ ;_15 .by $4f ;ind_Riot_Charge ;_15
.by $50 ;ind_Riot_Blast_____ ;_16 .by $50 ;ind_Riot_Blast ;_16
.by $51 ;ind_Riot_Bomb______ ;_17 .by $51 ;ind_Riot_Bomb ;_17
.by $52 ;ind_Heavy_Riot_Bomb ;_18 .by $52 ;ind_Heavy_Riot_Bomb ;_18
.by $53 ;ind_Baby_Digger____ ;_19 .by $53 ;ind_Baby_Digger ;_19
.by $54 ;ind_Digger_________ ;_20 .by $54 ;ind_Digger ;_20
.by $55 ;ind_Heavy_Digger___ ;_21 .by $55 ;ind_Heavy_Digger ;_21
.by $56 ;ind_Baby_Sandhog___ ;_22 .by $56 ;ind_Baby_Sandhog ;_22
.by $57 ;ind_Sandhog________ ;_23 .by $57 ;ind_Sandhog ;_23
.by $58 ;ind_Heavy_Sandhog__ ;_24 .by $58 ;ind_Heavy_Sandhog ;_24
.by $59 ;ind_Dirt_Clod______ ;_25 .by $59 ;ind_Dirt_Clod ;_25
.by $5a ;ind_Dirt_Ball______ ;_26 .by $5a ;ind_Dirt_Ball ;_26
.by $5b ;ind_Ton_of_Dirt____ ;_27 .by $5b ;ind_Ton_of_Dirt ;_27
.by $60 ;ind_Liquid_Dirt____ ;_28 .by $60 ;ind_Liquid_Dirt ;_28
.by $7b ;ind_Dirt_Charge____ ;_29 .by $7b ;ind_Dirt_Charge ;_29
.by $1f ;ind_Buy_me_________ ;_30 .by $1f ;ind_Buy_me ;_30
.by $20 ;ind_Laser__________ ;_31 .by $20 ;ind_Laser ;_31
.by $5f ;ind_White_Flag_____ ;_32 .by $5f ;ind_White_Flag ;_32
.by $1c ;ind_Battery________ ;_33 .by $1c ;ind_Battery ;_33
.by $06 ;ind_Floating_Tank__ ;_34 .by $06 ;ind_Floating_Tank ;_34
.by $1b ;ind_Parachute______ ;_35 .by $1b ;ind_Parachute ;_35
.by $1b ;ind_StrongParachute ;_36 .by $1b ;ind_StrongParachute ;_36
.by $1e ;ind_Mag_Deflector__ ;_37 .by $1e ;ind_Mag_Deflector ;_37
.by $3b ;ind_Shield_________ ;_38 .by $3b ;ind_Shield ;_38
.by $3d ;ind_Heavy_Shield___ ;_39 .by $3d ;ind_Heavy_Shield ;_39
.by $3c ;ind_Force_Shield___ ;_40 .by $3c ;ind_Force_Shield ;_40
.by $3f ;ind_Bouncy_Castle__ ;_41 .by $3f ;ind_Bouncy_Castle ;_41
.by $1d ;ind_Long_Barrel____ ;_42 .by $1d ;ind_Long_Barrel ;_42
.by $7d ;ind_Nuclear_Winter_ ;_43 .by $7d ;ind_Nuclear_Winter_ ;_43
.by $02 ;ind_Lazy_Boy ;_44
.by $03 ;ind_Lazy_Darwin ;_45
.by $5e ;ind_Auto_Defense ;_46
.by $7c ;ind_Spy_Hard ;_47
; Names of weapons (16 chars long) ; Names of weapons (16 chars long)
NamesOfWeapons ;the comment is an index in the tables NamesOfWeapons ;the comment is an index in the tables
@@ -493,125 +518,168 @@ NamesOfWeapons ;the comment is an index in the tables
dta d"Ton of Dirt " ; 27 dta d"Ton of Dirt " ; 27
dta d"Liquid Dirt " ; 28 dta d"Liquid Dirt " ; 28
dta d"Dirt Charge " ; 29 dta d"Dirt Charge " ; 29
dta d"Buy me! " ; 30 dta d"Best F...g Gifts" ; 30
dta d"Laser " ; 31 dta d"Laser " ; 31
;------defensives ;------defensives
dta d"White Flag " ; 32 dta d"White Flag " ; 32
dta d"Battery " ; 33 dta d"Battery " ; 33
dta d"Hovercraft " ; 34 dta d"Hovercraft " ; 34
dta d"Parachute " ; 35 - no energy dta d"Parachute " ; 35 - no energy
dta d"Strong Parachute" ; 36 - with energy (earlier Battery) dta d"Strong Parachute" ; 36 - with energy (earlier Battery)
dta d"Mag Deflector " ; 37 - with shield and energy dta d"Mag Deflector " ; 37 - with shield and energy
dta d"Shield " ; 38 - shield for one shot - no energy dta d"Shield " ; 38 - shield for one shot - no energy
dta d"Heavy Shield " ; 39 - shield with energy dta d"Heavy Shield " ; 39 - shield with energy
dta d"Force Shield " ; 40 - shield with energy and parachute dta d"Force Shield " ; 40 - shield with energy and parachute
dta d"Bouncy Castle " ; 41 - with shield and energy dta d"Bouncy Castle " ; 41 - with shield and energy
dta d"Long Schlong " ; 42 dta d"Long Schlong " ; 42
dta d"Nuclear Winter " ; 43 dta d"Nuclear Winter " ; 43
DefensiveEnergy = *-(last_offensive_____ - first_offensive____ +1) ; to fake the table for ALL weapons dta d"Lazy Boy " ; 44
.by 00 ; White Flag dta d"Lazy Darwin " ; 45
.by 00 ; Heat Guidance dta d"Auto Defense " ; 46
.by 98 ; Let's go! dta d"Spy Hard " ; 47
.by 00 ; Parachute
.by 99 ; Strong Parachute DefensiveEnergy = *-(last_offensive - first_offensive +1) ; to fake the table for ALL weapons
.by 99 ; Mag Deflector .by 00 ; White Flag
.by 00 ; Shield .by 00 ; Heat Guidance
.by 99 ; Heavy Shield .by 98 ; Let's go!
.by 99 ; Force Shield .by 00 ; Parachute
.by 99 ; Bouncy Castle .by 99 ; Strong Parachute
.by 00 ; Long Barrel .by 99 ; Mag Deflector
.by 00 ; Nuclear Winter .by 00 ; Shield
.by 99 ; Heavy Shield
.by 99 ; Force Shield
.by 99 ; Bouncy Castle
.by 00 ; Long Barrel
.by 00 ; Nuclear Winter
.by 00 ; Lazy Boy
.by 00 ; Lazy Darwin
.by 00 ; Auto Defense
.by 00 ; Spy Hard
weaponsOfDeath ; weapons used in tank death animations weaponsOfDeath ; weapons used in tank death animations
dta 1,2,3,7,17,18,19,20,21,22,23,24,25,26,27 dta ind_Missile
dta ind_Baby_Nuke
dta ind_Nuke
dta ind_Death_s_Head
dta ind_Hot_Napalm ; why not?
dta ind_Riot_Bomb
dta ind_Heavy_Riot_Bomb
dta ind_Baby_Digger
dta ind_Digger
dta ind_Heavy_Digger
dta ind_Baby_Sandhog
dta ind_Sandhog
dta ind_Heavy_Sandhog
dta ind_Dirt_Clod
dta ind_Dirt_Ball
dta ind_Ton_of_Dirt
weaponsOfDeathEnd weaponsOfDeathEnd
joyToKeyTable joyToKeyTable
.by $ff ;00 .by $ff ;00
.by $ff ;01 .by $ff ;01
.by $ff ;02 .by $ff ;02
.by $ff ;03 .by $ff ;03
.by $ff ;04 .by $ff ;04
.by $ff ;05 .by $ff ;05
.by $ff ;06 .by $ff ;06
.by @kbcode._right ;07 .by @kbcode._right ;07
.by $ff ;08 .by $ff ;08
.by $ff ;09 .by $ff ;09
.by $ff ;0a .by $ff ;0a
.by @kbcode._left ;0b .by @kbcode._left ;0b
.by $ff ;0c .by $ff ;0c
.by @kbcode._down ;0d .by @kbcode._down ;0d
.by @kbcode._up ;0e .by @kbcode._up ;0e
.by $ff ;0f .by $ff ;0f
;----------------------------------- ;-----------------------------------
keycodes ;tables for converting KeyCode to Screen Code (38 -1 characters) keycodes ;tables for converting KeyCode to Screen Code (38-1 characters)
.by $3f,$15,$12,$3a,$2a,$38,$3d,$39 .by $3f,$15,$12,$3a,$2a,$38,$3d,$39
.by $0d,$01,$05,$00,$25,$23,$08,$0a .by $0d,$01,$05,$00,$25,$23,$08,$0a
.by $2f,$28,$3e,$2d,$0b,$10,$2e,$16 .by $2f,$28,$3e,$2d,$0b,$10,$2e,$16
.by $2b,$17,$1f,$1e,$1a,$18,$1d,$1b .by $2b,$17
.by $33,$35,$30,$32,$22,$21 ;,$0e <-- hyphen removed from the table, sorry hyphen lovers .by $32,$1f,$1e,$1a,$18,$1d,$1b
.by $33,$35,$30,$22,$21 ;,$0e <-- hyphen removed from the table, sorry hyphen lovers
keycodesEnd keycodesEnd
scrcodes scrcodes
dta d"abcdefgh" dta d"abcdefgh"
dta d"ijklmnop" dta d"ijklmnop"
dta d"qrstuvwx" dta d"qrstuvwx"
dta d"yz123456" dta d"yz"
dta d"7890. " ; "-" ;-------decimal constans + end of scrcodes
zero
digits
dta d"0123456"
dta d"789. " ; "-"
;----------------------------------- ;-----------------------------------
gameOverSpritesTop gameOverSpritesTop
; end of the Gover sprites by number of players ; end of the GameOver sprites by number of players
; 1 2 3 4 5 6 ; 1 2 3 4 5 6
.by 130+7,130+7,136+7,142+7,148+7,154+7 .by 130+7,130+7,136+7,142+7,148+7,154+7
;-------decimal constans
zero
digits dta d"0123456789"
;------credits ;------credits
CreditsStart CreditsStart
dta d" "* dta d" "*
dta d"You were playin",d"g"* dta d"You were playin",d"g"*
dta d"Scorc",d"h"* dta d"Scorc",d"h"*
dta d"Warsaw, Miam",d"i"* dta d"Warsaw, Miam",d"i"*
dta d"2000-202",d"2"* dta d"2000-202",d"3"*
dta d" "* dta d" "*
dta d"Programmin",d"g"* dta d"Programmin",d"g"*
dta d"Tomasz 'Pecus' Peck",d"o"* dta d"Tomasz 'Pecus' Peck",d"o"*
dta d"Pawel 'pirx' Kalinowsk",d"i"* dta d"Pawel 'pirx' Kalinowsk",d"i"*
dta d" "* dta d" "*
dta d"SFX, Music and Suppor",d"t"* dta d"SFX, Music and Suppor",d"t"*
dta d"Michal 'Miker' Szpilowsk",d"i"* dta d"Michal 'Miker' Szpilowsk",d"i"*
dta d" "* dta d" "*
.IF target != 5200 .IF TARGET = 800
dta d"Additional Musi",d"c"* dta d"Additional Musi",d"c"*
dta d"Mario 'Emkay' Kri",d"x"* dta d"Mario 'Emkay' Kri",d"x"*
dta d" "* dta d" "*
.ENDIF .ENDIF
dta d"Code Optimizatio",d"n"* dta d"Code Optimizatio",d"n"*
dta d"Piotr '0xF' Fusi",d"k"* dta d"Piotr '0xF' Fusi",d"k"*
dta d" "* dta d" "*
dta d"Ar",d"t"* dta d"Ar",d"t"*
dta d"Adam Wachowsk",d"i"* dta d"Adam Wachowsk",d"i"*
.IF target != 5200 .IF TARGET = 800
dta d"Krzysztof 'Kaz' Ziembi",d"k"* dta d"Roman 'xorcerer' Fierfa",d"s"*
.ENDIF .ENDIF
dta d" "* dta d" "*
dta d"Ideas and Q",d"A"* dta d"Ideas, help and Q",d"A"*
dta d"Bocianu, Probabilitydragon, EnderDude",d","* dta d"Bocianu, Probabilitydragon",d","*
dta d"Beeblebrox, KrzysRog, lopezpb, Dracon",d","* dta d"EnderDude, Dracon",d","*
dta d"brad-colbert, archon800, nowy80",d","* dta d"Beeblebrox, KrzysRog, lopezpb",d","*
dta d"Shaggy the Atarian, RetroBorsuk, ZP",d"H"* dta d"brad-colbert, archon800, nowy80",d","*
dta d" "* dta d"Shaggy the Atarian, RetroBorsuk, ZPH"
dta d"Additional testin",d"g"* .IF TARGET = 800
dta d"Arek and Alex Peck",d"o"* dta d" "*
.IF target != 5200 .ELIF TARGET = 5200
dta d" "* dta d","*
dta d"Stay tuned for the FujiNet version",d"!"* dta d"x-usr(1536), Aking, JAC!, phaeron",d","*
.ENDIF dta d"RB520",d"0"*
dta d" "* .ENDIF
dta d" "*
dta d"Additional testin",d"g"*
dta d"Arek and Alex Peck",d"o"*
dta d" "*
dta d"Special thank",d"s"*
dta d"Krzysztof 'Kaz' Ziembi",d"k"*
.IF TARGET = 800
dta d" "*
dta d"Stay tuned for the FujiNet version",d"!"*
.ENDIF
dta d" "*
CreditsEnd CreditsEnd
.IF target = 5200 .IF TARGET = 800
CreditsLines=36 CreditsLines=40 + 7 ; add 7 for scrollout
.ELSE .ELIF TARGET = 5200
CreditsLines=42 ; 34 in reality. add 7? CreditsLines=34 + 7; add 7 for scrollout
.ENDIF .ENDIF
.endif .IF TARGET = 5200
; Atari 5200 splash
NewSplashText=*
dta d" 2023 atariage", $4e, "com " ; $4e - non blinking dot
.ENDIF
.endif ; .IF *>0
+25
View File
@@ -0,0 +1,25 @@
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
.IF *>0 ;this is a trick that prevents compiling this file alone
;TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3
TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3
dliColorsBack
:10 .by $02,$00
dliColorsFore
.by $0a ; one mountains color
; .by $0e,$0c,$0c,$0b,$0b,$0a,$0a,$09,$09,$08 ; mountains colors array
; .by $08,$08,$07,$07,$07,$06,$06,$06,$06,$05
.by $0e,$0c,$0c,$0c,$0c,$0a,$0a,$0a,$0a,$08 ; mountains colors array new
.by $08,$08,$08,$06,$06,$06,$06,$06,$06,$04
CashOptionL ;(one zero less than on the screen)
.by 0,<200,<800,<1200,<2000
CashOptionH
.by 0,>200,>800,>1200,>2000
GravityTable .by 10,20,25,30,40
MaxWindTable .by 5,20,40,70,99
RoundsTable .by 10,20,30,40,50
AIForceTable .wo 375,470,630,720,820 ; starting shoot forces for different gravity
flyDelayTable .by 255,150,75,35,1
seppukuTable .by 255, 45,25,15,9
.ENDIF
+118 -103
View File
@@ -4,7 +4,7 @@ screenheight = 200
screenBytes = 40 screenBytes = 40
screenwidth = screenBytes*8 ; Max screenwidth = 512!!! screenwidth = screenBytes*8 ; Max screenwidth = 512!!!
TankWidth = 8 TankWidth = 8
;---------------------------------------------- ;----------------------------------------------
; Player/missile memory ; Player/missile memory
PMGraph = $1800 ; real PM start = PMGraph + $0300 PMGraph = $1800 ; real PM start = PMGraph + $0300
@@ -19,120 +19,133 @@ PMOffsetX = $2C ; P/M to graphics offset
PMOffsetY = $2A ; P/M to graphics offset PMOffsetY = $2A ; P/M to graphics offset
napalmRadius = 10 napalmRadius = 10
StandardBarrel = 6 ; standard tank barrel length StandardBarrel = 6 ; standard tank barrel length
LongBarrel = 20 ; long barrel length LongBarrel = 20 ; long barrel length
TextBackgroundColor = $02 ; REAL constans - use: LDA #TextBackgroundColor TextBackgroundColor = $02 ; REAL constans - use: LDA #TextBackgroundColor
TextForegroundColor = $0A TextForegroundColor = $0A
space = 0 ; space in screencodes space = 0 ; space in screencodes
KeyRepeatSpeed = 10 ; (max 127 !!!)
;character codes for symbols (tank, parachute, etc. ) ;character codes for symbols (tank, parachute, etc. )
char_parachute_______ = $02 char_parachute = $02
char_flag____________ = $1e char_flag = $1e
char_flame___________ = $14 char_flame = $14
char_clear_flame_____ = $1c char_clear_flame = $1c
char_digger__________ = $04 char_digger = $04
char_sandhog_________ = $0c char_sandhog = $0c
char_sandhog_offset = char_sandhog_________ - char_digger__________ char_sandhog_offset = char_sandhog - char_digger
char_tank1___________ = $20 char_tank1 = $20
char_tank2___________ = $24 char_tank2 = $24
char_tank3___________ = $28 char_tank3 = $2c
char_tank4 = $28 ; robotank shape
;Weapon prices (*10 on screen) ;Weapon prices (*10 on screen)
price_Baby_Missile___ = 0 ;_00 price_Baby_Missile = 0 ;_00
price_Missile________ = 96 ;_01 price_Missile = 96 ;_01
price_Baby_Nuke______ = 111 ;_02 price_Baby_Nuke = 111 ;_02
price_Nuke___________ = 144 ;_03 price_Nuke = 144 ;_03
price_LeapFrog_______ = 192 ;_04 price_LeapFrog = 192 ;_04
price_Funky_Bomb_____ = 293 ;_05 price_Funky_Bomb = 293 ;_05
price_MIRV___________ = 456 ;_06 price_MIRV = 456 ;_06
price_Death_s_Head___ = 337 ;_07 price_Death_s_Head = 337 ;_07
price_Napalm_________ = 125 ;_08 price_Napalm = 125 ;_08
price_Hot_Napalm_____ = 162 ;_09 price_Hot_Napalm = 162 ;_09
price_Tracer_________ = 102 ;_10 price_Tracer = 102 ;_10
price_Smoke_Tracer___ = 291 ;_11 price_Smoke_Tracer = 291 ;_11
price_Baby_Roller____ = 211 ;_12 price_Baby_Roller = 211 ;_12
price_Roller_________ = 244 ;_13 price_Roller = 244 ;_13
price_Heavy_Roller___ = 326 ;_14 price_Heavy_Roller = 326 ;_14
price_Riot_Charge____ = 230 ;_15 price_Riot_Charge = 230 ;_15
price_Riot_Blast_____ = 241 ;_16 price_Riot_Blast = 241 ;_16
price_Riot_Bomb______ = 259 ;_17 price_Riot_Bomb = 259 ;_17
price_Heavy_Riot_Bomb = 272 ;_18 price_Heavy_Riot_Bomb = 272 ;_18
price_Baby_Digger____ = 136 ;_19 price_Baby_Digger = 136 ;_19
price_Digger_________ = 176 ;_20 price_Digger = 176 ;_20
price_Heavy_Digger___ = 207 ;_21 price_Heavy_Digger = 207 ;_21
price_Baby_Sandhog___ = 158 ;_22 price_Baby_Sandhog = 158 ;_22
price_Sandhog________ = 191 ;_23 price_Sandhog = 191 ;_23
price_Heavy_Sandhog__ = 223 ;_24 price_Heavy_Sandhog = 223 ;_24
price_Dirt_Clod______ = 104 ;_25 price_Dirt_Clod = 104 ;_25
price_Dirt_Ball______ = 130 ;_26 price_Dirt_Ball = 130 ;_26
price_Ton_of_Dirt____ = 171 ;_27 price_Ton_of_Dirt = 171 ;_27
price_Liquid_Dirt____ = 330 ;_28 price_Liquid_Dirt = 330 ;_28
price_Dirt_Charge____ = 343 ;_29 price_Dirt_Charge = 343 ;_29
price_Buy_me_________ = 170 ;_30 price_Buy_me = 170 ;_30
price_Laser__________ = 277 ;_31 price_Laser = 277 ;_31
price_White_Flag_____ = $0 ;_32 price_White_Flag = $0 ;_32
price_Battery________ = 300 ;_33 price_Battery = 300 ;_33
price_Hovercraft_____ = 352 ;_34 price_Hovercraft = 352 ;_34
price_Parachute______ = 234 ;_35 price_Parachute = 234 ;_35
price_StrongParachute = 1000 ;_36 price_StrongParachute = 1000 ;_36
price_Mag_Deflector__ = 745 ;_37 price_Mag_Deflector = 745 ;_37
price_Shield_________ = 224 ;_38 price_Shield = 224 ;_38
price_Heavy_Shield___ = 628 ;_39 price_Heavy_Shield = 628 ;_39
price_Force_Shield___ = 1100 ;_40 price_Force_Shield = 1100 ;_40
price_Bouncy_Castle__ = 512 ;_41 price_Bouncy_Castle = 512 ;_41
price_Long_Barrel____ = 2100 ;_42 price_Long_Barrel = 2100 ;_42
price_Nuclear_Winter_ = 1000 ;_43 price_Nuclear_Winter_ = 1000 ;_43
price_Lazy_Boy = 500 ;_44
price_Lazy_Darwin = 730 ;_45
price_Auto_Defense = 250 ;_46
price_Spy_Hard = 83 ;_47
;Weapon indexes (numbers) ;Weapon indexes (numbers)
ind_Baby_Missile___ = 0 ind_Baby_Missile = 0
first_offensive____ = ind_Baby_Missile___ first_offensive = ind_Baby_Missile
ind_Missile________ = 1 ind_Missile = 1
ind_Baby_Nuke______ = 2 ind_Baby_Nuke = 2
ind_Nuke___________ = 3 ind_Nuke = 3
ind_LeapFrog_______ = 4 ind_LeapFrog = 4
ind_Funky_Bomb_____ = 5 ind_Funky_Bomb = 5
ind_MIRV___________ = 6 ind_MIRV = 6
ind_Death_s_Head___ = 7 ind_Death_s_Head = 7
ind_Napalm_________ = 8 ind_Napalm = 8
ind_Hot_Napalm_____ = 9 ind_Hot_Napalm = 9
ind_Tracer_________ = 10 ind_Tracer = 10
ind_Smoke_Tracer___ = 11 ind_Smoke_Tracer = 11
ind_Baby_Roller____ = 12 ind_Baby_Roller = 12
ind_Roller_________ = 13 ind_Roller = 13
ind_Heavy_Roller___ = 14 ind_Heavy_Roller = 14
ind_Riot_Charge____ = 15 ind_Riot_Charge = 15
ind_Riot_Blast_____ = 16 ind_Riot_Blast = 16
ind_Riot_Bomb______ = 17 ind_Riot_Bomb = 17
ind_Heavy_Riot_Bomb = 18 ind_Heavy_Riot_Bomb = 18
ind_Baby_Digger____ = 19 ind_Baby_Digger = 19
ind_Digger_________ = 20 ind_Digger = 20
ind_Heavy_Digger___ = 21 ind_Heavy_Digger = 21
ind_Baby_Sandhog___ = 22 ind_Baby_Sandhog = 22
ind_Sandhog________ = 23 ind_Sandhog = 23
ind_Heavy_Sandhog__ = 24 ind_Heavy_Sandhog = 24
ind_Dirt_Clod______ = 25 ind_Dirt_Clod = 25
ind_Dirt_Ball______ = 26 ind_Dirt_Ball = 26
ind_Ton_of_Dirt____ = 27 ind_Ton_of_Dirt = 27
ind_Liquid_Dirt____ = 28 ind_Liquid_Dirt = 28
ind_Dirt_Charge____ = 29 ind_Dirt_Charge = 29
ind_Buy_me_________ = 30 ind_Buy_me = 30
ind_Laser__________ = 31 ind_Laser = 31
last_offensive_____ = ind_Laser__________ last_offensive = ind_Laser
ind_White_Flag_____ = 32 ind_White_Flag = 32
first_defensive____ = ind_White_Flag_____ first_defensive = ind_White_Flag
ind_Battery________ = 33 ind_Battery = 33
ind_Hovercraft_____ = 34 ind_Hovercraft = 34
ind_Parachute______ = 35 ind_Parachute = 35
ind_StrongParachute = 36 ind_StrongParachute = 36
ind_Mag_Deflector__ = 37 ind_Mag_Deflector = 37
ind_Shield_________ = 38 ind_Shield = 38
ind_Heavy_Shield___ = 39 ind_Heavy_Shield = 39
ind_Force_Shield___ = 40 ind_Force_Shield = 40
ind_Bouncy_Castle__ = 41 ind_Bouncy_Castle = 41
ind_Long_Barrel____ = 42 ind_Long_Barrel = 42
ind_Nuclear_Winter_ = 43 ind_Nuclear_Winter_ = 43
last_defensive_____ = ind_Nuclear_Winter_ ind_Lazy_Boy = 44
number_of_offensives = last_offensive_____ - first_offensive____+1 ind_Lazy_Darwin = 45
number_of_defensives = (last_defensive_____ - first_defensive____+1) ind_Auto_Defense = 46
ind_Spy_Hard = 47
last_defensive = ind_Spy_Hard
last_real_defensive = ind_Bouncy_Castle
number_of_offensives = last_offensive - first_offensive +1
number_of_defensives = (last_defensive - first_defensive +1)
number_of_weapons = number_of_offensives + number_of_defensives
;-------------------------------- ;--------------------------------
; names of RMT instruments (sfx) ; names of RMT instruments (sfx)
;-------------------------------- ;--------------------------------
@@ -167,7 +180,9 @@ sfx_liquid_dirt = $1b ;2
sfx_battery = $1c ;3 sfx_battery = $1c ;3
sfx_white_flag = $1d ;4 sfx_white_flag = $1d ;4
sfx_long_barrel = $1e sfx_long_barrel = $1e
sfx_tank_move = $1f sfx_tank_move = $1f
sfx_auto_defense= $2b
sfx_lazy_boys = $2c
;-------------------------------- ;--------------------------------
; RMT songs (lines) ; RMT songs (lines)
;-------------------------------- ;--------------------------------
+1392
View File
File diff suppressed because it is too large Load Diff
+763 -903
View File
File diff suppressed because it is too large Load Diff
+422 -1483
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+444
View File
@@ -0,0 +1,444 @@
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
;C64 8-bit Scorched Earth source code
;---------------------------------------------------
;by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski
;Warsaw 2000, 2001, 2002, 2003, 2009, 2012, 2013
;Miami & Warsaw 2022, 2023
;---------------------------------------------------
.def TARGET = 64 ; :)
;---------------------------------------------------
.def XCORRECTION_FOR_PM = 0
; if 1 - active x position of tanks correction fo PMG
.def FASTER_GRAF_PROCS = 1
; if 1 - activates faster graphics routines
; (direct writes to screen memory - C64 only :) )
;---------------------------------------------------
opt h-f+
org $801
org [a($801)],$801
basic_start(FirstSTART)
;---------------------------------------------------
.macro build
dta d"1.28" ; number of this build (4 bytes)
.endm
.macro RMTSong
lda #:1 ; do nothing in C64
.endm
;---------------------------------------------------
icl 'definitions.asm'
;---------------------------------------------------
FirstZpageVariable = $58 ; $57
.zpvar DliColorBack .byte = FirstZpageVariable
.zpvar GradientNr .byte
.zpvar GradientColors .word
.zpvar WindChangeInRound .byte ; wind change after each turn (not round only) flag - (0 - round only, >0 - each turn)
.zpvar JoystickNumber .byte
.zpvar LazyFlag .byte ; 7 bit - run Lazy Darwin, 6 bit - run Lazy Boy or Darwin (!) after inventory, 0 - nothing
.zpvar SpyHardFlag .byte ; >$7f - run SpyHard after inventory
.zpvar Vdebug .byte ; "visual debug" flag ($00 - off, $ff - on)
.zpvar xdraw .word ;= $64 ;variable X for plot
.zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen)
.zpvar xbyte .word
.zpvar ybyte .word
.zpvar CharCode .byte
.zpvar fontind .word
.zpvar tanknr .byte
.zpvar TankSequencePointer .byte
.zpvar oldplot .word
.zpvar xc .word
.zpvar temp .word ;temporary word for the most embeded loops only
.zpvar temp2 .word ;same as above
.zpvar modify .word ;origially used to replace self-modyfying code
.zpvar tempXROLLER .word ;same as above for XROLLER routine (used also in result display routine)
.zpvar xtempDRAW .word ;same as above for XDRAW routine
.zpvar ytempDRAW .word ;same as above for XDRAW routine
.zpvar tempor2 .word
.zpvar CreditsVScrol .byte
;--------------temps used in circle routine
.zpvar xi .word ;X (word) in draw routine
.zpvar fx .byte
.zpvar yi .word ;Y (word) in draw routine
.zpvar fy .byte
.zpvar xk .word
.zpvar fs .byte
.zpvar yc .byte ;ycircle - temporary for circle
.zpvar dx .word
.zpvar dy .word
.zpvar dd .word
.zpvar di .word
.zpvar dp .word
;----------------------------
.zpvar UnderTank1 .byte
.zpvar UnderTank2 .byte
;----------------------------
.zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight)
.zpvar weaponPointer .word
.zpvar dliCounter .byte
.zpvar pressTimer .byte
.zpvar NTSCcounter .byte
.zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling
.zpvar sfx_effect .byte
.zpvar RMT_blocked .byte
.zpvar ScrollFlag .byte
.zpvar SkStatSimulator .byte
.zpvar FloatingAlt .byte ; floating tank altitude
.zpvar OverTankDir .byte ; (0 go right, $ff go left) direction of bypassing tanks on screen
; --------------OPTIMIZATION VARIABLES--------------
.zpvar Force .word
.zpvar Force_ .byte ; Force is 3 bytes long
.zpvar Angle .byte
.zpvar Parachute .byte ; are you insured with parachute?
.zpvar color .byte
.zpvar Erase .byte ; if 1 only mask of the character is printed
; on the graphics screen. if 0 character is printed normally
.zpvar radius .byte
.zpvar decimal .word
.zpvar NumberOfPlayers .byte ;current number of players (counted from 1)
.zpvar Counter .byte ;temporary Counter for outside loops
.zpvar ExplosionRadius .byte
.zpvar FunkyBombCounter .byte
.zpvar ResultY .byte
.zpvar xcircle .word
.zpvar ycircle .word
.zpvar vy .word
.zpvar vy_ .word ; 4 bytes
.zpvar vx .word
.zpvar vx_ .word ; 4 bytes
.zpvar HitFlag .byte ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank
.zpvar PositionOnTheList .byte ; pointer position on the list being displayed
.zpvar XHit .word
.zpvar delta .word
.zpvar HowMuchToFall .byte
.zpvar magic .word
.zpvar xtraj .word
.zpvar xtraj_ .byte ; 3 bytes
.zpvar ytraj .word
.zpvar ytraj_ .byte ; 3 bytes
.zpvar Wind .word
.zpvar Wind_ .word ; 4 bytes
.zpvar RangeLeft .word
.zpvar RangeRight .word
.zpvar NewAngle .byte
.zpvar escFlag .byte ; 7 bit - Exit game, 6 bit - Exit to GameOver (cleared - exit to Menu), 0 - nothing
.zpvar LineYdraw .byte
.zpvar LineXdraw .word
.zpvar plot4x4color .byte ; $00 / $ff
.zpvar Multiplier .word
.zpvar Multiplier_ .byte ; 3 bytes
.zpvar HowToDraw .byte
.zpvar gravity .byte
.zpvar LineLength .word
.zpvar tracerflag .byte
.zpvar isInventory .byte
.zpvar DifficultyLevel .byte
.zpvar goleft .byte
.zpvar OffsetDL1 .byte
.zpvar L1 .byte
HotNapalmFlag = FunkyBombCounter ; reuse variable!
;* RMT ZeroPage addresses in artwork/sfx/rmtplayr.a65
displayposition = modify
LineAddress4x4 = xcircle
;-----------------------------------------------
; libraries
;-----------------------------------------------
icl 'C64/lib/C64_ATARISYS.ASM'
icl 'C64/lib/C64SYS.ASM'
icl 'C64/lib/MACRO.ASM'
;-----------------------------------------------
; variable declarations in RAM (no code)
;-----------------------------------------------
; Game loading address
ORG $4100
icl 'variables.asm'
WeaponFont
ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt'
;--------------------------------------------------
; Game Code
;--------------------------------------------------
FirstSTART
DL = 0
StatusBufferROM = 0
;StatusBufferCopy = 0
StatusBufferCopyEnd = 0
TRACKS = 4
DisplayCopyPurchaseEnd = 0
DisplayCopyPurchaseStart = 0
displayC64 = $2000 ; graphics screen memory start
SEI ; disable IRQ
LDA #$36
STA $0001 ; Turn Off BASIC ROM
LDA #<NMI ;
STA $0318 ; change NMI vector
LDA #>NMI ; to our routine
STA $0319 ;
LDA #$00 ; stop Timer A
STA $DD0E ;
STA $DD04 ; set Timer A to 0, after starting
STA $DD05 ; NMI will occur immediately
LDA #$81 ;
STA $DD0D ; set Timer A as source for NMI
LDA #$01 ;
STA $DD0E ; start Timer A -> NMI
; from here on NMI is disabled
jsr MakeDarkScreen
; one time zero variables in RAM (non zero page)
lda #0
ldy #OneTimeZeroVariablesCount-1
@ sta OneTimeZeroVariables,y
dey
bpl @-
; one time zero variables in RAM (zero page)
ldy #FirstZpageVariable
@ sta $0000,y
iny
bne @-
; initialize variables in RAM (non zero page)
ldy #initialvaluesCount-1
@ lda initialvaluesStart,y
sta variablesToInitialize,y
dey
bpl @-
; generate linetables
jsr GenerateLineTable
; Random INIT
InitializeSIDrnd
;--------------------------------------------------
; Main program of the game
icl 'game.asm'
;--------------------------------------------------
;--------------------------------------------------
.proc GetKey
; waits for pressing a key and returns pressed value in A
; when [ESC] is pressed, escFlag is set
; result: A=keycode
;--------------------------------------------------
jsr WaitForKeyRelease
lda #0
sta escFlag
lda #$ff
rts
.endp
;--------------------------------------------------
.proc getkeynowait
;--------------------------------------------------
jsr WaitForKeyRelease
lda kbcode
and #$3f ;CTRL and SHIFT ellimination
rts
.endp
;--------------------------------------------------
.proc WaitForKeyRelease
;--------------------------------------------------
StillWait
rts
.endp
;--------------------------------------------------
.proc IsKeyPressed
; result: A=0 - yes , A>0 - no
;--------------------------------------------------
lda #1
rts
.endp
;--------------------------------------------------
.proc DemoModeOrKey
; Waits for the key pressed if at least one human is playing.
; Otherwise, waits 3 seconds (demo mode).
;--------------------------------------------------
;check demo mode
ldx numberOfPlayers
dex
checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE
lda skillTable,x
beq peopleAreHere
dex
bpl checkForHuman
; no people, just wait a bit
;pause 150
ldy #75
jmp PauseYFrames
; rts
peopleAreHere
jmp getkey ; jsr:rts
.endp
;--------------------------------------------------
MakeDarkScreen
;--------------------------------------------------
; mva #0 dmactls ; dark screen
; and wait one frame :)
;--------------------------------------------------
.proc WaitOneFrame
;--------------------------------------------------
wait ; or waitRTC ?
rts
.endp
;--------------------------------------------------
.proc PauseYFrames
; Y - number of frames to wait (divided by 2)
; pauses for maximally 510 frames (255 * 2)
;--------------------------------------------------
@ jsr WaitOneFrame
jsr WaitOneFrame
dey
bne @-
rts
.endp
;--------------------------------------------------
.proc CheckExitKeys
;--------------------------------------------------
; Checks keyboard and sets appropriate flags for exit procedures
; If START+OPTION is pressed - exit to GameOver screen
; If 'O' key is pressed - displays "Are you sure?" and - exit to GameOver screen
; If 'Esc' key is pressed - displays "Are you sure?" and - exit to Menu screen
; Just setting the right flags!!!
rts
;
.endp
;--------------------------------------------------
.proc ShellDelay
ldx flyDelay
DelayLoop
lda $d012
@ cmp $d012
beq @-
lda $d012
@ cmp $d012
beq @-
dex
bne DelayLoop
noShellDelay
rts
.endp
;--------------------------------------------------
.proc RmtSongSelect
; starting song line 0-255 to A reg
;--------------------------------------------------
rts
.endp
.proc CopyFromRom
rts
.endp
;--------------------------------------------------
icl 'C64/interrupts.asm'
;----------------------------------------------
icl 'constants.asm'
;----------------------------------------------
icl 'C64/textproc.asm'
;----------------------------------------------
icl 'grafproc.asm'
icl 'C64/gr_basics.asm'
;----------------------------------------------
icl 'weapons.asm'
;----------------------------------------------
icl 'ai.asm'
;----------------------------------------------
icl 'artwork/talk.asm'
;----------------------------------------------
TankFont
ins 'artwork/tanksv4.fnt',+0,384 ; 48 characters only
;----------------------------------------------
font4x4
ins 'artwork/font4x4s.bmp',+62
;-------------------------------------------------
.proc CheckTankCheat
ldy #$07
lda TankNr
asl
asl
asl ; 8 chars per name
tax
@
lda CheatName,y
sec
sbc tanksnames,x
cmp #$27
bne NoCheat
inx
dey
bpl @-
YesCheat
ldx TankNr
lda TanksWeaponsTableL,x
sta temp
lda TanksWeaponsTableH,x
sta temp+1
lda #99
@ iny
sta (temp),y
cpy #(number_of_weapons - 1)
bne @-
NoCheat
rts
.endp
CheatName
dta d" 008.T"+$27
;----------------------------------------------
.proc DLIinterruptBFG
pha
lda dliCounter
bne EndofBFGDLI
lda dliColorsFore
bit random
bmi @+
lda DliColorBack
@ sta COLPF2
lda dliColorsFore
bit random
bmi @+
lda DliColorBack
@ sta COLPF1
EndofBFGDLI
inc dliCounter
pla
rti
.endp
; ------------------------
.proc BFGblink
; SetDLI DLIinterruptBFG ; blinking on
ldy #50
jsr PauseYFrames
; SetDLI DLIinterruptGraph ; blinking off
rts
.endp
;----------------------------------------------
icl 'constants_top.asm'
;----------------------------------------------
NMI
INC $D020 ; change border colour, indication for a NMI
RTI ; exit interrupt
; (not acknowledged!)
BIN
View File
Binary file not shown.
+36 -54
View File
@@ -1,4 +1,4 @@
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
.IF *>0 ;this is a trick that prevents compiling this file alone .IF *>0 ;this is a trick that prevents compiling this file alone
;===================================================== ;=====================================================
@@ -18,12 +18,12 @@ noMusic .ds 1 ;.by 0 ; 0 - play music, $ff - do not play music
noSfx .ds 1 ;.by 0 ; 0 - play SFX, $ff - do not play SFX noSfx .ds 1 ;.by 0 ; 0 - play SFX, $ff - do not play SFX
;---------------------------------------------------- ;----------------------------------------------------
; Color table for Game Over Screen (created in a gameover routine) ; Color table for Game Over Screen (created in a gameover routine)
.ds 1 ;.by $00 ; labels line color .ds 1 ;.by $00 ; labels line color
GameOverColoursTable .ds MaxPlayers; .BYTE $80,$40,$c4,$20,$c0,$e4 GameOverColoursTable .ds MaxPlayers; .BYTE $80,$40,$c4,$20,$c0,$e4
;---------------------------------------------------- ;----------------------------------------------------
TanksNames ; DO NOT ZERO ON GAME RESTART - ticket #24 TanksNames ; DO NOT ZERO ON GAME RESTART - ticket #24
;:6 dta d" " ;:6 dta d" "
.ds 6*8 .ds MaxPlayers*8
;---------------------------------------------------- ;----------------------------------------------------
skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30) skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30)
.DS MaxPlayers .DS MaxPlayers
@@ -39,10 +39,10 @@ mountainDeltaL .ds 1 ;.by $ff
LineHeader1 LineHeader1
.ds 9 ;dta d"# ROUND: " .ds 9 ;dta d"# ROUND: "
RoundNrDisplay RoundNrDisplay
.ds 7 ;dta d" #", $ff .ds 5 ;dta d" #", $ff
; 4x4 text buffer ; 4x4 text buffer
ResultLineBuffer ResultLineBuffer
.ds 19 ;dta d" ", $ff .ds 14 ;dta d" ", $ff
linetableL ; = PMGraph + $0300 - (screenHeight+1)*2 linetableL ; = PMGraph + $0300 - (screenHeight+1)*2
.ds (screenHeight+1) .ds (screenHeight+1)
linetableH ; = PMGraph + $0300 - (screenHeight+1) linetableH ; = PMGraph + $0300 - (screenHeight+1)
@@ -55,9 +55,9 @@ StatusBufferCopy
variablesStart ; zeroing starts here variablesStart ; zeroing starts here
;===================================================== ;=====================================================
;isInventory .ds 1 ; 0 - purchase, $ff - inventory ;isInventory .ds 1 ; 0 - purchase, $ff - inventory
;-------------- ;--------------
drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V)
;-------------- ;--------------
noDeathCounter .ds 1 noDeathCounter .ds 1
;-------------- ;--------------
OptionsY .ds 1 ;vertical position of cursor on Options screen OptionsY .ds 1 ;vertical position of cursor on Options screen
@@ -102,9 +102,9 @@ ResultsTable ;the results in the gameeeeee
.DS MaxPlayers .DS MaxPlayers
TempResults TempResults
.DS MaxPlayers .DS MaxPlayers
DirectHitsH ;DirectHitsH ; one byte enough
.DS MaxPlayers ; .DS MaxPlayers
DirectHitsL DirectHits
.DS MaxPlayers .DS MaxPlayers
EarnedMoneyH EarnedMoneyH
.DS MaxPlayers .DS MaxPlayers
@@ -125,8 +125,10 @@ BarrelLength ;length of the tank barrel - dont forget to set it to 6 at round st
.DS MaxPlayers .DS MaxPlayers
ActiveWeapon ;number of the selected weapon ActiveWeapon ;number of the selected weapon
.DS MaxPlayers .DS MaxPlayers
ActiveDefenceWeapon ;number of the activated defence weapon - 0 ActiveDefenceWeapon ;number of the activated defence weapon - 0
.DS MaxPlayers .DS MaxPlayers
AutoDefenseFlag ; 0 - not activated, >$7f - activated
.DS MaxPlayers
WeaponDepleted .DS 1 ; if 0 deactivate the weapon and switch to Baby Missile WeaponDepleted .DS 1 ; if 0 deactivate the weapon and switch to Baby Missile
;---------------------------------------------------- ;----------------------------------------------------
@@ -147,7 +149,7 @@ WindOrientation .DS 1 ;(0-right,1-left)
;---------------------------------------------------- ;----------------------------------------------------
;Counter .DS 1 ;temporary Counter for outside loops ;Counter .DS 1 ;temporary Counter for outside loops
;HitFlag .DS 1 ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank ;HitFlag .DS 1 ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank
WallsType .ds 1 ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy WallsType .ds 1 ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy
;---------------------------------------------------- ;----------------------------------------------------
xtankstableL ;X positions of tanks (lower left point) xtankstableL ;X positions of tanks (lower left point)
.DS MaxPlayers .DS MaxPlayers
@@ -157,11 +159,15 @@ ytankstable ;Y positions of tanks (lower left point)
.DS MaxPlayers .DS MaxPlayers
LowResDistances ; coarse tank positions divided by 4 (to be in just one byte) LowResDistances ; coarse tank positions divided by 4 (to be in just one byte)
.DS MaxPlayers .DS MaxPlayers
JoyNumber ; Joystick port number (from 0 to 3)
.DS MaxPlayers
TankShape ; Tank shape number (from 0 to 2)
.DS MaxPlayers
;---------------------------------------------------- ;----------------------------------------------------
TargetTankNr ; Target tank index (for AI routines) TargetTankNr ; Target tank index (for AI routines)
.DS 1 .DS 1
SecondTryFlag ; For precise AI aiming SecondTryFlag ; For precise AI aiming
.DS 1 .DS 1
;---------------------------------------------------- ;----------------------------------------------------
;Erase .DS 1 ; if 1 only mask of the character is printed ;Erase .DS 1 ; if 1 only mask of the character is printed
; on the graphics screen. if 0 character is printed normally ; on the graphics screen. if 0 character is printed normally
@@ -212,8 +218,8 @@ FallingSoundBit .DS 1
PreviousFall .DS 1 PreviousFall .DS 1
EndOfTheFallFlag .DS 1 ; in case of the infinite fall EndOfTheFallFlag .DS 1 ; in case of the infinite fall
;Parachute .DS 1 ; are you insured with parachute? ;Parachute .DS 1 ; are you insured with parachute?
FloatingAlt .DS 1 ; floating tank altitude ;FloatingAlt .DS 1 ; floating tank altitude
FunkyWallFlag = FloatingAlt ; reuse this variable in different weapon (Funky Bomb)! FunkyWallFlag = FloatingAlt ; reuse this variable in different weapon (Funky Bomb)!
PreferHumansFlag = FloatingAlt ; second reuse in AI Aim proc PreferHumansFlag = FloatingAlt ; second reuse in AI Aim proc
;---------------------------------------------------- ;----------------------------------------------------
;Flight ;Flight
@@ -229,7 +235,7 @@ MirvDown .DS [5] ; is given missile down?
MirvMissileCounter .DS 1 ; missile Counter (mainly for X) MirvMissileCounter .DS 1 ; missile Counter (mainly for X)
SmokeTracerFlag .DS 1 ; if Smoketracer SmokeTracerFlag .DS 1 ; if Smoketracer
LaserFlag .DS 1 ; $ff if Laser LaserFlag .DS 1 ; $ff if Laser
XposFlag .DS 1 ; bullet positon X (0 - on screen , %1000000 - off-screen) XposFlag .DS 1 ; bullet positon X (0 - on screen , %1000000 - off-screen)
YposFlag .DS 1 ; bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen) YposFlag .DS 1 ; bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen)
;---------------------------------------------------- ;----------------------------------------------------
;CheckCollisionWithTank ;CheckCollisionWithTank
@@ -253,7 +259,6 @@ oldplotL .DS [5]
oldora .DS [5] oldora .DS [5]
oldply .DS [5] oldply .DS [5]
OldOraTemp .DS 1 OldOraTemp .DS 1
FunkyBombCounter .DS 1
xtrajfb .DS 2 xtrajfb .DS 2
ytrajfb .DS 2 ytrajfb .DS 2
; ;
@@ -275,15 +280,16 @@ UpNdown .DS 1
temptankX .DS 2 temptankX .DS 2
temptankNr .DS 1 temptankNr .DS 1
AfterBFGflag .DS 1
;---------------------------------------------------- ;----------------------------------------------------
;Variables from textproc.s65 ;Variables from textproc.s65
; tables with indexes of weapons on the right lists ; tables with indexes of weapons on the right lists
; OK (2022) so, L1 is list of offensive weapons, L2 - defensive ; OK (2022) so, L1 is list of offensive weapons, L2 - defensive
IndexesOfWeaponsL1 IndexesOfWeaponsL1
.ds (last_offensive_____ - first_offensive____+1) .ds (last_offensive - first_offensive +1)
IndexesOfWeaponsL2 IndexesOfWeaponsL2
.ds (last_defensive_____ - first_defensive____+1) .ds (last_defensive - first_defensive +1)
;---------------------------------------------------- ;----------------------------------------------------
; variables storing amount of weapons on the first and second ; variables storing amount of weapons on the first and second
@@ -295,7 +301,7 @@ HowManyOnTheListDef
.DS 1 .DS 1
;PositionOnTheList ; pointer position on the list being displayed ;PositionOnTheList ; pointer position on the list being displayed
; .DS 1 ; .DS 1
LastWeapon LastWeapon
; number of the last previously purchased weapon ; number of the last previously purchased weapon
; it is necessary when after purchase some weapon ; it is necessary when after purchase some weapon
; is removed from the list (because too expensive) ; is removed from the list (because too expensive)
@@ -335,19 +341,10 @@ LaserCoordinate .DS 8 ; 2,2,2,2
; Let 0 be "baby missile" ; Let 0 be "baby missile"
; from $30 the defensive weapons begin ; from $30 the defensive weapons begin
TanksWeapons TanksWeapons
TanksWeapon1 .REPT MaxPlayers, #+1
.DS [last_defensive_____ - first_offensive____ +1] TanksWeapon:1
TanksWeapon2 .DS number_of_weapons
.DS [last_defensive_____ - first_offensive____ +1] .ENDR
TanksWeapon3
.DS [last_defensive_____ - first_offensive____ +1]
TanksWeapon4
.DS [last_defensive_____ - first_offensive____ +1]
TanksWeapon5
.DS [last_defensive_____ - first_offensive____ +1]
TanksWeapon6
.DS [last_defensive_____ - first_offensive____ +1]
mountaintable ;table of mountains (size=screenwidth) mountaintable ;table of mountains (size=screenwidth)
.DS [screenwidth] .DS [screenwidth]
.DS 1 ; additional byte for fallout (sometimes 1 pixel) .DS 1 ; additional byte for fallout (sometimes 1 pixel)
@@ -356,10 +353,6 @@ mountaintable2 ;table of mountains (size=screenwidth)
.DS 1 ; additional byte for fallout (sometimes 1 pixel) .DS 1 ; additional byte for fallout (sometimes 1 pixel)
MountaintableEnd ;good for table clearing MountaintableEnd ;good for table clearing
;---------------------------------------------------- ;----------------------------------------------------
TextPositionX .DS 2
TextPositionY .DS 1
TextAddress .DS 2
TextCounter .DS 1
TextNumberOff .DS 1 TextNumberOff .DS 1
;-------------- ;--------------
TankTempY TankTempY
@@ -368,18 +361,14 @@ TankTempY
;-------------- single round variables -------------- ;-------------- single round variables --------------
;---------------------------------------------------- ;----------------------------------------------------
singleRoundVars singleRoundVars
;-------------- ;--------------
;escFlag .ds 1 ; 0 - Esc or O not pressed, $80 - Esc pressed, $40 - O pressed ;escFlag .ds 1 ; 0 - Esc or O not pressed, $80 - Esc pressed, $40 - O pressed
;-------------- ;--------------
CurrentResult CurrentResult
.DS 1 .DS 1
;-------------- ;--------------
AngleTable ;Angle of the barrel of each tank during the round AngleTable ;Angle of the barrel of each tank during the round
.DS MaxPlayers .DS MaxPlayers
;NewAngle ; used in AI
.DS 1
;previousBarrelAngle
; .DS MaxPlayers
EndOfTheBarrelX EndOfTheBarrelX
.ds 2 .ds 2
EndOfTheBarrelY EndOfTheBarrelY
@@ -409,19 +398,12 @@ LineCharNr .DS 1
;LineYdraw .DS 1 ;LineYdraw .DS 1
;----------- ;-----------
ResultX
.DS 2
;ResultY .DS 1
ResultOfTankNr ResultOfTankNr
.DS 1 .DS 1
;---------------------------------------------------- ;----------------------------------------------------
;PutChar4x4 ;PutChar4x4
;---------------------------------------------------- ;----------------------------------------------------
LoopCounter4x4 .DS 1
y4x4 .DS 1
StoreA4x4 .DS 1
Xcounter4x4 .DS 1
nibbler4x4 .DS 1 nibbler4x4 .DS 1
CharCode4x4 .DS 1 CharCode4x4 .DS 1
;plot4x4color .DS 1 ;1-white, 0-background ;plot4x4color .DS 1 ;1-white, 0-background
+1252 -1185
View File
File diff suppressed because it is too large Load Diff