├── level-a
├── level-b
├── level-c
├── level-d
├── level-e
├── level-f
├── level-g
├── level-h
├── level-i
├── level-j
├── pdrv-vic
├── music0.vic
├── music1.vic
├── gfxfont.prg
├── pdrv_vic.bin
├── tileset.vic
├── README.md
├── LICENSE
├── BACKGROUND_TASKS.ASM
└── VICROBOTS.ASM
/level-a:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-a
--------------------------------------------------------------------------------
/level-b:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-b
--------------------------------------------------------------------------------
/level-c:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-c
--------------------------------------------------------------------------------
/level-d:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-d
--------------------------------------------------------------------------------
/level-e:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-e
--------------------------------------------------------------------------------
/level-f:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-f
--------------------------------------------------------------------------------
/level-g:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-g
--------------------------------------------------------------------------------
/level-h:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-h
--------------------------------------------------------------------------------
/level-i:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-i
--------------------------------------------------------------------------------
/level-j:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/level-j
--------------------------------------------------------------------------------
/pdrv-vic:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/pdrv-vic
--------------------------------------------------------------------------------
/music0.vic:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/music0.vic
--------------------------------------------------------------------------------
/music1.vic:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/music1.vic
--------------------------------------------------------------------------------
/gfxfont.prg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/gfxfont.prg
--------------------------------------------------------------------------------
/pdrv_vic.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/pdrv_vic.bin
--------------------------------------------------------------------------------
/tileset.vic:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeropolis79/PETSCIIRobots-Vic20/HEAD/tileset.vic
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # PETSCIIRobots-Vic20
2 | Attack of the Petscii Robots VIC-20 Source Code
3 | The Attack of the PETSCII Robots source code has been provided by David Murray for the purposes of study and also to provide information to those who would like to port
4 | the game to other systems. This code may NOT be used to produce unofficial copies for sale and he code must NOT be modified in anyway unless adding a feature, in which both
5 | the source and compiled versions must be sent to David Murray.
6 |
7 | Due to time constraints, David Murray will NOT be prodiving support. He has gladly given permission for me to host this.
8 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/BACKGROUND_TASKS.ASM:
--------------------------------------------------------------------------------
1 | BACKGROUND_TASKS:
2 | LDA REDRAW_WINDOW
3 | CMP #1
4 | BNE UNIT_AI
5 | LDA BGTIMER1
6 | CMP #1
7 | BNE UNIT_AI
8 | LDA #0
9 | STA REDRAW_WINDOW
10 | JSR DRAW_MAP_WINDOW
11 | UNIT_AI:
12 | ;Now check to see if it is time to run background tasks
13 | LDA BGTIMER1
14 | CMP #1
15 | BEQ AI000
16 | RTS
17 | AI000: LDA #0
18 | STA BGTIMER1 ;RESET BACKGROUND TIMER
19 | ;INC $83C0 ;-TROUBLESHOOTING
20 | LDX #$FF
21 | STA UNIT
22 | AILP: INC UNIT ;ALL AI routines must JMP back to here at the end.
23 | LDX UNIT
24 | CPX #64 ;END OF UNITS
25 | BNE AI001
26 | RTS ;RETURN CONTROL TO MAIN PROGRAM
27 | AI001: LDA UNIT_TYPE,X
28 | CMP #0 ;Does unit exist?
29 | BNE AI002
30 | JMP AILP
31 | AI002: ;Unit found to exist, now check it's timer.
32 | ;unit code won't run until timer hits zero.
33 | LDA UNIT_TIMER_A,X
34 | CMP #0
35 | BEQ AI003
36 | DEC UNIT_TIMER_A,X ;Decrease timer by one.
37 | JMP AILP
38 | AI003: ;Unit exists and timer has triggered
39 | ;The unit type determines which AI routine is run.
40 | LDA UNIT_TYPE,X
41 | CMP #24 ;MAX DIFFERENT UNIT TYPES IN CHART
42 | BCS AILP ;ABORT IF GREATER
43 | TAY
44 | LDA AI_ROUTINE_CHART_L,Y
45 | STA AI004+1
46 | LDA AI_ROUTINE_CHART_H,Y
47 | STA AI004+2
48 | AI004: JMP $0000 ;***self modifying code used here***
49 |
50 | AI_ROUTINE_CHART_L:
51 | !BYTE DUMMY_ROUTINE ;UNIT TYPE 00 ;non-existent unit
78 | !BYTE >DUMMY_ROUTINE ;UNIT TYPE 01 ;player unit - can't use
79 | !BYTE >LEFT_RIGHT_DROID ;UNIT TYPE 02
80 | !BYTE >UP_DOWN_DROID ;UNIT TYPE 03
81 | !BYTE >HOVER_ATTACK ;UNIT TYPE 04
82 | !BYTE >WATER_DROID ;UNIT TYPE 05
83 | !BYTE >TIME_BOMB ;UNIT TYPE 06
84 | !BYTE >TRANSPORTER_PAD ;UNIT TYPE 07
85 | !BYTE >DEAD_ROBOT ;UNIT TYPE 08
86 | !BYTE >EVILBOT ;UNIT TYPE 09
87 | !BYTE >AI_DOOR ;UNIT TYPE 10
88 | !BYTE >SMALL_EXPLOSION ;UNIT TYPE 11
89 | !BYTE >PISTOL_FIRE_UP ;UNIT TYPE 12
90 | !BYTE >PISTOL_FIRE_DOWN ;UNIT TYPE 13
91 | !BYTE >PISTOL_FIRE_LEFT ;UNIT TYPE 14
92 | !BYTE >PISTOL_FIRE_RIGHT ;UNIT TYPE 15
93 | !BYTE >TRASH_COMPACTOR ;UNIT TYPE 16
94 | !BYTE >UP_DOWN_ROLLERBOT ;UNIT TYPE 17
95 | !BYTE >LEFT_RIGHT_ROLLERBOT ;UNIT TYPE 18
96 | !BYTE >ELEVATOR ;UNIT TYPE 19
97 | !BYTE >MAGNET ;UNIT TYPE 20
98 | !BYTE >MAGNETIZED_ROBOT ;UNIT TYPE 21
99 | !BYTE >WATER_RAFT_LR ;UNIT TYPE 22
100 | !BYTE >DEMATERIALIZE ;UNIT TYPE 23
101 |
102 | ;Dummy routine does nothing, but I need it for development.
103 | DUMMY_ROUTINE:
104 | JMP AILP
105 |
106 | WATER_RAFT_LR:
107 | LDA #0
108 | ;First check which direction raft is moving.
109 | LDX UNIT
110 | LDA UNIT_A,X
111 | CMP #1
112 | BEQ RAFT_RIGHT
113 | JMP RAFT_LEFT
114 | RAFT_RIGHT:
115 | JSR RAFT_DELETE
116 | ;Check to see if player is on raft
117 | LDA UNIT_LOC_X,X ;raft
118 | CMP UNIT_LOC_X ;player
119 | BNE WARF05
120 | LDA UNIT_LOC_Y,X ;raft
121 | CMP UNIT_LOC_Y ;player
122 | BNE WARF05
123 | INC UNIT_LOC_X ;player
124 | INC UNIT_LOC_X,X ;raft
125 | JSR RAFT_PLOT
126 | JSR CACULATE_AND_REDRAW
127 | JMP WARF5B
128 | WARF05: INC UNIT_LOC_X,X ;raft
129 | JSR RAFT_PLOT
130 | ;Now check if it has reached its destination
131 | JSR CHECK_FOR_WINDOW_REDRAW
132 | WARF5B: LDX UNIT
133 | LDA UNIT_LOC_X,X
134 | CMP UNIT_C,X
135 | BEQ WARF06
136 | LDA #6
137 | STA UNIT_TIMER_A,X
138 | JMP AILP
139 | WARF06: LDA #100
140 | STA UNIT_TIMER_A,X
141 | LDA #0
142 | STA UNIT_A,X
143 | JMP AILP
144 |
145 | RAFT_LEFT:
146 | JSR RAFT_DELETE
147 | ;Check to see if player is on raft
148 | LDA UNIT_LOC_X,X ;raft
149 | CMP UNIT_LOC_X ;player
150 | BNE WARF07
151 | LDA UNIT_LOC_Y,X ;raft
152 | CMP UNIT_LOC_Y ;player
153 | BNE WARF07
154 | DEC UNIT_LOC_X ;player
155 | DEC UNIT_LOC_X,X ;raft
156 | JSR RAFT_PLOT
157 | JSR CACULATE_AND_REDRAW
158 | JMP WARF7B
159 | WARF07: DEC UNIT_LOC_X,X ;raft
160 | JSR RAFT_PLOT
161 | ;Now check if it has reached its destination
162 | JSR CHECK_FOR_WINDOW_REDRAW
163 | WARF7B: LDX UNIT
164 | ;Now check if it has reached its destination
165 | LDA UNIT_LOC_X,X
166 | CMP UNIT_B,X
167 | BEQ WARF08
168 | LDA #6
169 | STA UNIT_TIMER_A,X
170 | JMP AILP
171 | WARF08: LDA #100
172 | STA UNIT_TIMER_A,X
173 | LDA #1
174 | STA UNIT_A,X
175 | JMP AILP
176 |
177 | RAFT_DELETE:
178 | LDA UNIT_LOC_X,X
179 | STA MAP_X
180 | LDA UNIT_LOC_Y,X
181 | STA MAP_Y
182 | LDA #204 ;WATER TILE
183 | STA TILE
184 | JSR PLOT_TILE_TO_MAP
185 | RTS
186 |
187 | RAFT_PLOT:
188 | LDA UNIT_LOC_X,X
189 | STA MAP_X
190 | LDA UNIT_LOC_Y,X
191 | STA MAP_Y
192 | LDA #242 ;RAFT TILE
193 | STA TILE
194 | JSR PLOT_TILE_TO_MAP
195 | RTS
196 |
197 |
198 | MAGNETIZED_ROBOT:
199 | LDA #%00000001
200 | STA MOVE_TYPE
201 | JSR GENERATE_RANDOM_NUMBER
202 | LDA RANDOM
203 | AND #%00000011
204 | CMP #00
205 | BEQ MAGRO1
206 | CMP #01
207 | BEQ MAGRO2
208 | CMP #02
209 | BEQ MAGRO3
210 | CMP #03
211 | BEQ MAGRO4
212 | MAGRO1: JSR REQUEST_WALK_UP
213 | JMP MAGR10
214 | MAGRO2: JSR REQUEST_WALK_DOWN
215 | JMP MAGR10
216 | MAGRO3: JSR REQUEST_WALK_LEFT
217 | JMP MAGR10
218 | MAGRO4: JSR REQUEST_WALK_RIGHT
219 | MAGR10: JSR CHECK_FOR_WINDOW_REDRAW
220 | LDX UNIT
221 | LDA #10
222 | STA UNIT_TIMER_A,X
223 | DEC UNIT_TIMER_B,X
224 | LDA UNIT_TIMER_B,X
225 | CMP #0
226 | BNE MAGR11
227 | LDA UNIT_D,X
228 | STA UNIT_TYPE,X
229 | MAGR11: JMP AILP
230 |
231 | GENERATE_RANDOM_NUMBER:
232 | LDA RANDOM
233 | BEQ DOEOR ;added this
234 | ASL
235 | BCC NOEOR
236 | DOEOR: EOR #$1D
237 | NOEOR: STA RANDOM
238 | RTS
239 |
240 | MAGNET:
241 | ;First let's take care of the timers. This unit runs
242 | ;every cycle so that it can detect contact with another
243 | ;unit. But it still needs to count down to terminate
244 | ;So, it uses two timers for a 16-bit value.
245 | LDX UNIT
246 | DEC UNIT_TIMER_B,X
247 | LDA UNIT_TIMER_B,X
248 | CMP #0
249 | BNE MAGN1
250 | DEC UNIT_A,X
251 | LDA UNIT_A,X
252 | CMP #0
253 | BNE MAGN1
254 | ;Both timers have reached zero, time to deactivate.
255 | MAGN0: LDX UNIT
256 | LDA #0
257 | STA UNIT_TYPE,X
258 | STA MAGNET_ACT
259 | JMP AILP
260 | MAGN1: ;Now let's see if another units walks on the magnet.
261 | LDA UNIT_LOC_X,X
262 | STA MAP_X
263 | LDA UNIT_LOC_Y,X
264 | STA MAP_Y
265 | JSR CHECK_FOR_UNIT
266 | LDA UNIT_FIND
267 | CMP #255 ;no unit found
268 | BEQ MAGN2
269 | CMP #0 ;player unit
270 | BEQ MAGN3
271 | JMP MAGN4
272 | MAGN2: JMP AILP
273 | MAGN3: INC INV_MAGNET
274 | JSR DISPLAY_ITEM
275 | JMP MAGN0
276 | MAGN4: ;Collision with robot detected.
277 | LDA #4 ;HAYWIRE SOUND
278 | JSR PLAY_SOUND ;SOUND PLAY
279 | LDX UNIT_FIND
280 | LDA UNIT_TYPE,X
281 | STA UNIT_D,X ;make backup of unit type
282 | LDA #21 ;Crazy robot AI
283 | STA UNIT_TYPE,X
284 | LDA #60
285 | STA UNIT_TIMER_B,X
286 | LDX UNIT
287 | JMP MAGN0
288 |
289 | DEAD_ROBOT:
290 | LDX UNIT
291 | LDA #0
292 | STA UNIT_TYPE,X
293 | JMP AILP
294 |
295 | UP_DOWN_ROLLERBOT:
296 | LDX UNIT
297 | LDA #7
298 | STA UNIT_TIMER_A,X
299 | JSR ROLLERBOT_ANIMATE
300 | LDX UNIT
301 | LDA UNIT_A,X ;GET DIRECTION
302 | CMP #1 ;0=UP 1=DOWN
303 | BEQ UDR01
304 | LDA #%00000001
305 | STA MOVE_TYPE
306 | JSR REQUEST_WALK_UP
307 | LDA MOVE_RESULT
308 | CMP #1
309 | BEQ UDR02
310 | LDA #1
311 | LDX UNIT
312 | STA UNIT_A,X ;CHANGE DIRECTION
313 | JSR ROLLERBOT_FIRE_DETECT
314 | JSR CHECK_FOR_WINDOW_REDRAW
315 | JMP AILP
316 | UDR01: LDA #%00000001
317 | STA MOVE_TYPE
318 | JSR REQUEST_WALK_DOWN
319 | LDA MOVE_RESULT
320 | CMP #1
321 | BEQ UDR02
322 | LDA #0
323 | LDX UNIT
324 | STA UNIT_A,X ;CHANGE DIRECTION
325 | UDR02: JSR ROLLERBOT_FIRE_DETECT
326 | JSR CHECK_FOR_WINDOW_REDRAW
327 | JMP AILP
328 |
329 | LEFT_RIGHT_ROLLERBOT:
330 | LDX UNIT
331 | LDA #7
332 | STA UNIT_TIMER_A,X
333 | JSR ROLLERBOT_ANIMATE
334 | LDX UNIT
335 | LDA UNIT_A,X ;GET DIRECTION
336 | CMP #1 ;0=LEFT 1=RIGHT
337 | BEQ LRR01
338 | LDA #%00000001
339 | STA MOVE_TYPE
340 | JSR REQUEST_WALK_LEFT
341 | LDA MOVE_RESULT
342 | CMP #1
343 | BEQ LRR02
344 | LDA #1
345 | LDX UNIT
346 | STA UNIT_A,X ;CHANGE DIRECTION
347 | JSR ROLLERBOT_FIRE_DETECT
348 | JSR CHECK_FOR_WINDOW_REDRAW
349 | JMP AILP
350 | LRR01: LDA #%00000001
351 | STA MOVE_TYPE
352 | JSR REQUEST_WALK_RIGHT
353 | LDA MOVE_RESULT
354 | CMP #1
355 | BEQ LRR02
356 | LDA #0
357 | LDX UNIT
358 | STA UNIT_A,X ;CHANGE DIRECTION
359 | LRR02: JSR ROLLERBOT_FIRE_DETECT
360 | JSR CHECK_FOR_WINDOW_REDRAW
361 | JMP AILP
362 |
363 | ROLLERBOT_FIRE_DETECT:
364 | LDA UNIT_LOC_X,X
365 | STA TEMP_A
366 | LDA UNIT_LOC_Y,X
367 | STA TEMP_B
368 | ;See if we're lined up vertically
369 | LDA UNIT_LOC_Y,X ;robot
370 | CMP UNIT_LOC_Y ;player
371 | BNE RFDE2
372 | JMP ROLLERBOT_FIRE_LR
373 | RFDE2: ;See if we're lined up horizontally
374 | LDA UNIT_LOC_X,X ;robot
375 | CMP UNIT_LOC_X ;player
376 | BNE RFDE3
377 | JMP ROLLERBOT_FIRE_UD
378 | RFDE3: RTS
379 |
380 | ROLLERBOT_FIRE_LR:
381 | LDA UNIT_LOC_X,X
382 | CMP UNIT_LOC_X
383 | BCC RBFLR2
384 | JMP ROLLERBOT_FIRE_LEFT
385 | RBFLR2: JMP ROLLERBOT_FIRE_RIGHT
386 |
387 | ROLLERBOT_FIRE_LEFT:
388 | ;Check to see if distance is less than 5
389 | LDA UNIT_LOC_X,X ;robot
390 | SEC
391 | SBC UNIT_LOC_X ;player
392 | CMP #6
393 | BCC RFL0
394 | RTS
395 | RFL0: LDX #28
396 | RFL1: LDA UNIT_TYPE,X
397 | CMP #0
398 | BEQ RFL2
399 | INX
400 | CPX #32
401 | BNE RFL1
402 | RTS
403 | RFL2: LDA #14 ;pistol fire left AI
404 | STA UNIT_TYPE,X
405 | LDA #245 ;tile for horizontal weapons fire
406 | JMP ROLLERBOT_AFTER_FIRE
407 |
408 | ROLLERBOT_FIRE_RIGHT:
409 | ;Check to see if distance is less than 5
410 | LDA UNIT_LOC_X ;player
411 | SEC
412 | SBC UNIT_LOC_X,X ;robot
413 | CMP #6
414 | BCC RFR0
415 | RTS
416 | RFR0: LDX #28
417 | RFR1: LDA UNIT_TYPE,X
418 | CMP #0
419 | BEQ RFR2
420 | INX
421 | CPX #32
422 | BNE RFR1
423 | RTS
424 | RFR2: LDA #15 ;pistol fire RIGHT AI
425 | STA UNIT_TYPE,X
426 | LDA #245 ;tile for horizontal weapons fire
427 | JMP ROLLERBOT_AFTER_FIRE
428 | RTS
429 |
430 | ROLLERBOT_FIRE_UD:
431 | LDA UNIT_LOC_Y,X
432 | CMP UNIT_LOC_Y
433 | BCC RBFUD2
434 | JMP ROLLERBOT_FIRE_UP
435 | RBFUD2: JMP ROLLERBOT_FIRE_DOWN
436 |
437 | ROLLERBOT_FIRE_UP:
438 | ;Check to see if distance is less than 5
439 | LDA UNIT_LOC_Y,X ;robot
440 | SEC
441 | SBC UNIT_LOC_Y ;player
442 | CMP #4
443 | BCC RFU0
444 | RTS
445 | RFU0: LDX #28
446 | RFU1: LDA UNIT_TYPE,X
447 | CMP #0
448 | BEQ RFU2
449 | INX
450 | CPX #32
451 | BNE RFU1
452 | RTS
453 | RFU2: LDA #12 ;pistol fire UP AI
454 | STA UNIT_TYPE,X
455 | LDA #244 ;tile for horizontal weapons fire
456 | JMP ROLLERBOT_AFTER_FIRE
457 |
458 | ROLLERBOT_FIRE_DOWN:
459 | ;Check to see if distance is less than 5
460 | LDA UNIT_LOC_Y ;player
461 | SEC
462 | SBC UNIT_LOC_Y,X ;robot
463 | CMP #4
464 | BCC RFD0
465 | RTS
466 | RFD0: LDX #28
467 | RFD1: LDA UNIT_TYPE,X
468 | CMP #0
469 | BEQ RFD2
470 | INX
471 | CPX #32
472 | BNE RFD1
473 | RTS
474 | RFD2: LDA #13 ;pistol fire DOWN AI
475 | STA UNIT_TYPE,X
476 | LDA #244 ;tile for horizontal weapons fire
477 | JMP ROLLERBOT_AFTER_FIRE
478 |
479 | ROLLERBOT_AFTER_FIRE:
480 | STA UNIT_TILE,X
481 | LDA #5 ;travel distance.
482 | STA UNIT_A,X
483 | LDA #0 ;weapon-type = pistol
484 | STA UNIT_B,X
485 | STA UNIT_TIMER_A,X
486 | LDA TEMP_A
487 | STA UNIT_LOC_X,X
488 | LDA TEMP_B
489 | STA UNIT_LOC_Y,X
490 | LDA #9 ;PISTOL SOUND
491 | JSR PLAY_SOUND ;SOUND PLAY
492 | RTS
493 |
494 | ROLLERBOT_ANIMATE:
495 | LDA UNIT_TIMER_B,X
496 | CMP #0
497 | BEQ ROLAN2
498 | DEC UNIT_TIMER_B,X
499 | RTS
500 | ROLAN2: LDA #3
501 | STA UNIT_TIMER_B,X ;RESET ANIMATE TIMER
502 | LDA UNIT_TILE,X
503 | CMP #164
504 | BNE ROLAN1
505 | LDA #165 ;ROLLERBOT TILE
506 | STA UNIT_TILE,X
507 | JSR CHECK_FOR_WINDOW_REDRAW
508 | RTS
509 | ROLAN1: LDA #164 ;ROLLERBOT TILE
510 | STA UNIT_TILE,X
511 | JSR CHECK_FOR_WINDOW_REDRAW
512 | RTS
513 |
514 |
515 |
516 | ;UNIT_A: 0=always active 1=only active when all robots are dead
517 | ;UNIT_B: 0=completes level 1=send to coordinates
518 | ;UNIT_C: X-coordinate
519 | ;UNIT_D: Y-coordinate
520 |
521 | ;The "DEMATERIALIZE" part of this AI routine has to be in the main
522 | ;source for each individual computer, because the screen effects
523 | ;are created uniquely for each one.
524 |
525 | TRANSPORTER_PAD:
526 | ;first determine if the player is standing here
527 | LDX UNIT
528 | LDA UNIT_LOC_X,X
529 | CMP UNIT_LOC_X
530 | BNE TRP01
531 | LDA UNIT_LOC_Y,X
532 | CMP UNIT_LOC_Y
533 | BNE TRP01
534 | JMP TRANS_PLAYER_PRESENT
535 | TRP01: ;player not present
536 | LDA UNIT_A,X
537 | CMP #1
538 | BEQ TRP02
539 | JMP TRANS_ACTIVE
540 | TRP02: ;test if all robots are dead
541 | LDX #1
542 | TRP03: LDA UNIT_TYPE,X
543 | CMP #0
544 | BNE TRP04
545 | INX
546 | CPX #28
547 | BNE TRP03
548 | LDX UNIT
549 | LDA #0
550 | STA UNIT_A,X ;make unit active
551 | TRP04: LDX UNIT
552 | LDA #30
553 | STA UNIT_TIMER_A,X
554 | JMP AILP
555 |
556 | TRANS_PLAYER_PRESENT:
557 | LDX UNIT
558 | LDA UNIT_A,X
559 | CMP #0 ;unit active
560 | BEQ TRPL1
561 | LDA #MSG_TRANS1
564 | STA $FC
565 | JSR PRINT_INFO
566 | LDA #11 ;error-SOUND
567 | JSR PLAY_SOUND ;SOUND PLAY
568 | LDX UNIT
569 | LDA #100
570 | STA UNIT_TIMER_A,X
571 | JMP AILP
572 | TRPL1: ;start transport process
573 | LDA #23 ;Convert to different AI
574 | STA UNIT_TYPE,X
575 | LDA #5
576 | STA UNIT_TIMER_A,X
577 | LDA #0
578 | STA UNIT_TIMER_B,X
579 | JMP AILP
580 |
581 | TRANS_ACTIVE:
582 | LDA UNIT_TIMER_B,X
583 | CMP #1
584 | BEQ TRAC1
585 | LDA #1
586 | STA UNIT_TIMER_B,X
587 | LDA #30
588 | STA TILE
589 | JMP TRAC2
590 | TRAC1: LDA #0
591 | STA UNIT_TIMER_B,X
592 | LDA #31
593 | STA TILE
594 | TRAC2: LDA UNIT_LOC_X,X
595 | STA MAP_X
596 | LDA UNIT_LOC_Y,X
597 | STA MAP_Y
598 | JSR PLOT_TILE_TO_MAP
599 | JSR CHECK_FOR_WINDOW_REDRAW
600 | LDA #30
601 | STA UNIT_TIMER_A,X
602 | JMP AILP
603 |
604 | TIME_BOMB:
605 | LDX UNIT
606 | LDA UNIT_A,X
607 | CMP #0
608 | BNE TB01
609 | JMP BIG_EXP_PHASE1
610 | TB01: CMP #1
611 | BNE TB02
612 | JMP BIG_EXP_PHASE2
613 | TB02: JMP AILP
614 |
615 | ;This is the large explosion used by the time-bomb
616 | ;and plasma gun, and maybe others. This is the first
617 | ;phase of the explosion, which stores the tiles to
618 | ;a buffer and then changes each tile to an explosion.
619 | BIG_EXP_PHASE1:
620 | LDA BIG_EXP_ACT
621 | CMP #0 ;Check that no other explosion active.
622 | BEQ BEX001
623 | LDX UNIT
624 | LDA #10
625 | STA UNIT_TIMER_A,X
626 | JMP AILP ;wait for existing explosion to finish.
627 | BEX001:
628 | LDA #1 ;Set flag so no other explosions
629 | STA BIG_EXP_ACT ;can begin until this one ends.
630 | STA SCREEN_SHAKE
631 | LDA #0 ;explosion-sound
632 | JSR PLAY_SOUND ;SOUND PLAY
633 | JSR BEX_PART1 ;check center piece for unit
634 | JSR BEXCEN ;check center piece for unit
635 | JSR BEX1_NORTH
636 | JSR BEX1_SOUTH
637 | JSR BEX1_EAST
638 | JSR BEX1_WEST
639 | JSR BEX1_NE
640 | JSR BEX1_NW
641 | JSR BEX1_SE
642 | JSR BEX1_SW
643 | LDX UNIT
644 | LDA #246 ;explosion tile
645 | STA UNIT_TILE,X
646 | LDA #1 ;move to next phase of explosion.
647 | STA UNIT_A,X
648 | LDA #12
649 | STA UNIT_TIMER_A,X
650 | LDA #1
651 | STA REDRAW_WINDOW
652 | JMP AILP
653 |
654 | ;There are 8 separate subroutines for the large explosion
655 | ;with each one handling a specific outward direction of motion.
656 | ;The "unit" itself changes tiles to an explosion, so we don't
657 | ;need to mess with the center tile.
658 | BEX1_NORTH:
659 | JSR BEX_PART1
660 | ;first tile
661 | DEC MAP_Y
662 | JSR BEX_PART2
663 | BEQ BEX1N1
664 | RTS
665 | BEX1N1: LDA TILE
666 | STA EXP_BUFFER+0
667 | JSR BEX_PART3
668 | ;second tile
669 | DEC MAP_Y
670 | JSR BEX_PART2
671 | BEQ BEX1N2
672 | RTS
673 | BEX1N2: LDA TILE
674 | STA EXP_BUFFER+1
675 | JSR BEX_PART3
676 | RTS
677 |
678 | BEX1_SOUTH:
679 | JSR BEX_PART1
680 | ;first tile
681 | INC MAP_Y
682 | JSR BEX_PART2
683 | BEQ BEX1S1
684 | RTS
685 | BEX1S1: LDA TILE
686 | STA EXP_BUFFER+2
687 | JSR BEX_PART3
688 | ;second tile
689 | INC MAP_Y
690 | JSR BEX_PART2
691 | BEQ BEX1S2
692 | RTS
693 | BEX1S2: LDA TILE
694 | STA EXP_BUFFER+3
695 | JSR BEX_PART3
696 | RTS
697 |
698 | BEX1_EAST:
699 | JSR BEX_PART1
700 | ;first tile
701 | INC MAP_X
702 | JSR BEX_PART2
703 | BEQ BEX1E1
704 | RTS
705 | BEX1E1: LDA TILE
706 | STA EXP_BUFFER+4
707 | JSR BEX_PART3
708 | ;second tile
709 | INC MAP_X
710 | JSR BEX_PART2
711 | BEQ BEX1E2
712 | RTS
713 | BEX1E2: LDA TILE
714 | STA EXP_BUFFER+5
715 | JSR BEX_PART3
716 | RTS
717 |
718 | BEX1_WEST:
719 | JSR BEX_PART1
720 | ;first tile
721 | DEC MAP_X
722 | JSR BEX_PART2
723 | BEQ BEX1W1
724 | RTS
725 | BEX1W1: LDA TILE
726 | STA EXP_BUFFER+6
727 | JSR BEX_PART3
728 | ;second tile
729 | DEC MAP_X
730 | JSR BEX_PART2
731 | BEQ BEX1W2
732 | RTS
733 | BEX1W2: LDA TILE
734 | STA EXP_BUFFER+7
735 | JSR BEX_PART3
736 | RTS
737 |
738 | BEX1_NE:
739 | JSR BEX_PART1
740 | ;first tile
741 | INC MAP_X
742 | DEC MAP_Y
743 | JSR BEX_PART2
744 | BEQ BEX1NE1
745 | RTS
746 | BEX1NE1:LDA TILE
747 | STA EXP_BUFFER+8
748 | JSR BEX_PART3
749 | ;second tile
750 | INC MAP_X
751 | DEC MAP_Y
752 | JSR BEX_PART2
753 | BEQ BEX1NE2
754 | RTS
755 | BEX1NE2:LDA TILE
756 | STA EXP_BUFFER+9
757 | JSR BEX_PART3
758 | RTS
759 |
760 | BEX1_NW:
761 | JSR BEX_PART1
762 | ;first tile
763 | DEC MAP_X
764 | DEC MAP_Y
765 | JSR BEX_PART2
766 | BEQ BEX1NW1
767 | RTS
768 | BEX1NW1:LDA TILE
769 | STA EXP_BUFFER+10
770 | JSR BEX_PART3
771 | ;second tile
772 | DEC MAP_X
773 | DEC MAP_Y
774 | JSR BEX_PART2
775 | BEQ BEX1NW2
776 | RTS
777 | BEX1NW2:LDA TILE
778 | STA EXP_BUFFER+11
779 | JSR BEX_PART3
780 | RTS
781 |
782 | BEX1_SE:
783 | JSR BEX_PART1
784 | ;first tile
785 | INC MAP_X
786 | INC MAP_Y
787 | JSR BEX_PART2
788 | BEQ BEX1SE1
789 | RTS
790 | BEX1SE1:LDA TILE
791 | STA EXP_BUFFER+12
792 | JSR BEX_PART3
793 | ;second tile
794 | INC MAP_X
795 | INC MAP_Y
796 | JSR BEX_PART2
797 | BEQ BEX1SE2
798 | RTS
799 | BEX1SE2:LDA TILE
800 | STA EXP_BUFFER+13
801 | JSR BEX_PART3
802 | RTS
803 |
804 | BEX1_SW:
805 | JSR BEX_PART1
806 | ;first tile
807 | DEC MAP_X
808 | INC MAP_Y
809 | JSR BEX_PART2
810 | BEQ BEX1SW1
811 | RTS
812 | BEX1SW1:LDA TILE
813 | STA EXP_BUFFER+14
814 | JSR BEX_PART3
815 | ;second tile
816 | DEC MAP_X
817 | INC MAP_Y
818 | JSR BEX_PART2
819 | BEQ BEX1SW2
820 | RTS
821 | BEX1SW2:LDA TILE
822 | STA EXP_BUFFER+15
823 | JSR BEX_PART3
824 | RTS
825 |
826 | BEX_PART1:
827 | LDX UNIT
828 | LDA UNIT_LOC_X,X
829 | STA MAP_X
830 | LDA UNIT_LOC_Y,X
831 | STA MAP_Y
832 | RTS
833 |
834 | BEX_PART2:
835 | JSR GET_TILE_FROM_MAP
836 | LDY TILE
837 | LDA TILE_ATTRIB,Y
838 | AND #%00010000 ;can see through tile?
839 | CMP #%00010000
840 | RTS
841 |
842 | BEX_PART3:
843 | LDA #246
844 | LDY #0
845 | STA ($FD),Y
846 | BEXCEN: JSR CHECK_FOR_UNIT
847 | LDA UNIT_FIND
848 | CMP #255
849 | BEQ EPT2
850 | LDA #11
851 | STA TEMP_A
852 | JSR INFLICT_DAMAGE
853 | EPT2: RTS
854 |
855 | BIG_EXP_PHASE2:
856 | ;Do the center tile first.
857 | JSR BEX_PART1
858 | JSR GET_TILE_FROM_MAP
859 | LDA #246
860 | STA ($FD),Y
861 | LDA TILE
862 | STA TEMP_A
863 | JSR RESTORE_TILE
864 | ;tile #0 north 1
865 | JSR BEX_PART1
866 | DEC MAP_Y
867 | LDA EXP_BUFFER+0
868 | STA TEMP_A
869 | JSR RESTORE_TILE
870 | ;tile #1 north 2
871 | DEC MAP_Y
872 | LDA EXP_BUFFER+1
873 | STA TEMP_A
874 | JSR RESTORE_TILE
875 | ;tile #2 south 1
876 | JSR BEX_PART1
877 | INC MAP_Y
878 | LDA EXP_BUFFER+2
879 | STA TEMP_A
880 | JSR RESTORE_TILE
881 | ;tile #3 south 2
882 | INC MAP_Y
883 | LDA EXP_BUFFER+3
884 | STA TEMP_A
885 | JSR RESTORE_TILE
886 | ;tile #4 east 1
887 | JSR BEX_PART1
888 | INC MAP_X
889 | LDA EXP_BUFFER+4
890 | STA TEMP_A
891 | JSR RESTORE_TILE
892 | ;tile #5 east 2
893 | INC MAP_X
894 | LDA EXP_BUFFER+5
895 | STA TEMP_A
896 | JSR RESTORE_TILE
897 | ;tile #6 west 1
898 | JSR BEX_PART1
899 | DEC MAP_X
900 | LDA EXP_BUFFER+6
901 | STA TEMP_A
902 | JSR RESTORE_TILE
903 | ;tile #7 west 2
904 | DEC MAP_X
905 | LDA EXP_BUFFER+7
906 | STA TEMP_A
907 | JSR RESTORE_TILE
908 | ;tile #8 northeast 1
909 | JSR BEX_PART1
910 | DEC MAP_Y
911 | INC MAP_X
912 | LDA EXP_BUFFER+8
913 | STA TEMP_A
914 | JSR RESTORE_TILE
915 | ;tile #9 northeast 2
916 | DEC MAP_Y
917 | INC MAP_X
918 | LDA EXP_BUFFER+9
919 | STA TEMP_A
920 | JSR RESTORE_TILE
921 | ;tile #10 northwest 1
922 | JSR BEX_PART1
923 | DEC MAP_Y
924 | DEC MAP_X
925 | LDA EXP_BUFFER+10
926 | STA TEMP_A
927 | JSR RESTORE_TILE
928 | ;tile #11 northwest 2
929 | DEC MAP_Y
930 | DEC MAP_X
931 | LDA EXP_BUFFER+11
932 | STA TEMP_A
933 | JSR RESTORE_TILE
934 | ;tile #12 southeast 1
935 | JSR BEX_PART1
936 | INC MAP_Y
937 | INC MAP_X
938 | LDA EXP_BUFFER+12
939 | STA TEMP_A
940 | JSR RESTORE_TILE
941 | ;tile #13 southeast 2
942 | INC MAP_Y
943 | INC MAP_X
944 | LDA EXP_BUFFER+13
945 | STA TEMP_A
946 | JSR RESTORE_TILE
947 | ;tile #14 southwest 1
948 | JSR BEX_PART1
949 | INC MAP_Y
950 | DEC MAP_X
951 | LDA EXP_BUFFER+14
952 | STA TEMP_A
953 | JSR RESTORE_TILE
954 | ;tile #15 southwest 2
955 | INC MAP_Y
956 | DEC MAP_X
957 | LDA EXP_BUFFER+15
958 | STA TEMP_A
959 | JSR RESTORE_TILE
960 | LDA #1
961 | STA REDRAW_WINDOW
962 | LDX UNIT
963 | LDA #0
964 | STA UNIT_TYPE,X ;Deactivate this AI
965 | STA BIG_EXP_ACT
966 | STA SCREEN_SHAKE
967 | JMP AILP
968 |
969 | RESTORE_TILE:
970 | JSR GET_TILE_FROM_MAP
971 | LDA TILE
972 | CMP #246
973 | BEQ REST0
974 | RTS
975 |
976 | REST0: LDY TEMP_A
977 | CPY #131 ;Cannister tile
978 | BEQ REST3
979 | LDA TILE_ATTRIB,Y
980 | AND #%00001000 ;can it be destroyed?
981 | CMP #%00001000
982 | BNE REST2
983 | LDA DESTRUCT_PATH,Y
984 | LDY #0
985 | STA ($FD),Y
986 | RTS
987 | REST2: LDA TEMP_A
988 | LDY #0
989 | STA ($FD),Y
990 | RTS
991 | REST3: ;What to do if we encounter an explosive cannister
992 | LDA #135 ;Blown cannister
993 | LDY #0
994 | STA ($FD),Y
995 | LDX #28 ;Start of weapons units
996 | REST4: LDA UNIT_TYPE,X
997 | CMP #0
998 | BEQ REST5
999 | INX
1000 | CPX #32
1001 | BNE REST4
1002 | RTS ;no slots available right now, abort.
1003 | REST5: LDA #6 ;bomb AI
1004 | STA UNIT_TYPE,X
1005 | LDA #131 ;Cannister tile
1006 | STA UNIT_TILE,X
1007 | LDA MAP_X
1008 | STA UNIT_LOC_X,X
1009 | LDA MAP_Y
1010 | STA UNIT_LOC_Y,X
1011 | LDA #10 ;How long until exposion?
1012 | STA UNIT_TIMER_A,X
1013 | LDA #0
1014 | STA UNIT_A,X
1015 | RTS
1016 |
1017 | TRASH_COMPACTOR:
1018 | LDX UNIT
1019 | LDA UNIT_A,X
1020 | CMP #0 ;OPEN
1021 | BNE TRS01
1022 | JMP TC_OPEN_STATE
1023 | TRS01: CMP #1 ;MID-CLOSING STATE
1024 | BNE TRS02
1025 | JMP TC_MID_CLOSING
1026 | TRS02: CMP #2 ;CLOSED STATE
1027 | BNE TRS03
1028 | JMP TC_CLOSED_STATE
1029 | TRS03: CMP #3 ;MID-OPENING STATE
1030 | BNE TRS04
1031 | JMP TC_MID_OPENING
1032 | TRS04: JMP AILP ;should never get here.
1033 |
1034 | TC_OPEN_STATE:
1035 | LDA UNIT_LOC_X,X
1036 | STA MAP_X
1037 | LDA UNIT_LOC_Y,X
1038 | STA MAP_Y
1039 | JSR GET_TILE_FROM_MAP
1040 | CMP #148 ;Usual tile for trash compactor danger zone
1041 | BNE TRS15
1042 | TRS10: INY
1043 | LDA ($FD),Y
1044 | CMP #148 ;Usual tile for trash compactor danger zone
1045 | BNE TRS15
1046 | LDA #20
1047 | STA UNIT_TIMER_A,X
1048 | ;now check for units in the compactor
1049 | LDA UNIT_LOC_X,X
1050 | STA MAP_X
1051 | LDA UNIT_LOC_Y,X
1052 | STA MAP_Y
1053 | JSR CHECK_FOR_UNIT
1054 | LDA UNIT_FIND
1055 | CMP #255
1056 | BNE TRS15
1057 | JMP AILP ;Nothing found, do nothing.
1058 | TRS15: ;Object has been detected in TC, start closing.
1059 | LDA #146
1060 | STA TCPIECE1
1061 | LDA #147
1062 | STA TCPIECE2
1063 | LDA #150
1064 | STA TCPIECE3
1065 | LDA #151
1066 | STA TCPIECE4
1067 | JSR DRAW_TRASH_COMPACTOR
1068 | INC UNIT_A,X
1069 | LDA #10
1070 | STA UNIT_TIMER_A,X
1071 | LDA #14 ;door sound
1072 | JSR PLAY_SOUND ;SOUND PLAY
1073 | JMP AILP
1074 |
1075 | TC_MID_CLOSING:
1076 | LDA #152
1077 | STA TCPIECE1
1078 | LDA #153
1079 | STA TCPIECE2
1080 | LDA #156
1081 | STA TCPIECE3
1082 | LDA #157
1083 | STA TCPIECE4
1084 | JSR DRAW_TRASH_COMPACTOR
1085 | INC UNIT_A,X
1086 | LDA #50
1087 | STA UNIT_TIMER_A,X
1088 | ;Now check for any live units in the compactor
1089 | LDA UNIT_LOC_X,X
1090 | STA MAP_X
1091 | LDA UNIT_LOC_Y,X
1092 | STA MAP_Y
1093 | JSR CHECK_FOR_UNIT
1094 | LDA UNIT_FIND
1095 | CMP #255
1096 | BNE TCMC1
1097 | INC MAP_X ;check second tile
1098 | JSR CHECK_FOR_UNIT
1099 | LDA UNIT_FIND
1100 | CMP #255
1101 | BNE TCMC1
1102 | JMP AILP
1103 | TCMC1: ;Found unit in compactor, kill it.
1104 | LDA #MSG_TERMINATED
1107 | STA $FC
1108 | JSR PRINT_INFO
1109 | LDA #0 ;EXPLOSION sound
1110 | JSR PLAY_SOUND ;SOUND PLAY
1111 | LDX UNIT_FIND
1112 | LDA #0
1113 | STA UNIT_TYPE,X
1114 | STA UNIT_HEALTH,X
1115 | LDX #28 ;start of weapons
1116 | TCMC2: LDA UNIT_TYPE,X
1117 | CMP #0
1118 | BEQ TCMC3
1119 | INX
1120 | CPX #32
1121 | BNE TCMC2
1122 | JSR CHECK_FOR_WINDOW_REDRAW
1123 | JMP AILP
1124 | TCMC3: LDA #11 ;SMALL EXPLOSION
1125 | STA UNIT_TYPE,X
1126 | LDA #248 ;first tile for explosion
1127 | STA UNIT_TILE,X
1128 | LDY UNIT
1129 | LDA UNIT_LOC_X,Y
1130 | STA UNIT_LOC_X,X
1131 | LDA UNIT_LOC_Y,Y
1132 | STA UNIT_LOC_Y,X
1133 | LDA UNIT_FIND
1134 | CMP #0 ;is it the player?
1135 | BNE TCMC4
1136 | LDA #10
1137 | STA BORDER
1138 | TCMC4: JSR CHECK_FOR_WINDOW_REDRAW
1139 | JMP AILP
1140 |
1141 | TC_CLOSED_STATE:
1142 | LDA #146
1143 | STA TCPIECE1
1144 | LDA #147
1145 | STA TCPIECE2
1146 | LDA #150
1147 | STA TCPIECE3
1148 | LDA #151
1149 | STA TCPIECE4
1150 | JSR DRAW_TRASH_COMPACTOR
1151 | INC UNIT_A,X
1152 | LDA #10
1153 | STA UNIT_TIMER_A,X
1154 | JMP AILP
1155 |
1156 | TC_MID_OPENING:
1157 | LDA #144
1158 | STA TCPIECE1
1159 | LDA #145
1160 | STA TCPIECE2
1161 | LDA #148
1162 | STA TCPIECE3
1163 | LDA #148
1164 | STA TCPIECE4
1165 | JSR DRAW_TRASH_COMPACTOR
1166 | LDA #0
1167 | STA UNIT_A,X
1168 | LDA #20
1169 | STA UNIT_TIMER_A,X
1170 | LDA #14 ;door sound
1171 | JSR PLAY_SOUND ;SOUND PLAY
1172 | JMP AILP
1173 |
1174 | DRAW_TRASH_COMPACTOR:
1175 | LDA UNIT_LOC_Y,X
1176 | STA MAP_Y
1177 | DEC MAP_Y ;start one tile above
1178 | LDA UNIT_LOC_X,X
1179 | STA MAP_X
1180 | LDA TCPIECE1
1181 | STA TILE
1182 | JSR PLOT_TILE_TO_MAP
1183 | INY
1184 | LDA TCPIECE2
1185 | STA ($FD),Y
1186 | TYA
1187 | CLC
1188 | ADC #127
1189 | TAY
1190 | LDA TCPIECE3
1191 | STA ($FD),Y
1192 | LDA TCPIECE4
1193 | INY
1194 | STA ($FD),Y
1195 | JSR CHECK_FOR_WINDOW_REDRAW
1196 | RTS
1197 | TCPIECE1: !BYTE 00
1198 | TCPIECE2: !BYTE 00
1199 | TCPIECE3: !BYTE 00
1200 | TCPIECE4: !BYTE 00
1201 |
1202 | WATER_DROID:
1203 | ;first rotate the tiles
1204 | LDX UNIT
1205 | INC UNIT_TILE,X
1206 | LDA UNIT_TILE,X
1207 | CMP #143
1208 | BNE WD01
1209 | LDA #140
1210 | STA UNIT_TILE,X
1211 | WD01: DEC UNIT_A,X
1212 | LDA UNIT_A,X
1213 | CMP #0
1214 | BEQ WD02
1215 | JSR CHECK_FOR_WINDOW_REDRAW
1216 | JMP AILP
1217 | WD02: ;kill unit after countdown reaches zero.
1218 | LDA #08 ;Dead robot type
1219 | STA UNIT_TYPE,X
1220 | LDA #255
1221 | STA UNIT_TIMER_A,X
1222 | LDA #115 ;dead robot tile
1223 | STA UNIT_TILE,X
1224 | JSR CHECK_FOR_WINDOW_REDRAW
1225 | JMP AILP
1226 |
1227 | PISTOL_FIRE_UP:
1228 | ;Check if it has reached limits.
1229 | LDX UNIT
1230 | LDA UNIT_A,X
1231 | CMP #0
1232 | BNE PFU02
1233 | ;if it has reached max range, then it vanishes.
1234 | JSR DEACTIVATE_WEAPON
1235 | JMP PFU05
1236 | PFU02: DEC UNIT_LOC_Y,X ;move it up one.
1237 | JMP PISTOL_AI_COMMON
1238 | PFU05: JSR CHECK_FOR_WINDOW_REDRAW
1239 | JMP AILP
1240 |
1241 | PISTOL_FIRE_DOWN:
1242 | ;Check if it has reached limits.
1243 | LDX UNIT
1244 | LDA UNIT_A,X
1245 | CMP #0
1246 | BNE PFD02
1247 | ;if it has reached max range, then it vanishes.
1248 | JSR DEACTIVATE_WEAPON
1249 | JMP PFD05
1250 | PFD02: INC UNIT_LOC_Y,X ;move it down one.
1251 | JMP PISTOL_AI_COMMON
1252 | PFD05: JSR CHECK_FOR_WINDOW_REDRAW
1253 | JMP AILP
1254 |
1255 | PISTOL_FIRE_LEFT:
1256 | ;Check if it has reached limits.
1257 | LDX UNIT
1258 | LDA UNIT_A,X
1259 | CMP #0
1260 | BNE PFL02
1261 | ;if it has reached max range, then it vanishes.
1262 | JSR DEACTIVATE_WEAPON
1263 | JMP PFL05
1264 | PFL02: DEC UNIT_LOC_X,X ;move it left one.
1265 | JMP PISTOL_AI_COMMON
1266 | PFL05: JSR CHECK_FOR_WINDOW_REDRAW
1267 | JMP AILP
1268 |
1269 | PISTOL_FIRE_RIGHT:
1270 | ;Check if it has reached limits.
1271 | LDX UNIT
1272 | LDA UNIT_A,X
1273 | CMP #0
1274 | BNE PFR02
1275 | ;if it has reached max range, then it vanishes.
1276 | JSR DEACTIVATE_WEAPON
1277 | JMP PFR05
1278 | PFR02: INC UNIT_LOC_X,X ;move it right one.
1279 | JMP PISTOL_AI_COMMON
1280 | PFR05: JSR CHECK_FOR_WINDOW_REDRAW
1281 | JMP AILP
1282 |
1283 | DEACTIVATE_WEAPON:
1284 | LDA #0
1285 | STA UNIT_TYPE,X
1286 | LDA UNIT_B,X
1287 | CMP #1
1288 | BNE DEW1
1289 | LDA #0
1290 | STA UNIT_B,X
1291 | STA PLASMA_ACT
1292 | DEW1: RTS
1293 |
1294 | PISTOL_AI_COMMON:
1295 | LDA UNIT_B,X ;is it pistol or plasma?
1296 | CMP #0
1297 | BEQ PAIC02
1298 | JMP PLASMA_AI_COMMON
1299 | PAIC02: DEC UNIT_A,X ;reduce range by one
1300 | ;Now check what map object it is on.
1301 | LDA UNIT_LOC_X,X
1302 | STA MAP_X
1303 | LDA UNIT_LOC_Y,X
1304 | STA MAP_Y
1305 | JSR GET_TILE_FROM_MAP
1306 | LDY TILE
1307 | CMP #131 ;explosive cannister
1308 | BNE PAIC04
1309 | ;hit an explosive cannister
1310 | LDA #135 ;Blown cannister
1311 | LDY #0
1312 | STA ($FD),Y
1313 | LDX UNIT
1314 | LDA #6 ;bomb AI
1315 | STA UNIT_TYPE,X
1316 | LDA #131 ;Cannister tile
1317 | STA UNIT_TILE,X
1318 | LDA MAP_X
1319 | STA UNIT_LOC_X,X
1320 | LDA MAP_Y
1321 | STA UNIT_LOC_Y,X
1322 | LDA #5 ;How long until exposion?
1323 | STA UNIT_TIMER_A,X
1324 | LDA #0
1325 | STA UNIT_A,X
1326 | JMP AILP
1327 | PAIC04: LDA TILE_ATTRIB,Y
1328 | ;AND #%00000010 ;Check, can hover on this?
1329 | ;CMP #%00000010
1330 | AND #%00010000 ;can see through tile?
1331 | CMP #%00010000
1332 | BEQ PAIC05
1333 | ;Hit object that can't pass through, convert to explosion
1334 | LDA #11 ;SMALL EXPLOSION
1335 | STA UNIT_TYPE,X
1336 | LDA #248 ;first tile for explosion
1337 | STA UNIT_TILE,X
1338 | JSR CHECK_FOR_WINDOW_REDRAW
1339 | JMP AILP
1340 | PAIC05: ;check if it encountered a robot/human
1341 | JSR CHECK_FOR_UNIT
1342 | LDA UNIT_FIND
1343 | CMP #255 ;NO UNIT ENCOUNTERED.
1344 | BNE PAIC06
1345 | JSR CHECK_FOR_WINDOW_REDRAW
1346 | JMP AILP
1347 | PAIC06: ;struck a robot/human
1348 | LDX UNIT
1349 | LDA #11 ;SMALL EXPLOSION
1350 | STA UNIT_TYPE,X
1351 | LDA #248 ;first tile for explosion
1352 | STA UNIT_TILE,X
1353 | LDA #1 ;set damage for pistol
1354 | STA TEMP_A
1355 | JSR INFLICT_DAMAGE
1356 | JSR ALTER_AI
1357 | JSR CHECK_FOR_WINDOW_REDRAW
1358 | JMP AILP
1359 |
1360 | PLASMA_AI_COMMON:
1361 | DEC UNIT_A,X ;reduce range by one
1362 | ;find what tile we are over
1363 | LDA UNIT_LOC_X,X
1364 | STA MAP_X
1365 | LDA UNIT_LOC_Y,X
1366 | STA MAP_Y
1367 | JSR GET_TILE_FROM_MAP
1368 | LDY TILE
1369 | CPY #131 ;cannister tile
1370 | BEQ PLAI11
1371 | LDA TILE_ATTRIB,Y
1372 | AND #%00010000 ;can see through tile?
1373 | CMP #%00010000
1374 | BEQ PLAI05
1375 | JMP PLAI11
1376 | PLAI05: ;check if it encountered a human/robot
1377 | JSR CHECK_FOR_UNIT
1378 | LDA UNIT_FIND
1379 | CMP #255 ;NO UNIT ENCOUNTERED.
1380 | BNE PLAI11
1381 | PLAI10: ;no impacts detected:
1382 | JSR CHECK_FOR_WINDOW_REDRAW
1383 | JMP AILP
1384 | PLAI11: ;impact detected. convert to explosion
1385 | LDX UNIT
1386 | LDA #6 ;bomb AI
1387 | STA UNIT_TYPE,X
1388 | LDA #1 ;How long until exposion?
1389 | STA UNIT_TIMER_A,X
1390 | LDA #0
1391 | STA UNIT_A,X
1392 | STA PLASMA_ACT
1393 | JSR CHECK_FOR_WINDOW_REDRAW
1394 | JMP AILP
1395 |
1396 | ;This routine checks to see if the robot being shot
1397 | ;is a hoverbot, if so it will alter it's AI to attack
1398 | ;mode.
1399 | ALTER_AI:
1400 | LDX UNIT_FIND
1401 | LDA UNIT_TYPE,X
1402 | CMP #2 ;hoverbot left/right
1403 | BEQ ATKMOD
1404 | CMP #3 ;hoverbot UP/DOWN
1405 | BEQ ATKMOD
1406 | RTS
1407 | ATKMOD: LDA #4 ;Attack AI
1408 | STA UNIT_TYPE,X
1409 | RTS
1410 |
1411 |
1412 | ;This routine will inflict damage on whatever is defined in
1413 | ;UNIT_FIND in the amount set in TEMP_A. If the damage is more
1414 | ;than the health of that unit, it will delete the unit.
1415 | INFLICT_DAMAGE:
1416 | LDX UNIT_FIND
1417 | LDA UNIT_HEALTH,X
1418 | SEC
1419 | SBC TEMP_A
1420 | STA UNIT_HEALTH,X
1421 | BCC UNIT_DEAD
1422 | CMP #0
1423 | BEQ UNIT_DEAD
1424 | CPX #0 ;IS IT THE PLAYER?
1425 | BNE IND1
1426 | JSR DISPLAY_PLAYER_HEALTH
1427 | LDA #10
1428 | STA BORDER
1429 | IND1: RTS
1430 | UNIT_DEAD:
1431 | LDA #0
1432 | STA UNIT_HEALTH,X
1433 | CPX #0 ;Is it the player that is dead?
1434 | BEQ UD01
1435 | LDA #08 ;Dead robot type
1436 | CMP UNIT_TYPE,X ;is it a dead robot already?
1437 | BEQ UD0A
1438 | STA UNIT_TYPE,X
1439 | LDA #255
1440 | STA UNIT_TIMER_A,X
1441 | LDA #115 ;dead robot tile
1442 | STA UNIT_TILE,X
1443 | UD0A: RTS
1444 | UD01: LDA #0
1445 | STA UNIT_TYPE,X
1446 | JSR DISPLAY_PLAYER_HEALTH
1447 | LDA #10
1448 | STA BORDER
1449 | RTS
1450 |
1451 | SMALL_EXPLOSION:
1452 | LDA #0
1453 | STA UNIT_TIMER_A,X
1454 | INC UNIT_TILE,X
1455 | LDA UNIT_TILE,X
1456 | CMP #252
1457 | BEQ SEXP1
1458 | JSR CHECK_FOR_WINDOW_REDRAW
1459 | JMP AILP
1460 | SEXP1: LDA #0
1461 | STA UNIT_TYPE,X
1462 | JSR CHECK_FOR_WINDOW_REDRAW
1463 | JMP AILP
1464 |
1465 | HOVER_ATTACK:
1466 | LDX UNIT
1467 | LDA #0
1468 | STA UNIT_TIMER_B,X
1469 | JSR HOVERBOT_ANIMATE
1470 | LDA #7
1471 | STA UNIT_TIMER_A,X
1472 | LDA #%00000010 ;HOVER
1473 | STA MOVE_TYPE
1474 | ;CHECK FOR HORIZONTAL MOVEMENT
1475 | LDA UNIT_LOC_X,X
1476 | CMP UNIT_LOC_X
1477 | BEQ HOAT13
1478 | BCC HOAT12
1479 | JSR REQUEST_WALK_LEFT
1480 | JMP HOAT13
1481 | HOAT12: JSR REQUEST_WALK_RIGHT
1482 | HOAT13: ;NOW CHECK FOR VERITCAL MOVEMENT
1483 | LDA UNIT_LOC_Y,X
1484 | CMP UNIT_LOC_Y
1485 | BEQ HOAT20
1486 | BCC HOAT14
1487 | JSR REQUEST_WALK_UP
1488 | JMP HOAT20
1489 | HOAT14: JSR REQUEST_WALK_DOWN
1490 | HOAT20: JSR ROBOT_ATTACK_RANGE
1491 | LDA PROX_DETECT
1492 | CMP #1 ;1=Robot next to player 0=not
1493 | BNE HOAT21
1494 | LDA #1 ;amount of damage it will inflict
1495 | STA TEMP_A
1496 | LDA #0 ;unit to inflict damage on.
1497 | STA UNIT_FIND
1498 | JSR INFLICT_DAMAGE
1499 | JSR CREATE_PLAYER_EXPLOSION
1500 | LDA #07 ;electric shock
1501 | JSR PLAY_SOUND ;SOUND PLAY
1502 | LDX UNIT
1503 | LDA #30 ;rate of attack on player.
1504 | STA UNIT_TIMER_A,X
1505 | ;add some code here to create explosion
1506 | HOAT21: JSR CHECK_FOR_WINDOW_REDRAW
1507 | JMP AILP
1508 |
1509 | CREATE_PLAYER_EXPLOSION:
1510 | LDX #28
1511 | TE01: LDA UNIT_TYPE,X
1512 | CMP #0
1513 | BEQ TE02
1514 | INX
1515 | CPX #32 ;max unit for weaponsfire
1516 | BNE TE01
1517 | TE02: LDA #11 ;Small explosion AI type
1518 | STA UNIT_TYPE,X
1519 | LDA #248 ;first tile for explosion
1520 | STA UNIT_TILE,X
1521 | LDA #1
1522 | STA UNIT_TIMER_A,X
1523 | LDA UNIT_LOC_X
1524 | STA UNIT_LOC_X,X
1525 | LDA UNIT_LOC_Y
1526 | STA UNIT_LOC_Y,X
1527 | RTS
1528 |
1529 | EVILBOT:
1530 | LDX UNIT
1531 | LDA #5
1532 | STA UNIT_TIMER_A,X
1533 | ;first animate evilbot
1534 | LDA UNIT_TILE,X
1535 | CMP #100
1536 | BNE EVIL1
1537 | INC UNIT_TILE,X
1538 | JMP EVIL10
1539 | EVIL1: CMP #101
1540 | BNE EVIL2
1541 | INC UNIT_TILE,X
1542 | JMP EVIL10
1543 | EVIL2: CMP #102
1544 | BNE EVIL3
1545 | INC UNIT_TILE,X
1546 | JMP EVIL10
1547 | EVIL3: LDA #100
1548 | STA UNIT_TILE,X
1549 | EVIL10: ;now figure out movement
1550 | LDA UNIT_TIMER_B,X
1551 | CMP #0
1552 | BEQ EVIL11
1553 | DEC UNIT_TIMER_B,X
1554 | JSR CHECK_FOR_WINDOW_REDRAW
1555 | JMP AILP
1556 | EVIL11: LDA #1 ;Reset timer B
1557 | STA UNIT_TIMER_B,X
1558 | LDA #%00000001 ;WALK
1559 | STA MOVE_TYPE
1560 | ;CHECK FOR HORIZONTAL MOVEMENT
1561 | LDA UNIT_LOC_X,X
1562 | CMP UNIT_LOC_X
1563 | BEQ EVIL13
1564 | BCC EVIL12
1565 | JSR REQUEST_WALK_LEFT
1566 | JMP EVIL13
1567 | EVIL12: JSR REQUEST_WALK_RIGHT
1568 | EVIL13: ;NOW CHECK FOR VERITCAL MOVEMENT
1569 | LDA UNIT_LOC_Y,X
1570 | CMP UNIT_LOC_Y
1571 | BEQ EVIL20
1572 | BCC EVIL14
1573 | JSR REQUEST_WALK_UP
1574 | JMP EVIL20
1575 | EVIL14: JSR REQUEST_WALK_DOWN
1576 | EVIL20: JSR ROBOT_ATTACK_RANGE
1577 | LDA PROX_DETECT
1578 | CMP #1 ;1=Robot next to player 0=not
1579 | BNE EVIL21
1580 | LDA #5 ;amount of damage it will inflict
1581 | STA TEMP_A
1582 | LDA #0 ;unit to inflict damage on.
1583 | STA UNIT_FIND
1584 | JSR INFLICT_DAMAGE
1585 | JSR CREATE_PLAYER_EXPLOSION
1586 | LDA #07 ;electric shock sound
1587 | JSR PLAY_SOUND ;SOUND PLAY
1588 | LDX UNIT
1589 | LDA #15 ;rate of attack on player.
1590 | STA UNIT_TIMER_A,X
1591 | EVIL21: JSR CHECK_FOR_WINDOW_REDRAW
1592 | JMP AILP
1593 |
1594 | ;This routine handles automatic sliding doors.
1595 | ;UNIT_B register means:
1596 | ;0=opening-A 1=opening-B 2=OPEN 3=closing-A 4=closing-B 5-CLOSED
1597 | AI_DOOR:
1598 | LDX UNIT
1599 | LDA UNIT_B,X
1600 | CMP #06 ;make sure number is in bounds
1601 | BCS DOORA
1602 | TAY
1603 | LDA AIDB_L,Y
1604 | STA DOORJ+1
1605 | LDA AIDB_H,Y
1606 | STA DOORJ+2
1607 | DOORJ: JMP $0000 ;self modifying code
1608 | DOORA: JMP AILP ;-SHOULD NEVER NEED TO HAPPEN
1609 | AIDB_L:
1610 | !BYTE DOOR_OPEN_A
1618 | !BYTE >DOOR_OPEN_B
1619 | !BYTE >DOOR_OPEN_FULL
1620 | !BYTE >DOOR_CLOSE_A
1621 | !BYTE >DOOR_CLOSE_B
1622 | !BYTE >DOOR_CLOSE_FULL
1623 |
1624 | DOOR_OPEN_A:
1625 | LDA UNIT_A,X
1626 | CMP #1
1627 | BEQ DOA1
1628 | ;HORIZONTAL DOOR
1629 | LDA #88
1630 | STA DOORPIECE1
1631 | LDA #89
1632 | STA DOORPIECE2
1633 | LDA #86
1634 | STA DOORPIECE3
1635 | JSR DRAW_HORIZONTAL_DOOR
1636 | JMP DOA2
1637 | DOA1: ;VERTICAL DOOR
1638 | LDA #70
1639 | STA DOORPIECE1
1640 | LDA #74
1641 | STA DOORPIECE2
1642 | LDA #78
1643 | STA DOORPIECE3
1644 | JSR DRAW_VERTICAL_DOOR
1645 | DOA2: LDY UNIT
1646 | LDA #1
1647 | STA UNIT_B,X
1648 | LDA #5
1649 | STA UNIT_TIMER_A,X
1650 | JSR CHECK_FOR_WINDOW_REDRAW
1651 | JMP AILP
1652 |
1653 | DOOR_OPEN_B:
1654 | LDA UNIT_A,X
1655 | CMP #1
1656 | BEQ DOB1
1657 | ;HORIZONTAL DOOR
1658 | LDA #17
1659 | STA DOORPIECE1
1660 | LDA #09
1661 | STA DOORPIECE2
1662 | LDA #91
1663 | STA DOORPIECE3
1664 | JSR DRAW_HORIZONTAL_DOOR
1665 | JMP DOB2
1666 | DOB1: ;VERTICAL DOOR
1667 | LDA #27
1668 | STA DOORPIECE1
1669 | LDA #09
1670 | STA DOORPIECE2
1671 | LDA #15
1672 | STA DOORPIECE3
1673 | JSR DRAW_VERTICAL_DOOR
1674 | DOB2: LDX UNIT
1675 | LDA #2
1676 | STA UNIT_B,X
1677 | LDA #30
1678 | STA UNIT_TIMER_A,X
1679 | JSR CHECK_FOR_WINDOW_REDRAW
1680 | JMP AILP
1681 | DOOR_OPEN_FULL:
1682 | LDX UNIT
1683 | JSR DOOR_CHECK_PROXIMITY
1684 | LDA PROX_DETECT
1685 | CMP #1
1686 | BNE DOF1
1687 | LDA #30
1688 | STA UNIT_TIMER_B,X ;RESET TIMER
1689 | JMP AILP
1690 | DOF1: ;if nobody near door, lets close it.
1691 | ;check for object in the way first.
1692 | LDA UNIT_LOC_X,X
1693 | STA MAP_X
1694 | LDA UNIT_LOC_Y,X
1695 | STA MAP_Y
1696 | JSR GET_TILE_FROM_MAP
1697 | LDA TILE
1698 | CMP #09 ;FLOOR-TILE
1699 | BEQ DOFB
1700 | ;SOMETHING IN THE WAY, ABORT
1701 | LDA #35
1702 | STA UNIT_TIMER_A,X
1703 | JMP AILP
1704 | DOFB: LDA #14 ;DOOR-SOUND
1705 | JSR PLAY_SOUND ;SOUND PLAY
1706 | LDX UNIT
1707 | LDA UNIT_A,X
1708 | CMP #1
1709 | BEQ DOF2
1710 | ;HORIZONTAL_DOOR
1711 | LDA #88
1712 | STA DOORPIECE1
1713 | LDA #89
1714 | STA DOORPIECE2
1715 | LDA #86
1716 | STA DOORPIECE3
1717 | JSR DRAW_HORIZONTAL_DOOR
1718 | JMP DOF3
1719 | DOF2: ;VERTICAL DOOR
1720 | LDA #70
1721 | STA DOORPIECE1
1722 | LDA #74
1723 | STA DOORPIECE2
1724 | LDA #78
1725 | STA DOORPIECE3
1726 | JSR DRAW_VERTICAL_DOOR
1727 | DOF3: LDY UNIT
1728 | LDA #3
1729 | STA UNIT_B,X
1730 | LDA #5
1731 | STA UNIT_TIMER_A,X
1732 | JSR CHECK_FOR_WINDOW_REDRAW
1733 | JMP AILP
1734 |
1735 | DOOR_CLOSE_A:
1736 | LDA UNIT_A,X
1737 | CMP #1
1738 | BEQ DCA2
1739 | ;HORIZONTAL DOOR
1740 | LDA #84
1741 | STA DOORPIECE1
1742 | LDA #85
1743 | STA DOORPIECE2
1744 | LDA #86
1745 | STA DOORPIECE3
1746 | JSR DRAW_HORIZONTAL_DOOR
1747 | JMP DCA3
1748 | DCA2: ;VERTICAL DOOR
1749 | LDA #69
1750 | STA DOORPIECE1
1751 | LDA #73
1752 | STA DOORPIECE2
1753 | LDA #77
1754 | STA DOORPIECE3
1755 | JSR DRAW_VERTICAL_DOOR
1756 | DCA3: LDY UNIT
1757 | LDA #4
1758 | STA UNIT_B,X
1759 | LDA #5
1760 | STA UNIT_TIMER_A,X
1761 | JSR CHECK_FOR_WINDOW_REDRAW
1762 | JMP AILP
1763 |
1764 | DOOR_CLOSE_B:
1765 | LDA UNIT_A,X
1766 | CMP #1
1767 | BEQ DCB2
1768 | ;HORIZONTAL DOOR
1769 | LDA #80
1770 | STA DOORPIECE1
1771 | LDA #81
1772 | STA DOORPIECE2
1773 | LDA #82
1774 | STA DOORPIECE3
1775 | JSR DRAW_HORIZONTAL_DOOR
1776 | JMP DCB3
1777 | DCB2: ;VERTICAL DOOR
1778 | LDA #68
1779 | STA DOORPIECE1
1780 | LDA #72
1781 | STA DOORPIECE2
1782 | LDA #76
1783 | STA DOORPIECE3
1784 | JSR DRAW_VERTICAL_DOOR
1785 | DCB3: LDY UNIT
1786 | LDA #5
1787 | STA UNIT_B,X
1788 | LDA #5
1789 | STA UNIT_TIMER_A,X
1790 | JSR CHECK_FOR_WINDOW_REDRAW
1791 | JMP AILP
1792 |
1793 | DOOR_CLOSE_FULL:
1794 | LDX UNIT
1795 | JSR DOOR_CHECK_PROXIMITY
1796 | LDA PROX_DETECT
1797 | CMP #0
1798 | BNE DCF1
1799 | DCF0: LDA #20
1800 | STA UNIT_TIMER_A,X ;RESET TIMER
1801 | JMP AILP
1802 | DCF1: ;if player near door, lets open it.
1803 | ;first check if locked
1804 | LDA UNIT_C,X ;Lock status
1805 | CMP #0 ;UNLOCKED
1806 | BEQ DCFZ
1807 | CMP #1 ;SPADE KEY
1808 | BNE DCFB
1809 | LDA KEYS
1810 | AND #%00000001 ;CHECK FOR SPADE KEY
1811 | CMP #%00000001
1812 | BEQ DCFZ
1813 | JMP DCF0
1814 | DCFB: CMP #2 ;HEART KEY
1815 | BNE DCFC
1816 | LDA KEYS
1817 | AND #%00000010 ;CHECK FOR HEART KEY
1818 | CMP #%00000010
1819 | BEQ DCFZ
1820 | JMP DCF0
1821 | DCFC: CMP #3 ;STAR KEY
1822 | BNE DCF0 ;SHOULD NEVER HAPPEN
1823 | LDA KEYS
1824 | AND #%00000100 ;CHECK FOR STAR KEY
1825 | CMP #%00000100
1826 | BEQ DCFZ
1827 | JMP DCF0
1828 | DCFZ: ;Start open door process
1829 | LDA #14 ;DOOR-SOUND
1830 | JSR PLAY_SOUND ;SOUND PLAY
1831 | LDX UNIT
1832 | LDA UNIT_A,X
1833 | CMP #1
1834 | BEQ DCF2
1835 | ;HORIZONTAL DOOR
1836 | LDA #84
1837 | STA DOORPIECE1
1838 | LDA #85
1839 | STA DOORPIECE2
1840 | LDA #86
1841 | STA DOORPIECE3
1842 | JSR DRAW_HORIZONTAL_DOOR
1843 | JMP DCF3
1844 | ;VERTICAL DOOR
1845 | DCF2: LDA #69
1846 | STA DOORPIECE1
1847 | LDA #73
1848 | STA DOORPIECE2
1849 | LDA #77
1850 | STA DOORPIECE3
1851 | JSR DRAW_VERTICAL_DOOR
1852 | DCF3: LDY UNIT
1853 | LDA #0
1854 | STA UNIT_B,X
1855 | LDA #5
1856 | STA UNIT_TIMER_A,X
1857 | JSR CHECK_FOR_WINDOW_REDRAW
1858 | JMP AILP
1859 |
1860 | DRAW_VERTICAL_DOOR:
1861 | LDA UNIT_LOC_Y,X
1862 | STA MAP_Y
1863 | DEC MAP_Y
1864 | LDA UNIT_LOC_X,X
1865 | STA MAP_X
1866 | LDA DOORPIECE1
1867 | STA TILE
1868 | JSR PLOT_TILE_TO_MAP
1869 | LDA $FD
1870 | CLC
1871 | ADC #128
1872 | STA $FD
1873 | LDA $FE
1874 | ADC #$00
1875 | STA $FE
1876 | LDA DOORPIECE2
1877 | STA ($FD),Y
1878 | LDA $FD
1879 | CLC
1880 | ADC #128
1881 | STA $FD
1882 | LDA $FE
1883 | ADC #$00
1884 | STA $FE
1885 | LDA DOORPIECE3
1886 | STA ($FD),Y
1887 | RTS
1888 |
1889 | DRAW_HORIZONTAL_DOOR:
1890 | LDA UNIT_LOC_X,X
1891 | STA MAP_X
1892 | DEC MAP_X
1893 | LDA UNIT_LOC_Y,X
1894 | STA MAP_Y
1895 | LDA DOORPIECE1
1896 | STA TILE
1897 | JSR PLOT_TILE_TO_MAP
1898 | INY
1899 | LDA DOORPIECE2
1900 | STA ($FD),Y
1901 | INY
1902 | LDA DOORPIECE3
1903 | STA ($FD),Y
1904 | RTS
1905 | DOORPIECE1 !BYTE 00
1906 | DOORPIECE2 !BYTE 00
1907 | DOORPIECE3 !BYTE 00
1908 |
1909 | ROBOT_ATTACK_RANGE:
1910 | ;First check horizontal proximity to door
1911 | LDA UNIT_LOC_X,X ;ROBOT UNIT
1912 | SEC ;always set carry before subtraction
1913 | SBC UNIT_LOC_X ;PLAYER UNIT
1914 | BCC RAR1 ;if carry cleared then its negative
1915 | JMP RAR2
1916 | RAR1: EOR #$FF ;convert two's comp back to positive
1917 | ADC #$01 ;no need for CLC here, already cleared
1918 | RAR2: CMP #1 ;1 HORIZONTAL TILE FROM PLAYER
1919 | BCC RAR3
1920 | LDA #0 ;player not detected
1921 | STA PROX_DETECT
1922 | RTS
1923 | RAR3: ;Now check vertical proximity
1924 | LDA UNIT_LOC_Y,X ;DOOR UNIT
1925 | SEC ;always set carry before subtraction
1926 | SBC UNIT_LOC_Y ;PLAYER UNIT
1927 | BCC RAR4 ;if carry cleared then its negative
1928 | JMP RAR5
1929 | RAR4: EOR #$FF ;convert two's comp back to positive
1930 | ADC #$01 ;no need for CLC here, already cleared
1931 | RAR5: CMP #1 ;1 VERTICAL TILE FROM PLAYER
1932 | BCC RAR6
1933 | LDA #0 ;player not detected
1934 | STA PROX_DETECT
1935 | RTS
1936 | RAR6: ;PLAYER DETECTED, CHANGE DOOR MODE.
1937 | LDA #1
1938 | STA PROX_DETECT
1939 | RTS
1940 |
1941 | DOOR_CHECK_PROXIMITY:
1942 | ;First check horizontal proximity to door
1943 | LDA UNIT_LOC_X,X ;DOOR UNIT
1944 | SEC ;always set carry before subtraction
1945 | SBC UNIT_LOC_X ;PLAYER UNIT
1946 | BCC PRD1 ;if carry cleared then its negative
1947 | JMP PRD2
1948 | PRD1: EOR #$FF ;convert two's comp back to positive
1949 | ADC #$01 ;no need for CLC here, already cleared
1950 | PRD2: CMP #2 ;2 HORIZONTAL TILES FROM PLAYER
1951 | BCC PRD3
1952 | LDA #0 ;player not detected
1953 | STA PROX_DETECT
1954 | RTS
1955 | PRD3: ;Now check vertical proximity
1956 | LDA UNIT_LOC_Y,X ;DOOR UNIT
1957 | SEC ;always set carry before subtraction
1958 | SBC UNIT_LOC_Y ;PLAYER UNIT
1959 | BCC PRD4 ;if carry cleared then its negative
1960 | JMP PRD5
1961 | PRD4: EOR #$FF ;convert two's comp back to positive
1962 | ADC #$01 ;no need for CLC here, already cleared
1963 | PRD5: CMP #2 ;2 VERTICAL TILES FROM PLAYER
1964 | BCC PRD6
1965 | LDA #0 ;player not detected
1966 | STA PROX_DETECT
1967 | RTS
1968 | PRD6: ;PLAYER DETECTED, CHANGE DOOR MODE.
1969 | LDA #1
1970 | STA PROX_DETECT
1971 | RTS
1972 | PROX_DETECT !BYTE 00 ;0=NO 1=YES
1973 |
1974 | ;This routine handles automatic sliding doors.
1975 | ;UNIT_B register means:
1976 | ;0=opening-A 1=opening-B 2=OPEN 3=closing-A 4=closing-B 5-CLOSED
1977 | ELEVATOR:
1978 | LDX UNIT
1979 | LDA UNIT_B,X
1980 | CMP #06 ;make sure number is in bounds
1981 | BCS ELEVA
1982 | TAY
1983 | LDA ELDB_L,Y
1984 | STA ELEVJ+1
1985 | LDA ELDB_H,Y
1986 | STA ELEVJ+2
1987 | ELEVJ: JMP $0000 ;self modifying code
1988 | ELEVA: JMP AILP ;-SHOULD NEVER NEED TO HAPPEN
1989 | ELDB_L:
1990 | !BYTE ELEV_OPEN_A
1998 | !BYTE >ELEV_OPEN_B
1999 | !BYTE >ELEV_OPEN_FULL
2000 | !BYTE >ELEV_CLOSE_A
2001 | !BYTE >ELEV_CLOSE_B
2002 | !BYTE >ELEV_CLOSE_FULL
2003 |
2004 | ELEV_OPEN_A:
2005 | LDA #181
2006 | STA DOORPIECE1
2007 | LDA #89
2008 | STA DOORPIECE2
2009 | LDA #173
2010 | STA DOORPIECE3
2011 | JSR DRAW_HORIZONTAL_DOOR
2012 | LDY UNIT
2013 | LDA #1
2014 | STA UNIT_B,X
2015 | LDA #5
2016 | STA UNIT_TIMER_A,X
2017 | JSR CHECK_FOR_WINDOW_REDRAW
2018 | JMP AILP
2019 |
2020 | ELEV_OPEN_B:
2021 | LDA #182
2022 | STA DOORPIECE1
2023 | LDA #09
2024 | STA DOORPIECE2
2025 | LDA #172
2026 | STA DOORPIECE3
2027 | JSR DRAW_HORIZONTAL_DOOR
2028 | LDX UNIT
2029 | LDA #2
2030 | STA UNIT_B,X
2031 | LDA #50
2032 | STA UNIT_TIMER_A,X
2033 | JSR CHECK_FOR_WINDOW_REDRAW
2034 | JMP AILP
2035 |
2036 | ELEV_OPEN_FULL:
2037 | LDX UNIT
2038 | EVOF1: ;CLOSE DOOR
2039 | ;check for object in the way first.
2040 | LDA UNIT_LOC_X,X
2041 | STA MAP_X
2042 | LDA UNIT_LOC_Y,X
2043 | STA MAP_Y
2044 | JSR GET_TILE_FROM_MAP
2045 | LDA TILE
2046 | CMP #09 ;FLOOR-TILE
2047 | BEQ EVOF3
2048 | ;SOMETHING IN THE WAY, ABORT
2049 | EVOF2: LDA #35
2050 | STA UNIT_TIMER_A,X
2051 | JMP AILP
2052 | EVOF3: ;check for player or robot in the way
2053 | JSR CHECK_FOR_UNIT
2054 | LDX UNIT
2055 | LDA UNIT_FIND
2056 | CMP #255
2057 | BNE EVOF2
2058 | EVOFB: ;START TO CLOSE ELEVATOR DOOR
2059 | LDA #14 ;DOOR SOUND
2060 | JSR PLAY_SOUND ;SOUND PLAY
2061 | LDX UNIT
2062 | LDA #181
2063 | STA DOORPIECE1
2064 | LDA #89
2065 | STA DOORPIECE2
2066 | LDA #173
2067 | STA DOORPIECE3
2068 | JSR DRAW_HORIZONTAL_DOOR
2069 | LDX UNIT
2070 | LDA #3
2071 | STA UNIT_B,X
2072 | LDA #5
2073 | STA UNIT_TIMER_A,X
2074 | JSR CHECK_FOR_WINDOW_REDRAW
2075 | JMP AILP
2076 |
2077 | ELEV_CLOSE_A:
2078 | LDA #84
2079 | STA DOORPIECE1
2080 | LDA #85
2081 | STA DOORPIECE2
2082 | LDA #173
2083 | STA DOORPIECE3
2084 | JSR DRAW_HORIZONTAL_DOOR
2085 | LDY UNIT
2086 | LDA #4
2087 | STA UNIT_B,X
2088 | LDA #5
2089 | STA UNIT_TIMER_A,X
2090 | JSR CHECK_FOR_WINDOW_REDRAW
2091 | JMP AILP
2092 |
2093 | ELEV_CLOSE_B:
2094 | LDA #80
2095 | STA DOORPIECE1
2096 | LDA #81
2097 | STA DOORPIECE2
2098 | LDA #174
2099 | STA DOORPIECE3
2100 | JSR DRAW_HORIZONTAL_DOOR
2101 | LDY UNIT
2102 | LDA #5
2103 | STA UNIT_B,X
2104 | LDA #5
2105 | STA UNIT_TIMER_A,X
2106 | JSR CHECK_FOR_WINDOW_REDRAW
2107 | JSR ELEVATOR_PANEL
2108 | JMP AILP
2109 |
2110 | ELEV_CLOSE_FULL:
2111 | LDX UNIT
2112 | JSR DOOR_CHECK_PROXIMITY
2113 | LDA PROX_DETECT
2114 | CMP #0
2115 | BNE EVF1
2116 | LDA #20
2117 | STA UNIT_TIMER_A,X ;RESET TIMER
2118 | JMP AILP
2119 | EVF1: ;Start open door process
2120 | LDA #14 ;DOOR SOUND
2121 | JSR PLAY_SOUND ;SOUND PLAY
2122 | LDX UNIT
2123 | LDA #84
2124 | STA DOORPIECE1
2125 | LDA #85
2126 | STA DOORPIECE2
2127 | LDA #173
2128 | STA DOORPIECE3
2129 | JSR DRAW_HORIZONTAL_DOOR
2130 | LDY UNIT
2131 | LDA #0
2132 | STA UNIT_B,X
2133 | LDA #5
2134 | STA UNIT_TIMER_A,X
2135 | JSR CHECK_FOR_WINDOW_REDRAW
2136 | JMP AILP
2137 |
2138 | ELEVATOR_PANEL:
2139 | ;Check to see if player is standing in the
2140 | ;elevator first.
2141 | LDX UNIT
2142 | LDA UNIT_LOC_X,X ;elevator X location
2143 | CMP UNIT_LOC_X ;player X location
2144 | BEQ ELPN1
2145 | RTS
2146 | ELPN1: LDA UNIT_LOC_Y,X ;elevator Y location
2147 | SEC
2148 | SBC #01
2149 | CMP UNIT_LOC_Y ;player Y location
2150 | BEQ ELPN2
2151 | RTS
2152 | ELPN2: ;PLAYER DETECTED, START ELEVATOR PANEL
2153 | LDA #MSG_ELEVATOR
2156 | STA $FC
2157 | JSR PRINT_INFO
2158 | LDA #MSG_LEVELS
2161 | STA $FC
2162 | JSR PRINT_INFO
2163 | JSR ELEVATOR_SELECT
2164 | RTS
2165 |
2166 | PLOT_TILE_TO_MAP:
2167 | LDY #0
2168 | LDA MAP_Y
2169 | CLC
2170 | ROR
2171 | PHP
2172 | CLC
2173 | ADC #>MAP
2174 | STA $FE ;HIGH BYTE OF MAP SOURCE
2175 | LDA #$0
2176 | PLP
2177 | ROR
2178 | ORA MAP_X
2179 | STA $FD ;LOW BYTE OF MAP SOURCE
2180 | LDA TILE
2181 | STA ($FD),Y
2182 | RTS
2183 |
2184 | ;This routine will return the tile for a specific X/Y
2185 | ;on the map. You must first define MAP_X and MAP-Y.
2186 | ;The result is stored in TILE.
2187 | GET_TILE_FROM_MAP:
2188 | LDY #0
2189 | LDA MAP_Y
2190 | CLC
2191 | ROR
2192 | PHP
2193 | CLC
2194 | ADC #>MAP
2195 | STA $FE ;HIGH BYTE OF MAP SOURCE
2196 | LDA #$0
2197 | PLP
2198 | ROR
2199 | ORA MAP_X
2200 | STA $FD ;LOW BYTE OF MAP SOURCE
2201 | LDA ($FD),Y
2202 | STA TILE
2203 | RTS
2204 |
2205 | ;In this AI routine, the droid simply goes left until it
2206 | ;hits an object, and then reverses direction and does the
2207 | ;same, bouncing back and forth.
2208 | LEFT_RIGHT_DROID:
2209 | LDX UNIT
2210 | JSR HOVERBOT_ANIMATE
2211 | LDA #10 ;reset timer to 10
2212 | STA UNIT_TIMER_A,X
2213 | LDA UNIT_A,X ;GET DIRECTION
2214 | CMP #1 ;0=LEFT 1=RIGHT
2215 | BEQ LRD01
2216 | LDA #%00000010
2217 | STA MOVE_TYPE
2218 | JSR REQUEST_WALK_LEFT
2219 | LDA MOVE_RESULT
2220 | CMP #1
2221 | BEQ LRD02
2222 | LDA #1
2223 | LDX UNIT
2224 | STA UNIT_A,X ;CHANGE DIRECTION
2225 | JSR CHECK_FOR_WINDOW_REDRAW
2226 | JMP AILP
2227 | LRD01: LDA #%00000010
2228 | STA MOVE_TYPE
2229 | JSR REQUEST_WALK_RIGHT
2230 | LDA MOVE_RESULT
2231 | CMP #1
2232 | BEQ LRD02
2233 | LDA #0
2234 | LDX UNIT
2235 | STA UNIT_A,X ;CHANGE DIRECTION
2236 | LRD02: JSR CHECK_FOR_WINDOW_REDRAW
2237 | JMP AILP
2238 |
2239 | ;In this AI routine, the droid simply goes UP until it
2240 | ;hits an object, and then reverses direction and does the
2241 | ;same, bouncing back and forth.
2242 | UP_DOWN_DROID:
2243 | LDX UNIT
2244 | JSR HOVERBOT_ANIMATE
2245 | LDA #10 ;reset timer to 10
2246 | STA UNIT_TIMER_A,X
2247 | LDA UNIT_A,X ;GET DIRECTION
2248 | CMP #1 ;0=UP 1=DOWN
2249 | BEQ UDD01
2250 | LDA #%00000010
2251 | STA MOVE_TYPE
2252 | JSR REQUEST_WALK_UP
2253 | LDA MOVE_RESULT
2254 | CMP #1
2255 | BEQ UDD02
2256 | LDA #1
2257 | LDX UNIT
2258 | STA UNIT_A,X ;CHANGE DIRECTION
2259 | JSR CHECK_FOR_WINDOW_REDRAW
2260 | JMP AILP
2261 | UDD01: LDA #%00000010
2262 | STA MOVE_TYPE
2263 | JSR REQUEST_WALK_DOWN
2264 | LDA MOVE_RESULT
2265 | CMP #1
2266 | BEQ UDD02
2267 | LDA #0
2268 | LDX UNIT
2269 | STA UNIT_A,X ;CHANGE DIRECTION
2270 | UDD02: JSR CHECK_FOR_WINDOW_REDRAW
2271 | JMP AILP
2272 |
2273 | HOVERBOT_ANIMATE:
2274 | LDA UNIT_TIMER_B,X
2275 | CMP #0
2276 | BEQ HOVAN2
2277 | DEC UNIT_TIMER_B,X
2278 | RTS
2279 | HOVAN2: LDA #3
2280 | STA UNIT_TIMER_B,X ;RESET ANIMATE TIMER
2281 | LDA UNIT_TILE,X
2282 | CMP #98
2283 | BNE HOVAN1
2284 | LDA #99 ;HOVERBOT TILE
2285 | STA UNIT_TILE,X
2286 | RTS
2287 | HOVAN1: LDA #98 ;HOVERBOT TILE
2288 | STA UNIT_TILE,X
2289 | RTS
2290 |
2291 | ;The following 4 routines are used by both the player and some
2292 | ;of the enemy units. It checks to see if you can walk in a
2293 | ;specific direction. It checks for edge of map and also that
2294 | ;the tile you want to walk onto can allow that. There is a
2295 | ;separate routine for hovering robots.
2296 | REQUEST_WALK_RIGHT:
2297 | LDY UNIT
2298 | LDA UNIT_LOC_X,Y
2299 | CMP #122
2300 | BEQ MGR01
2301 | STA MAP_X
2302 | INC MAP_X
2303 | LDA UNIT_LOC_Y,Y
2304 | STA MAP_Y
2305 | JSR GET_TILE_FROM_MAP
2306 | LDY TILE
2307 | LDA TILE_ATTRIB,Y
2308 | AND MOVE_TYPE ;Check, can walk on this tile?
2309 | CMP MOVE_TYPE
2310 | BNE MGR01
2311 | JSR CHECK_FOR_UNIT
2312 | LDA UNIT_FIND
2313 | CMP #255
2314 | BNE MGR01
2315 | LDX UNIT
2316 | INC UNIT_LOC_X,X
2317 | LDA #1 ;Move success
2318 | STA MOVE_RESULT
2319 | RTS
2320 | MGR01: LDA #0 ;Move fail
2321 | STA MOVE_RESULT
2322 | RTS
2323 |
2324 | REQUEST_WALK_LEFT:
2325 | LDY UNIT
2326 | LDA UNIT_LOC_X,Y
2327 | CMP #5
2328 | BEQ MGL01
2329 | STA MAP_X
2330 | DEC MAP_X
2331 | LDA UNIT_LOC_Y,Y
2332 | STA MAP_Y
2333 | JSR GET_TILE_FROM_MAP
2334 | LDY TILE
2335 | LDA TILE_ATTRIB,Y
2336 | AND MOVE_TYPE ;Check, can walk on this tile?
2337 | CMP MOVE_TYPE
2338 | BNE MGL01
2339 | JSR CHECK_FOR_UNIT
2340 | LDA UNIT_FIND
2341 | CMP #255
2342 | BNE MGL01
2343 | LDX UNIT
2344 | DEC UNIT_LOC_X,X
2345 | LDA #1 ;Move success
2346 | STA MOVE_RESULT
2347 | RTS
2348 | MGL01: LDA #0 ;Move fail
2349 | STA MOVE_RESULT
2350 | RTS
2351 |
2352 | REQUEST_WALK_DOWN:
2353 | LDY UNIT
2354 | LDA UNIT_LOC_Y,Y
2355 | CMP #60
2356 | BEQ MGD01
2357 | STA MAP_Y
2358 | INC MAP_Y
2359 | LDA UNIT_LOC_X,Y
2360 | STA MAP_X
2361 | JSR GET_TILE_FROM_MAP
2362 | LDY TILE
2363 | LDA TILE_ATTRIB,Y
2364 | AND MOVE_TYPE ;Check, can walk on this tile?
2365 | CMP MOVE_TYPE
2366 | BNE MGD01
2367 | JSR CHECK_FOR_UNIT
2368 | LDA UNIT_FIND
2369 | CMP #255
2370 | BNE MGD01
2371 | LDX UNIT
2372 | INC UNIT_LOC_Y,X
2373 | LDA #1 ;Move success
2374 | STA MOVE_RESULT
2375 | RTS
2376 | MGD01: LDA #0 ;Move fail
2377 | STA MOVE_RESULT
2378 | RTS
2379 |
2380 | REQUEST_WALK_UP:
2381 | LDY UNIT
2382 | LDA UNIT_LOC_Y,Y
2383 | CMP #3
2384 | BEQ MGU01
2385 | STA MAP_Y
2386 | DEC MAP_Y
2387 | LDA UNIT_LOC_X,Y
2388 | STA MAP_X
2389 | JSR GET_TILE_FROM_MAP
2390 | LDY TILE
2391 | LDA TILE_ATTRIB,Y
2392 | AND MOVE_TYPE ;Check, can walk on this tile?
2393 | CMP MOVE_TYPE
2394 | BNE MGU01
2395 | JSR CHECK_FOR_UNIT
2396 | LDA UNIT_FIND
2397 | CMP #255
2398 | BNE MGU01
2399 | LDX UNIT
2400 | DEC UNIT_LOC_Y,X
2401 | LDA #1 ;Move success
2402 | STA MOVE_RESULT
2403 | RTS
2404 | MGU01: LDA #0 ;Move fail
2405 | STA MOVE_RESULT
2406 | RTS
2407 |
2408 | ;This routine checks a specific place on the map specified
2409 | ;in MAP_X and MAP_Y to see if there is a unit present at
2410 | ;that spot. If so, the unit# will be stored in UNIT_FIND
2411 | ;otherwise 255 will be stored.
2412 | CHECK_FOR_UNIT:
2413 | LDX #0
2414 | CFU00: LDA UNIT_TYPE,X
2415 | CMP #0
2416 | BNE CFU02
2417 | CFU01: INX
2418 | CPX #28
2419 | BNE CFU00
2420 | LDA #255
2421 | STA UNIT_FIND ;no units found
2422 | RTS
2423 | CFU02: LDA UNIT_LOC_X,X
2424 | CMP MAP_X
2425 | BNE CFU01
2426 | LDA UNIT_LOC_Y,X
2427 | CMP MAP_Y
2428 | BNE CFU01
2429 | STX UNIT_FIND ;unit found
2430 | RTS
2431 |
2432 | ;This routine checks a specific place on the map specified
2433 | ;in MAP_X and MAP_Y to see if there is a hidden unit present
2434 | ;at that spot. If so, the unit# will be stored in UNIT_FIND
2435 | ;otherwise 255 will be stored.
2436 | CHECK_FOR_HIDDEN_UNIT:
2437 | LDX #48
2438 | CFH00: LDA UNIT_TYPE,X
2439 | CMP #0
2440 | BNE CFH02
2441 | CFH01: INX
2442 | CPX #64
2443 | BNE CFH00
2444 | LDA #255
2445 | STA UNIT_FIND ;no units found
2446 | RTS
2447 | CFH02: ;first compare horizontal position
2448 | LDA UNIT_LOC_X,X
2449 | CMP MAP_X
2450 | BEQ CFH05
2451 | BCC CFH03
2452 | JMP CFH01
2453 | CFH03: CLC
2454 | ADC UNIT_C,X ;add hidden unit width
2455 | CMP MAP_X
2456 | BCC CFH01
2457 | CFH05: ;now compare vertical position
2458 | LDA UNIT_LOC_Y,X
2459 | CMP MAP_Y
2460 | BEQ CFH10
2461 | BCC CFH06
2462 | JMP CFH01
2463 | CFH06: CLC
2464 | ADC UNIT_D,X ;add hidden unit HEIGHT
2465 | CMP MAP_Y
2466 | BCC CFH01
2467 | CFH10: STX UNIT_FIND ;unit found
2468 | RTS
2469 |
2470 | ;NOTES ABOUT UNIT TYPES
2471 | ;----------------------
2472 | ;000=no unit (does not exist)
2473 | ;001=player unit
2474 | ;002=hoverbot left-to-right
2475 | ;003=hoverbot up-down
2476 | ;004=hoverbot attack mode
2477 | ;005=hoverbot chase player
2478 | ;006=
2479 | ;007=transporter
2480 | ;008=
2481 | ;009=evilbot chase player
2482 | ;010=door
2483 | ;011=small explosion
2484 | ;012=pistol fire up
2485 | ;013=pistol fire down
2486 | ;014=pistol fire left
2487 | ;015=pistol fire right
2488 | ;016=trash compactor
2489 | ;017=
2490 | ;018=
2491 | ;019=
2492 | ;020=
2493 |
2494 | ;NOTES ABOUT UNIT NUMBERING SCHEME
2495 | ;---------------------------------
2496 | ;0 = player unit
2497 | ;1-27 = enemy robots (max 28 units)
2498 | ;28-31 = weapons fire
2499 | ;32-47 = doors and other units that don't have sprites (max 16 units)
2500 | ;48-63 = hidden objects to be found (max 16 units)
2501 |
2502 | ;NOTES ABOUT DOORS.
2503 | ;-------------------
2504 | ;A-0=horitzonal 1=vertical
2505 | ;B-0=opening-A 1=opening-B 2=OPEN / 3=closing-A 4=closing-B 5-CLOSED
2506 | ;C-0=unlocked / 1=locked spade 2=locked heart 3=locked star
2507 | ;D-0=automatic / 0=manual
2508 |
2509 | ;HIDDEN OBJECTS
2510 | ;--------------
2511 | ;UNIT_TYPE:128=key UNIT_A: 0=SPADE 1=HEART 2=STAR
2512 | ;UNIT_TYPE:129=time bomb
2513 | ;UNIT_TYPE:130=EMP
2514 | ;UNIT_TYPE:131=pistol
2515 | ;UNIT_TYPE:132=charged plasma gun
2516 | ;UNIT_TYPE:133=medkit
2517 | ;UNIT_TYPE:134=magnet
2518 |
2519 | ;NOTES ABOUT TRANSPORTER
2520 | ;----------------------
2521 | ;UNIT_A: 0=always active 1=only active when all robots are dead
2522 | ;UNIT_B: 0=completes level 1=send to coordinates
2523 | ;UNIT_C: X-coordinate
2524 | ;UNIT_D: Y-coordinate
2525 |
2526 | ;Sound Effects
2527 | ;----------------------
2528 | ;0 explosion
2529 | ;1 small explosion
2530 | ;2 medkit
2531 | ;3 emp
2532 | ;4 haywire
2533 | ;5 evilbot
2534 | ;6 move
2535 | ;7 electric shock
2536 | ;8 plasma gun
2537 | ;9 fire pistol
2538 | ;10 item found
2539 | ;11 error
2540 | ;12 change weapons
2541 | ;13 change items
2542 | ;14 door
2543 | ;15 menu beep
2544 | ;16 walk
2545 | ;17 sfx (short beep)
2546 | ;18 sfx
2547 |
--------------------------------------------------------------------------------
/VICROBOTS.ASM:
--------------------------------------------------------------------------------
1 | ;PETSCII Robots (VIC-20 version)
2 | ;by David Murray 2020
3 | ;dfwgreencars@gmail.com
4 |
5 | !to "vicrobots",cbm
6 |
7 | *=$1201 ;START ADDRESS IS $1201
8 | DESTRUCT_PATH =$A000 ;Destruct path array (256 bytes)
9 | TILE_ATTRIB =$A100 ;Tile attrib array (256 bytes)
10 | TILE_DATA_TL =$A200 ;Tile character top-left (256 bytes)
11 | TILE_DATA_TM =$A300 ;Tile character top-middle (256 bytes)
12 | TILE_DATA_TR =$A400 ;Tile character top-right (256 bytes)
13 | TILE_DATA_ML =$A500 ;Tile character middle-left (256 bytes)
14 | TILE_DATA_MM =$A600 ;Tile character middle-middle (256 bytes)
15 | TILE_DATA_MR =$A700 ;Tile character middle-right (256 bytes)
16 | TILE_DATA_BL =$A800 ;Tile character bottom-left (256 bytes)
17 | TILE_DATA_BM =$A900 ;Tile character bottom-middle (256 bytes)
18 | TILE_DATA_BR =$AA00 ;Tile character bottom-right (256 bytes)
19 | TILE_COLOR_TL =$AB00 ;Tile color top-left (256 bytes) (C64/VIC/TED VERSION ONLY)
20 | TILE_COLOR_TM =$AC00 ;Tile color top-middle (256 bytes) (C64/VIC/TED VERSION ONLY)
21 | TILE_COLOR_TR =$AD00 ;Tile color top-right (256 bytes) (C64/VIC/TED VERSION ONLY)
22 | TILE_COLOR_ML =$AE00 ;Tile color middle-left (256 bytes) (C64/VIC/TED VERSION ONLY)
23 | TILE_COLOR_MM =$AF00 ;Tile color middle-middle (256 bytes) (C64/VIC/TED VERSION ONLY)
24 | TILE_COLOR_MR =$B000 ;Tile color middle-right (256 bytes) (C64/VIC/TED VERSION ONLY)
25 | TILE_COLOR_BL =$B100 ;Tile color bottom-left (256 bytes) (C64/VIC/TED VERSION ONLY)
26 | TILE_COLOR_BM =$B200 ;Tile color bottom-middle (256 bytes) (C64/VIC/TED VERSION ONLY)
27 | TILE_COLOR_BR =$B300 ;Tile color bottom-right (256 bytes) (C64/VIC/TED VERSION ONLY)
28 | PEST_SOUND =$0400 ;Sound system base address
29 | PLAY_SOUND =$0415 ;play sound effect
30 |
31 | ;***These arrays can go anywhere in RAM***
32 | UNIT_TIMER_A =$0E00 ;Primary timer for units (64 bytes)
33 | UNIT_TIMER_B =$0E40 ;Secondary timer for units (64 bytes)
34 | UNIT_TILE =$0E80 ;Current tile assigned to unit (32 bytes)
35 | ;UNIT_ALT_MOVE =$0EA0 ;For moving around objects (32 bytes)
36 | ;UNIT_DEST_X =$0EC0 ;Destination X coordinate (32 bytes)
37 | ;UNIT_DEST_Y =$0EE0 ;Destination X coordinate (32 bytes)
38 | EXP_BUFFER =$0F00 ;Explosion Buffer (16 bytes)
39 | MAP_PRECALC =$0F10 ;Stores pre-calculated objects for map window (49 bytes)
40 | ;The following addresses are used to store the current
41 | ;state of the SNES buttons.
42 | SNES_B =$0F41
43 | SNES_Y =$0F42
44 | SNES_SELECT =$0F43
45 | SNES_START =$0F44
46 | SNES_UP =$0F45
47 | SNES_DOWN =$0F46
48 | SNES_LEFT =$0F47
49 | SNES_RIGHT =$0F48
50 | SNES_A =$0F49
51 | SNES_X =$0F4A
52 | SNES_BACK_L =$0F4B
53 | SNES_BACK_R =$0F4C
54 | ;The following addresses are used to store the last
55 | ;state of the SNES buttons so that we can determine
56 | ;if a button was released.
57 | LAST_B =$0F4D
58 | LAST_Y =$0F4E
59 | LAST_SELECT =$0F4F
60 | LAST_START =$0F50
61 | LAST_UP =$0F51
62 | LAST_DOWN =$0F52
63 | LAST_LEFT =$0F53
64 | LAST_RIGHT =$0F54
65 | LAST_A =$0F55
66 | LAST_X =$0F56
67 | LAST_BACK_L =$0F57
68 | LAST_BACK_R =$0F58
69 |
70 | ;The following addresses are used to store new
71 | ;presses of the SNES buttons. Once they are set
72 | ;as a 1, it requires the game to reset them to
73 | ;0 when it is ready to be read again.
74 | NEW_B =$0F59
75 | NEW_Y =$0F5A
76 | NEW_SELECT =$0F5B
77 | NEW_START =$0F5C
78 | NEW_UP =$0F5D
79 | NEW_DOWN =$0F5E
80 | NEW_LEFT =$0F5F
81 | NEW_RIGHT =$0F60
82 | NEW_A =$0F61
83 | NEW_X =$0F62
84 | NEW_BACK_L =$0F63
85 | NEW_BACK_R =$0F64
86 |
87 | ;The following are the locations where the current
88 | ;key controls are stored. These must be set before
89 | ;the game can start.
90 | KEY_MOVE_UP =$0F65
91 | KEY_MOVE_DOWN =$0F66
92 | KEY_MOVE_LEFT =$0F67
93 | KEY_MOVE_RIGHT =$0F68
94 | KEY_FIRE_UP =$0F69
95 | KEY_FIRE_DOWN =$0F6A
96 | KEY_FIRE_LEFT =$0F6B
97 | KEY_FIRE_RIGHT =$0F6C
98 | KEY_CYCLE_WEAPONS =$0F6D
99 | KEY_CYCLE_ITEMS =$0F6E
100 | KEY_USE =$0F6F
101 | KEY_SEARCH =$0F70
102 | KEY_MOVE =$0F71
103 |
104 | ;***MAP FILES CONSIST OF EVERYTHING FROM THIS POINT ON***
105 | UNIT_TYPE =$5D00 ;Unit type 0=none (64 bytes)
106 | UNIT_LOC_X =$5D40 ;Unit X location (64 bytes)
107 | UNIT_LOC_Y =$5D80 ;Unit X location (64 bytes)
108 | UNIT_A =$5DC0
109 | UNIT_B =$5E00
110 | UNIT_C =$5E40
111 | UNIT_D =$5E80
112 | UNIT_HEALTH =$5EC0 ;Unit health (0 to 11) (64 bytes)
113 | MAP =$6000 ;Location of MAP (8K)
114 | ;***END OF MAP FILE***
115 |
116 | ;*** Zero Page locations used ***
117 | TILE =$23 ;The tile number to be plotted
118 | TEMP_X =$24 ;Temporarily used for loops
119 | TEMP_Y =$25 ;Temporarily used for loops
120 | MAP_X =$26 ;Current X location on map
121 | MAP_Y =$27 ;Current Y location on map
122 | MAP_WINDOW_X =$28 ;Top left location of what is displayed in map window
123 | MAP_WINDOW_Y =$29 ;Top left location of what is displayed in map window
124 | DECNUM =$2A ;a decimal number to be displayed onscreen as 3 digits.
125 | ATTRIB =$2B ;Tile attribute value
126 | UNIT =$2C ;Current unit being processed
127 | TEMP_A =$2D ;used within some routines
128 | TEMP_B =$2E ;used within some routines
129 | TEMP_C =$2F ;used within some routines
130 | TEMP_D =$30 ;used within some routines
131 | CURSOR_X =$31 ;For on-screen cursor
132 | CURSOR_Y =$32 ;For on-screen cursor
133 | CURSOR_ON =$33 ;Is cursor active or not? 1=yes 0=no
134 | REDRAW_WINDOW =$34 ;1=yes 0=no
135 | MOVE_RESULT =$35 ;1=Move request success, 0=fail.
136 | UNIT_FIND =$36 ;255=no unit present.
137 | MOVE_TYPE =$37 ;%00000001=WALK %00000010=HOVER
138 | SCREEN_SHAKE =$38 ;0=NO 1=YES
139 | PRECALC_COUNT =$39 ;part of screen draw routine
140 |
141 | BASIC !BYTE $0C,$12,$01,$00,$9E,$20,$34,$36,$32,$32,$00,$00,$00
142 | ;Adds BASIC line: 1 SYS 4622
143 | JMP $1272
144 |
145 | *=$1272 ;Must leave padding for video RAM at $1000-$1271
146 | LDA #%00101000 ;Pins 3 & 5 are output
147 | STA $9112 ;Data-direction-register for userport
148 | LDA #$0E ;black with blue border
149 | STA $900F ;set fore/background
150 | LDA #$80
151 | STA $0291 ;Disable character set switching
152 | LDA #$15
153 | STA $D018 ;enable upper-case character set
154 | JSR DISPLAY_LOAD_MESSAGE1
155 | JSR TILE_LOAD_ROUTINE
156 | JSR SOUND_LOAD_ROUTINE
157 | LDA #0
158 | STA SCREEN_SHAKE
159 | JSR SETUP_INTERRUPT
160 | JSR SET_CONTROLS ;copy initial key controls
161 | JSR PEST_SOUND ;INIT SOUNND ROUTINE
162 | JSR SET_SCREEN_SIZE
163 | JMP INTRO_SCREEN
164 | INIT_GAME:
165 | LDA #0
166 | STA SCREEN_SHAKE
167 | JSR DISPLAY_GAME_SCREEN
168 | JSR DISPLAY_LOAD_MESSAGE2
169 | JSR RESET_KEYS_AMMO
170 | JSR MAP_LOAD_ROUTINE
171 | JSR SET_DIFF_LEVEL
172 | JSR ANIMATE_PLAYER
173 | JSR CACULATE_AND_REDRAW
174 | JSR DRAW_MAP_WINDOW
175 | JSR DISPLAY_PLAYER_HEALTH
176 | JSR DISPLAY_KEYS
177 | JSR DISPLAY_WEAPON
178 | LDA #1
179 | STA UNIT_TYPE
180 | LDA #97
181 | STA UNIT_TILE
182 | JSR SET_INITIAL_TIMERS
183 | JSR PRINT_INTRO_MESSAGE
184 | LDA #30
185 | STA KEYTIMER
186 | JMP MAIN_GAME_LOOP
187 |
188 | TILENAME !PET"tileset.vic"
189 | MAPNAME !PET"level-a"
190 | SNDNAME !PET"pdrv-vic"
191 | MUSICNAME !PET"music0.vic"
192 | LOADMSG1 !PET 5,"loading tiles...",13
193 | KEYS !BYTE 00 ;bit 0=spade bit2=heart bit3=star
194 | AMMO_PISTOL !BYTE 00 ;how much ammo for the pistol
195 | AMMO_PLASMA !BYTE 00 ;how many shots of the plasmagun
196 | INV_BOMBS !BYTE 00 ;How many bombs do we have
197 | INV_EMP !BYTE 00 ;How many EMPs do we have
198 | INV_MEDKIT !BYTE 00 ;How many medkits do we have?
199 | INV_MAGNET !BYTE 00 ;How many magnets do we have?
200 | SELECTED_WEAPON !BYTE 00 ;0=none 1=pistol 2=plasmagun
201 | SELECTED_ITEM !BYTE 00 ;0=none 1=bomb 2=emp 3=medkit
202 | ANIMATE !BYTE 01 ;0=DISABLED 1=ENABLED
203 | BIG_EXP_ACT !BYTE 00 ;0=No explosion active 1=big explosion active
204 | MAGNET_ACT !BYTE 00 ;0=no magnet active 1=magnet active
205 | PLASMA_ACT !BYTE 00 ;0=No Plasma active 1=plasma active
206 | RANDOM !BYTE 00 ;used for random number generation
207 | CONTROL !BYTE 00 ;0=keyboard 1=custom keys 2=snes
208 | MUSIC_STATE !BYTE 00 ;0=music off 1=music on
209 | PLAYER_DIR !BYTE 01 ;0=UP 1=DOWN 2=LEFT 3=RIGHT
210 | PLAYER_ANI !BYTE 56 ;0=ANIM1 56=ANIM2
211 | INTRO_MESSAGE !SCR"vic-robots! by",255
212 | !SCR"david murray 2021",0
213 | MSG_CANTMOVE !SCR"can't move that!",0
214 | MSG_BLOCKED !SCR"blocked!",0
215 | MSG_SEARCHING !SCR"searching",0
216 | MSG_NOTFOUND !SCR"nothing found here",0
217 | MSG_FOUNDKEY !SCR"found a key card!",0
218 | MSG_FOUNDGUN !SCR"found a pistol!",0
219 | MSG_FOUNDEMP !SCR"found emp device!",0
220 | MSG_FOUNDBOMB !SCR"found a timebomb!",0
221 | MSG_FOUNDPLAS !SCR"found a plasmagun!",0
222 | MSG_FOUNDMED !SCR"found a medkit!",0
223 | MSG_FOUNDMAG !SCR"found a magnet!",0
224 |
225 | *=$13FE ;CHARSET GOES HERE
226 | !BINARY "gfxfont.prg"
227 |
228 | MSG_MUCHBET !SCR"ahhh, much better!",0
229 | MSG_EMPUSED !SCR"emp activated!",255
230 | !SCR"robots rebooting.",0
231 | MSG_TERMINATED !SCR"you're terminated!",0
232 | MSG_TRANS1 !SCR"transporter won't",255
233 | !SCR"activate until all",255
234 | !SCR"robots destroyed!",0
235 | MSG_ELEVATOR !SCR"[ elevator panel ]",255
236 | !SCR"[ select level ]",0
237 | MSG_LEVELS !SCR"[ ]",0
238 | MSG_PAUSED !SCR"game paused.",255
239 | !SCR"exit game (y/n)",0
240 | SELECTED_MAP !BYTE 00
241 |
242 | ;Reconfigures VIC-20 screen to 25x25 characters
243 | ;uses sound routine to check if PAL or NTSC.
244 | SET_SCREEN_SIZE:
245 | LDA #25 ;Number of columns to display on VIC
246 | STA $9002 ;Send to VIC. also sets COLOR RAM to $9400
247 | LDA #50 ;Number of rows (times two) for VIC
248 | STA $9003 ;Send to VIC
249 | JSR PEST_SOUND+27
250 | CMP #0
251 | BNE PAL
252 | ;NTSC MODE
253 | LDA #1
254 | STA $9000 ;horizontal offset
255 | LDA #22
256 | STA $9001 ;vertical offset
257 | RTS
258 | PAL: LDA #9
259 | STA SHAKE3+1
260 | LDA #10
261 | STA SHAKE4+1
262 | LDA #35
263 | STA $9001 ;vertical offset
264 | RTS
265 |
266 | DISPLAY_LOAD_MESSAGE1:
267 | LDY #0
268 | DLM1:
269 | LDA LOADMSG1,Y
270 | JSR $FFD2
271 | INY
272 | CPY #18
273 | BNE DLM1
274 | RTS
275 |
276 | ;Displays loading message for map.
277 | DISPLAY_LOAD_MESSAGE2:
278 | LDY #0
279 | DLM2: LDA LOAD_MSG2,Y
280 | STA $10FA,Y
281 | INY
282 | CPY #12
283 | BNE DLM2
284 | LDA SELECTED_MAP
285 | STA DECNUM
286 | INC DECNUM
287 | LDA #$06
288 | STA $FB
289 | LDA #$11
290 | STA $FC
291 | JSR DECWRITE
292 | RTS
293 | LOAD_MSG2: !SCR"loading map:"
294 |
295 | SETUP_INTERRUPT:
296 | SEI ; Disable interrupt routine
297 | LDA #RUNIRQ
300 | STA $0315
301 | CLI ; Reenable routine.
302 | RTS
303 |
304 | ;This is the routine that runs every 60 seconds from the IRQ.
305 | ;BGTIMER1 is always set to 1 every cycle, after which the main
306 | ;program will reset it to 0 when it is done with it's work for
307 | ;that cycle. BGTIMER2 is a count-down to zero and then stays
308 | ;there.
309 | RUNIRQ:
310 | JSR ANIMATE_WATER
311 | LDA #1
312 | STA BGTIMER1
313 | LDA BGTIMER2
314 | CMP #0
315 | BEQ IRQ1
316 | DEC BGTIMER2
317 | IRQ1: LDA KEYTIMER
318 | CMP #0
319 | BEQ IRQ2
320 | DEC KEYTIMER
321 | IRQ2: ;BORDER FLASHER
322 | LDX BORDER
323 | CPX #0
324 | BEQ IRQ3
325 | LDA BORDER,X
326 | STA $900F
327 | DEC BORDER
328 | ;BACKGROUND FLASHER
329 | IRQ3: LDX BGFLASH
330 | CPX #0
331 | BEQ IRQ10
332 | LDA BGFLASH,X
333 | STA $900F
334 | DEC BGFLASH
335 | IRQ10: ;SCREEN_SHAKER
336 | LDA SCREEN_SHAKE
337 | CMP #$00
338 | BEQ SHAKE3
339 | SHAKE2: LDA $9000 ;X-SCROLL REGISTER
340 | AND #%00000001
341 | CMP #%00000001
342 | BEQ SHAKE4
343 | SHAKE3: LDA #%00000001
344 | STA $9000
345 | JMP IRQ20
346 | SHAKE4: LDA #%00000000
347 | STA $9000
348 | ;CHECK TO SEE IF KEYBOARD WAS DISABLED
349 | ;This routine causes the kernal to skip keyboard
350 | ;input for one cycle to help "debounce" the
351 | ;keyboard.
352 | IRQ20: LDA $0289 ;1=normal 0=disabled
353 | CMP #0
354 | BNE IRQ30
355 | LDA KEYSOFF
356 | CMP #00
357 | BEQ IRQ21
358 | LDA #0
359 | STA KEYSOFF
360 | LDA #1
361 | STA $0289 ;turn keyboard back on
362 | JMP IRQ30:
363 | IRQ21: INC KEYSOFF
364 | IRQ30: JSR PEST_SOUND+$06 ;UPDATE Sound
365 | JMP $EABF ; Back to usual IRQ routine
366 | BGTIMER1 !BYTE 00
367 | BGTIMER2 !BYTE 00
368 | KEYTIMER !BYTE 00
369 | KEYSOFF !BYTE 00
370 | BORDER !BYTE 00,14,10,10,10,15,15,15,10,10,10
371 | BGFLASH !BYTE 00,14,104,232,232,30,30,30,232,232,104
372 |
373 | SNES_CONTROLER_READ:
374 | ;First copy last time's results to the LAST variables.
375 | LDY #0
376 | SNCL: LDA SNES_B,Y
377 | STA LAST_B,Y
378 | INY
379 | CPY #12
380 | BNE SNCL
381 | ;now latch data
382 | LDA #%00100000 ;latch on pin 5
383 | STA $9110
384 | LDA #%00000000
385 | STA $9110
386 | LDX #0
387 | ;Now read in bits
388 | SRLOOP: LDA $9110
389 | AND #%01000000 ;READ pin 6
390 | CMP #%01000000
391 | BEQ SRL1
392 | LDA #1
393 | JMP SRL5
394 | SRL1: LDA #0
395 | SRL5: STA SNES_B,X
396 | ;pulse the clock line
397 | LDA #%00001000 ;CLOCK on pin 3
398 | STA $9110
399 | LDA #%00000000
400 | STA $9110
401 | INX
402 | CPX #12
403 | BNE SRLOOP
404 | ;now process any new presses
405 | LDY #0
406 | SRL09: LDA NEW_B,Y
407 | CMP #1
408 | BEQ SRL10
409 | LDA SNES_B,Y
410 | CMP #1
411 | BNE SRL10
412 | LDA LAST_B,Y
413 | CMP #0
414 | BNE SRL10
415 | LDA #1
416 | STA NEW_B,Y
417 | SRL10: INY
418 | CPY #12
419 | BNE SRL09
420 | RTS
421 |
422 | ;This routine spaces out the timers so that not everything
423 | ;is running out once.
424 | SET_INITIAL_TIMERS:
425 | LDX #01
426 | SIT1 TXA
427 | STA UNIT_TIMER_A,X
428 | LDA #0
429 | STA UNIT_TIMER_B,X
430 | INX
431 | CPX #48
432 | BNE SIT1
433 | RTS
434 |
435 | MAIN_GAME_LOOP:
436 | JSR BACKGROUND_TASKS
437 | LDA UNIT_TYPE
438 | CMP #1 ;Is player unit alive
439 | BEQ MG00
440 | JMP GAME_OVER
441 | MG00: LDA CONTROL
442 | CMP #2
443 | BNE KY01
444 | JMP SC01
445 | KY01: ;Keyboard controls here.
446 | JSR KEY_REPEAT
447 | JSR $FFE4
448 | CMP #$00
449 | BEQ MAIN_GAME_LOOP
450 | MG01: CMP #$1D ;CURSOR RIGHT
451 | BNE MG02
452 | MG01A: LDA #3
453 | STA PLAYER_DIR
454 | LDA #0
455 | STA UNIT
456 | LDA #%00000001
457 | STA MOVE_TYPE
458 | JSR REQUEST_WALK_RIGHT
459 | JMP AFTER_MOVE
460 | MG02: CMP #$9D ;CURSOR LEFT
461 | BNE MG03
462 | MG02A: LDA #2
463 | STA PLAYER_DIR
464 | LDA #0
465 | STA UNIT
466 | LDA #%00000001
467 | STA MOVE_TYPE
468 | JSR REQUEST_WALK_LEFT
469 | JMP AFTER_MOVE
470 | MG03: CMP #$11 ;CURSOR DOWN
471 | BNE MG04
472 | MG03A: LDA #1
473 | STA PLAYER_DIR
474 | LDA #0
475 | STA UNIT
476 | LDA #%00000001
477 | STA MOVE_TYPE
478 | JSR REQUEST_WALK_DOWN
479 | JMP AFTER_MOVE
480 | MG04: CMP #$91 ;CURSOR UP
481 | BNE MG05
482 | MG04A: LDA #0
483 | STA PLAYER_DIR
484 | LDA #0
485 | STA UNIT
486 | LDA #%00000001
487 | STA MOVE_TYPE
488 | JSR REQUEST_WALK_UP
489 | JMP AFTER_MOVE
490 | MG05: CMP #133 ;F1-Key
491 | BNE MG06
492 | JSR CYCLE_WEAPON
493 | JSR CLEAR_KEY_BUFFER
494 | JMP MAIN_GAME_LOOP
495 | MG06: CMP #134 ;F3-Key
496 | BNE MG07
497 | JSR CYCLE_ITEM
498 | JSR CLEAR_KEY_BUFFER
499 | JMP MAIN_GAME_LOOP
500 | MG07: CMP KEY_MOVE
501 | BNE MG08
502 | JSR MOVE_OBJECT
503 | JSR CLEAR_KEY_BUFFER
504 | JMP MAIN_GAME_LOOP
505 | MG08: CMP KEY_SEARCH
506 | BNE MG09
507 | JSR SEARCH_OBJECT
508 | JSR CLEAR_KEY_BUFFER
509 | JMP MAIN_GAME_LOOP
510 | MG09: CMP KEY_USE
511 | BNE MG10
512 | JSR USE_ITEM
513 | JSR CLEAR_KEY_BUFFER
514 | JMP MAIN_GAME_LOOP
515 | MG10: CMP KEY_MOVE_LEFT
516 | BNE MG11
517 | JMP MG02A
518 | MG11: CMP KEY_MOVE_DOWN
519 | BNE MG12
520 | JMP MG03A
521 | MG12: CMP KEY_MOVE_RIGHT
522 | BNE MG13
523 | JMP MG01A
524 | MG13: CMP KEY_MOVE_UP
525 | BNE MG14
526 | JMP MG04A
527 | MG14: CMP KEY_FIRE_UP
528 | BNE MG15
529 | JSR FIRE_UP
530 | LDA #20
531 | STA KEYTIMER
532 | JMP MAIN_GAME_LOOP
533 | MG15: CMP KEY_FIRE_LEFT
534 | BNE MG16
535 | JSR FIRE_LEFT
536 | LDA #20
537 | STA KEYTIMER
538 | JMP MAIN_GAME_LOOP
539 | MG16: CMP KEY_FIRE_DOWN
540 | BNE MG17
541 | JSR FIRE_DOWN
542 | LDA #20
543 | STA KEYTIMER
544 | JMP MAIN_GAME_LOOP
545 | MG17: CMP KEY_FIRE_RIGHT
546 | BNE MG18
547 | JSR FIRE_RIGHT
548 | LDA #20
549 | STA KEYTIMER
550 | JMP MAIN_GAME_LOOP
551 | MG18: CMP #03 ;RUN/STOP
552 | BNE MG19
553 | JMP PAUSE_GAME
554 | MG19: CMP #223 ;C= + * (cheat mode)
555 | BNE MG20
556 | JSR CHEATER
557 | JMP MAIN_GAME_LOOP
558 | MG20: CMP #205 ;SHIFT-M
559 | BNE MG21
560 | JSR TOGGLE_MUSIC
561 | JSR CLEAR_KEY_BUFFER
562 | MG21: JMP MAIN_GAME_LOOP
563 |
564 | SC01: ;SNES CONTROLLER starts here
565 | JSR SNES_CONTROLER_READ
566 | ;check keytimer for repeat time.
567 | LDA KEYTIMER
568 | CMP #0
569 | BEQ SC02
570 | JMP SC40
571 | SC02: LDA #0
572 | STA NEW_UP
573 | STA NEW_DOWN
574 | STA NEW_LEFT
575 | STA NEW_RIGHT
576 | STA SNES_UP
577 | STA SNES_DOWN
578 | STA SNES_LEFT
579 | STA SNES_RIGHT
580 | JSR SNES_CONTROLER_READ
581 | SC05: ;first we start with the 4 directional buttons.
582 | LDA NEW_LEFT
583 | CMP #01
584 | BNE SC10
585 | LDA #2
586 | STA PLAYER_DIR
587 | LDA #0
588 | STA UNIT
589 | LDA #%00000001
590 | STA MOVE_TYPE
591 | JSR REQUEST_WALK_LEFT
592 | JMP AFTER_MOVE_SNES
593 | SC10: LDA NEW_RIGHT
594 | CMP #01
595 | BNE SC20
596 | LDA #3
597 | STA PLAYER_DIR
598 | LDA #0
599 | STA UNIT
600 | LDA #%00000001
601 | STA MOVE_TYPE
602 | JSR REQUEST_WALK_RIGHT
603 | JMP AFTER_MOVE_SNES
604 | SC20: LDA NEW_UP
605 | CMP #01
606 | BNE SC30
607 | LDA #0
608 | STA PLAYER_DIR
609 | STA UNIT
610 | LDA #%00000001
611 | STA MOVE_TYPE
612 | JSR REQUEST_WALK_UP
613 | JMP AFTER_MOVE_SNES
614 | SC30: LDA NEW_DOWN
615 | CMP #01
616 | BNE SC35
617 | LDA #1
618 | STA PLAYER_DIR
619 | LDA #0
620 | STA UNIT
621 | LDA #%00000001
622 | STA MOVE_TYPE
623 | JSR REQUEST_WALK_DOWN
624 | JMP AFTER_MOVE_SNES
625 | SC35: LDA #0
626 | STA KEY_FAST
627 | SC40: ;Now check for non-repeating buttons
628 | LDA NEW_Y
629 | CMP #1
630 | BNE SC45
631 | JSR FIRE_LEFT
632 | LDA #0
633 | STA NEW_Y
634 | SC45: LDA NEW_A
635 | CMP #1
636 | BNE SC50
637 | JSR FIRE_RIGHT
638 | LDA #0
639 | STA NEW_A
640 | SC50: LDA NEW_X
641 | CMP #1
642 | BNE SC55
643 | JSR FIRE_UP
644 | LDA #0
645 | STA NEW_X
646 | SC55: LDA NEW_B
647 | CMP #1
648 | BNE SC60
649 | JSR FIRE_DOWN
650 | LDA #0
651 | STA NEW_B
652 | SC60: LDA NEW_BACK_L
653 | CMP #1
654 | BNE SC65
655 | LDA SNES_SELECT
656 | CMP #1
657 | BNE SC62
658 | JSR CYCLE_ITEM
659 | JMP SC63
660 | SC62: JSR SEARCH_OBJECT
661 | SC63: LDA #0
662 | STA NEW_BACK_L
663 | LDA #15
664 | STA KEYTIMER
665 | SC65: LDA NEW_BACK_R
666 | CMP #1
667 | BNE SC70
668 | LDA SNES_SELECT
669 | CMP #1
670 | BNE SC67
671 | JSR CYCLE_WEAPON
672 | JMP SC68
673 | SC67: JSR MOVE_OBJECT
674 | SC68: LDA #0
675 | STA NEW_BACK_R
676 | LDA #15
677 | STA KEYTIMER
678 | SC70: LDA NEW_START
679 | CMP #1
680 | BNE SC75
681 | JSR USE_ITEM
682 | LDA #0
683 | STA NEW_START
684 | LDA #15
685 | STA KEYTIMER
686 | SC75: ;STILL USE KEYBOARD TO CHECK FOR RUN/STOP
687 | JSR $FFE4
688 | CMP #03 ;RUN/STOP
689 | BNE SC82
690 | JMP PAUSE_GAME
691 | SC82: CMP #205 ;SHIFT-M
692 | BNE SC83
693 | JSR TOGGLE_MUSIC
694 | JSR CLEAR_KEY_BUFFER
695 | SC83: JMP MAIN_GAME_LOOP
696 |
697 | ;This routine handles things that are in common to
698 | ;all 4 directions of movement.
699 | AFTER_MOVE_SNES:
700 | LDA MOVE_RESULT
701 | CMP #1
702 | BNE AMS01
703 | JSR ANIMATE_PLAYER
704 | JSR CACULATE_AND_REDRAW
705 | AMS01: LDA KEY_FAST
706 | CMP #0
707 | BNE AMS02
708 | LDA #15
709 | STA KEYTIMER
710 | LDA #1
711 | STA KEY_FAST
712 | JMP AMS03
713 | AMS02: LDA #6
714 | STA KEYTIMER
715 | LDA #0
716 | STA NEW_UP
717 | STA NEW_DOWN
718 | STA NEW_LEFT
719 | STA NEW_RIGHT
720 | AMS03: JMP MAIN_GAME_LOOP
721 |
722 | CHEATER:
723 | LDA #7
724 | STA KEYS
725 | LDA #100
726 | STA AMMO_PISTOL
727 | STA AMMO_PLASMA
728 | STA INV_BOMBS
729 | STA INV_EMP
730 | STA INV_MEDKIT
731 | STA INV_MAGNET
732 | LDA #1
733 | STA SELECTED_WEAPON
734 | STA SELECTED_ITEM
735 | JSR DISPLAY_KEYS
736 | JSR DISPLAY_WEAPON
737 | JSR DISPLAY_ITEM
738 | RTS
739 |
740 | PAUSE_GAME:
741 | JSR SCROLL_INFO
742 | LDA #MSG_PAUSED
745 | STA $FC
746 | JSR PRINT_INFO
747 | JSR CLEAR_KEY_BUFFER
748 | PG1: JSR $FFE4
749 | CMP #$00
750 | BEQ PG1
751 | CMP #03 ;RUN/STOP
752 | BEQ PG5
753 | CMP #78 ;N-KEY
754 | BEQ PG5
755 | CMP #89 ;Y-KEY
756 | BEQ PG6
757 | JMP PG1
758 | PG5: JSR SCROLL_INFO
759 | JSR SCROLL_INFO
760 | JSR SCROLL_INFO
761 | JSR CLEAR_KEY_BUFFER
762 | JMP MAIN_GAME_LOOP
763 | PG6: JMP GOM4
764 |
765 | CLEAR_KEY_BUFFER:
766 | LDA #0
767 | STA $0289 ;disable keyboard input
768 | LDA #0
769 | STA $00C6 ;CLEAR KEYBOARD BUFFER
770 | LDA #20
771 | STA KEYTIMER
772 | RTS
773 |
774 | USE_ITEM:
775 | ;First figure out which item to use.
776 | LDA SELECTED_ITEM
777 | CMP #1 ;BOMB
778 | BNE UI02
779 | JMP USE_BOMB
780 | UI02: CMP #2 ;EMP
781 | BNE UI03
782 | JMP USE_EMP
783 | UI03: CMP #3 ;MEDKIT
784 | BNE UI04
785 | JMP USE_MEDKIT
786 | UI04: CMP #4 ;MAGNET
787 | BNE UI05
788 | JMP USE_MAGNET
789 | UI05: RTS
790 |
791 | USE_BOMB:
792 | JSR USER_SELECT_OBJECT
793 | ;NOW TEST TO SEE IF THAT SPOT IS OPEN
794 | JSR BOMB_MAGNET_COMMON1
795 | BEQ BM30
796 | JMP BM3A ;If not, then exit routine.
797 | BM30: ;Now scan for any units at that location:
798 | JSR CHECK_FOR_UNIT
799 | LDA UNIT_FIND
800 | CMP #255 ;255 means no unit found.
801 | BEQ BM31
802 | BM3A: JMP BOMB_MAGNET_COMMON2
803 | BM31: LDX #28 ;Start of weapons units
804 | BOMB1: LDA UNIT_TYPE,X
805 | CMP #0
806 | BEQ BOMB2
807 | INX
808 | CPX #32
809 | BNE BOMB1
810 | RTS ;no slots available right now, abort.
811 | BOMB2: LDA #6 ;bomb AI
812 | STA UNIT_TYPE,X
813 | LDA #130 ;bomb tile
814 | STA UNIT_TILE,X
815 | LDA MAP_X
816 | STA UNIT_LOC_X,X
817 | LDA MAP_Y
818 | STA UNIT_LOC_Y,X
819 | LDA #100 ;How long until exposion?
820 | STA UNIT_TIMER_A,X
821 | LDA #0
822 | STA UNIT_A,X
823 | DEC INV_BOMBS
824 | JSR DISPLAY_ITEM
825 | LDA #01
826 | STA REDRAW_WINDOW
827 | LDA #06 ;move sound
828 | JSR PLAY_SOUND ;SOUND PLAY
829 | RTS
830 |
831 | USE_MAGNET:
832 | LDA MAGNET_ACT ;only one magnet active at a time.
833 | CMP #0
834 | BEQ MG32
835 | RTS
836 | MG32: JSR USER_SELECT_OBJECT
837 | ;NOW TEST TO SEE IF THAT SPOT IS OPEN
838 | JSR BOMB_MAGNET_COMMON1
839 | BEQ MG31
840 | JMP BOMB_MAGNET_COMMON2
841 | MG31: LDX #28 ;Start of weapons units
842 | MAG1: LDA UNIT_TYPE,X
843 | CMP #0
844 | BEQ MAG2
845 | INX
846 | CPX #32
847 | BNE MAG1
848 | RTS ;no slots available right now, abort.
849 | MAG2: LDA #20 ;MAGNET AI
850 | STA UNIT_TYPE,X
851 | LDA #134 ;MAGNET tile
852 | STA UNIT_TILE,X
853 | LDA MAP_X
854 | STA UNIT_LOC_X,X
855 | LDA MAP_Y
856 | STA UNIT_LOC_Y,X
857 | LDA #1 ;How long until ACTIVATION
858 | STA UNIT_TIMER_A,X
859 | LDA #255 ;how long does it live -A
860 | STA UNIT_TIMER_B,X
861 | LDA #5 ;how long does it live -B
862 | STA UNIT_A,X
863 | LDA #1
864 | STA MAGNET_ACT ;only one magnet allowed at a time.
865 | DEC INV_MAGNET
866 | JSR DISPLAY_ITEM
867 | LDA #01
868 | STA REDRAW_WINDOW
869 | LDA #06 ;move sound
870 | JSR PLAY_SOUND ;SOUND PLAY
871 | RTS
872 |
873 | BOMB_MAGNET_COMMON1:
874 | LDA #0
875 | STA CURSOR_ON
876 | JSR DRAW_MAP_WINDOW ;ERASE THE CURSOR
877 | LDA CURSOR_X
878 | CLC
879 | ADC MAP_WINDOW_X
880 | STA MAP_X
881 | STA MOVTEMP_UX
882 | LDA CURSOR_Y
883 | CLC
884 | ADC MAP_WINDOW_Y
885 | STA MAP_Y
886 | STA MOVTEMP_UY
887 | JSR GET_TILE_FROM_MAP
888 | LDA TILE
889 | TAY
890 | LDA TILE_ATTRIB,Y
891 | AND #%00000001 ;is that spot available
892 | CMP #%00000001 ;for something to move onto it?
893 | RTS
894 |
895 | BOMB_MAGNET_COMMON2:
896 | LDA #MSG_BLOCKED
899 | STA $FC
900 | JSR PRINT_INFO
901 | LDA #11 ;ERROR SOUND
902 | JSR PLAY_SOUND ;SOUND PLAY
903 | RTS
904 |
905 | USE_EMP:
906 | LDA #10
907 | STA BGFLASH
908 | LDA #3 ;EMP sound
909 | JSR PLAY_SOUND ;SOUND PLAY
910 | DEC INV_EMP
911 | JSR DISPLAY_ITEM
912 | LDX #1 ;start with unit#1 (skip player)
913 | EMP1: ;CHECK THAT UNIT EXISTS
914 | LDA UNIT_TYPE,X
915 | CMP #0
916 | BEQ EMP5
917 | ;CHECK HORIZONTAL POSITION
918 | LDA UNIT_LOC_X,X
919 | CMP MAP_WINDOW_X
920 | BCC EMP5
921 | LDA MAP_WINDOW_X
922 | CLC
923 | ADC #6 ;reduced screen width on VIC-20
924 | CMP UNIT_LOC_X,X
925 | BCC EMP5
926 | ;NOW CHECK VERTICAL
927 | LDA UNIT_LOC_Y,X
928 | CMP MAP_WINDOW_Y
929 | BCC EMP5
930 | LDA MAP_WINDOW_Y
931 | CLC
932 | ADC #6
933 | CMP UNIT_LOC_Y,X
934 | BCC EMP5
935 | LDA #255
936 | STA UNIT_TIMER_A,X
937 | ;test to see if unit is above water
938 | LDA UNIT_LOC_X,X
939 | STA MAP_X
940 | LDA UNIT_LOC_Y,X
941 | STA MAP_Y
942 | JSR GET_TILE_FROM_MAP
943 | LDA TILE
944 | CMP #204 ;WATER
945 | BNE EMP5
946 | LDA #5
947 | STA UNIT_TYPE,X
948 | STA UNIT_TIMER_A,X
949 | LDA #60
950 | STA UNIT_A,X
951 | LDA #140 ;Electrocuting tile
952 | STA UNIT_TILE,X
953 | EMP5: INX
954 | CPX #28
955 | BNE EMP1
956 | LDA #MSG_EMPUSED
959 | STA $FC
960 | JSR PRINT_INFO
961 | RTS
962 |
963 | USE_MEDKIT:
964 | LDA UNIT_HEALTH
965 | CMP #12 ;Do we even need the medkit?
966 | BNE UMK1
967 | RTS
968 | UMK1: ;Now figure out how many HP we need to be healthy.
969 | LDA #12
970 | SEC
971 | SBC UNIT_HEALTH
972 | STA TEMP_A ;how many we need.
973 | LDA INV_MEDKIT ;how many do we have?
974 | SEC
975 | SBC TEMP_A
976 | BCC UMK2
977 | ;we had more than we need, so go to full health.
978 | LDA #12
979 | STA UNIT_HEALTH
980 | LDA INV_MEDKIT
981 | SEC
982 | SBC TEMP_A
983 | STA INV_MEDKIT
984 | JMP UMK3
985 | UMK2: ;we had less than we need, so we'll use what is available.
986 | LDA INV_MEDKIT
987 | CLC
988 | ADC UNIT_HEALTH
989 | STA UNIT_HEALTH
990 | LDA #0
991 | STA INV_MEDKIT
992 | UMK3: JSR DISPLAY_PLAYER_HEALTH
993 | JSR DISPLAY_ITEM
994 | LDA #2 ;MEDKIT SOUND
995 | JSR PLAY_SOUND ;SOUND PLAY
996 | LDA #MSG_MUCHBET
999 | STA $FC
1000 | JSR PRINT_INFO
1001 | RTS
1002 |
1003 | FIRE_UP:
1004 | LDA SELECTED_WEAPON
1005 | CMP #0
1006 | BNE FRU0
1007 | RTS
1008 | FRU0: CMP #1
1009 | BNE FRU1
1010 | JMP FIRE_UP_PISTOL
1011 | FRU1: JMP FIRE_UP_PLASMA
1012 |
1013 | FIRE_UP_PISTOL:
1014 | LDA AMMO_PISTOL
1015 | CMP #0
1016 | BNE FU00
1017 | RTS
1018 | FU00: LDX #28
1019 | FU01: LDA UNIT_TYPE,X
1020 | CMP #0
1021 | BEQ FU02
1022 | INX
1023 | CPX #32 ;max unit for weaponsfire
1024 | BNE FU01
1025 | RTS
1026 | FU02: LDA #12 ;Fire pistol up AI routine
1027 | STA UNIT_TYPE,X
1028 | LDA #244 ;tile for vertical weapons fire
1029 | STA UNIT_TILE,X
1030 | LDA #3 ;travel distance.
1031 | STA UNIT_A,X
1032 | LDA #0 ;weapon-type = pistol
1033 | STA UNIT_B,X
1034 | JMP AFTER_FIRE
1035 |
1036 | FIRE_UP_PLASMA:
1037 | LDA BIG_EXP_ACT
1038 | CMP #1
1039 | BEQ FUP3
1040 | LDA PLASMA_ACT
1041 | CMP #1
1042 | BEQ FUP3
1043 | LDA AMMO_PLASMA
1044 | CMP #0
1045 | BNE FUP0
1046 | FUP3: RTS
1047 | FUP0: LDX #28
1048 | FUP1: LDA UNIT_TYPE,X
1049 | CMP #0
1050 | BEQ FUP2
1051 | INX
1052 | CPX #32 ;max unit for weaponsfire
1053 | BNE FUP1
1054 | RTS
1055 | FUP2: LDA #12 ;Fire pistol up AI routine
1056 | STA UNIT_TYPE,X
1057 | LDA #240 ;tile for vertical plasma bolt
1058 | STA UNIT_TILE,X
1059 | LDA #3 ;travel distance.
1060 | STA UNIT_A,X
1061 | LDA #1 ;weapon-type = plasma
1062 | STA UNIT_B,X
1063 | STA PLASMA_ACT
1064 | JMP AFTER_FIRE
1065 |
1066 | FIRE_DOWN:
1067 | LDA SELECTED_WEAPON
1068 | CMP #0
1069 | BNE FRD0
1070 | RTS
1071 | FRD0: CMP #1
1072 | BNE FRD1
1073 | JMP FIRE_DOWN_PISTOL
1074 | FRD1: JMP FIRE_DOWN_PLASMA
1075 |
1076 | FIRE_DOWN_PISTOL:
1077 | LDA AMMO_PISTOL
1078 | CMP #0
1079 | BNE FD00
1080 | RTS
1081 | FD00: LDX #28
1082 | FD01: LDA UNIT_TYPE,X
1083 | CMP #0
1084 | BEQ FD02
1085 | INX
1086 | CPX #32 ;max unit for weaponsfire
1087 | BNE FD01
1088 | RTS
1089 | FD02: LDA #13 ;Fire pistol DOWN AI routine
1090 | STA UNIT_TYPE,X
1091 | LDA #244 ;tile for vertical weapons fire
1092 | STA UNIT_TILE,X
1093 | LDA #3 ;travel distance.
1094 | STA UNIT_A,X
1095 | LDA #0 ;weapon-type = pistol
1096 | STA UNIT_B,X
1097 | JMP AFTER_FIRE
1098 |
1099 | FIRE_DOWN_PLASMA:
1100 | LDA BIG_EXP_ACT
1101 | CMP #1
1102 | BEQ FDP3
1103 | LDA PLASMA_ACT
1104 | CMP #1
1105 | BEQ FDP3
1106 | LDA AMMO_PLASMA
1107 | CMP #0
1108 | BNE FDP0
1109 | FDP3: RTS
1110 | FDP0: LDX #28
1111 | FDP1: LDA UNIT_TYPE,X
1112 | CMP #0
1113 | BEQ FDP2
1114 | INX
1115 | CPX #32 ;max unit for weaponsfire
1116 | BNE FDP1
1117 | RTS
1118 | FDP2: LDA #13 ;Fire pistol DOWN AI routine
1119 | STA UNIT_TYPE,X
1120 | LDA #240 ;tile for vertical weapons fire
1121 | STA UNIT_TILE,X
1122 | LDA #3 ;travel distance.
1123 | STA UNIT_A,X
1124 | LDA #1 ;weapon-type = plasma
1125 | STA UNIT_B,X
1126 | STA PLASMA_ACT
1127 | JMP AFTER_FIRE
1128 |
1129 | FIRE_LEFT:
1130 | LDA SELECTED_WEAPON
1131 | CMP #0
1132 | BNE FRL0
1133 | RTS
1134 | FRL0: CMP #1
1135 | BNE FRL1
1136 | JMP FIRE_LEFT_PISTOL
1137 | FRL1: JMP FIRE_LEFT_PLASMA
1138 |
1139 | FIRE_LEFT_PISTOL:
1140 | LDA AMMO_PISTOL
1141 | CMP #0
1142 | BNE FL00
1143 | RTS
1144 | FL00: LDX #28
1145 | FL01: LDA UNIT_TYPE,X
1146 | CMP #0
1147 | BEQ FL02
1148 | INX
1149 | CPX #32 ;max unit for weaponsfire
1150 | BNE FL01
1151 | RTS
1152 | FL02: LDA #14 ;Fire pistol LEFT AI routine
1153 | STA UNIT_TYPE,X
1154 | LDA #245 ;tile for horizontal weapons fire
1155 | STA UNIT_TILE,X
1156 | LDA #3 ;travel distance.
1157 | STA UNIT_A,X
1158 | LDA #0 ;weapon-type = pistol
1159 | STA UNIT_B,X
1160 | JMP AFTER_FIRE
1161 |
1162 | FIRE_LEFT_PLASMA:
1163 | LDA BIG_EXP_ACT
1164 | CMP #1
1165 | BEQ FLP3
1166 | LDA PLASMA_ACT
1167 | CMP #1
1168 | BEQ FLP3
1169 | LDA AMMO_PLASMA
1170 | CMP #0
1171 | BNE FLP0
1172 | FLP3: RTS
1173 | FLP0: LDX #28
1174 | FLP1: LDA UNIT_TYPE,X
1175 | CMP #0
1176 | BEQ FLP2
1177 | INX
1178 | CPX #32 ;max unit for weaponsfire
1179 | BNE FLP1
1180 | RTS
1181 | FLP2: LDA #14 ;Fire pistol LEFT AI routine
1182 | STA UNIT_TYPE,X
1183 | LDA #241 ;tile for horizontal weapons fire
1184 | STA UNIT_TILE,X
1185 | LDA #3 ;travel distance.
1186 | STA UNIT_A,X
1187 | LDA #1 ;weapon-type = plasma
1188 | STA UNIT_B,X
1189 | STA PLASMA_ACT
1190 | JMP AFTER_FIRE
1191 |
1192 | FIRE_RIGHT:
1193 | LDA SELECTED_WEAPON
1194 | CMP #0
1195 | BNE FRR0
1196 | RTS
1197 | FRR0: CMP #1
1198 | BNE FRR1
1199 | JMP FIRE_RIGHT_PISTOL
1200 | FRR1: JMP FIRE_RIGHT_PLASMA
1201 |
1202 | FIRE_RIGHT_PISTOL:
1203 | LDA AMMO_PISTOL
1204 | CMP #0
1205 | BNE FR00
1206 | RTS
1207 | FR00: LDX #28
1208 | FR01: LDA UNIT_TYPE,X
1209 | CMP #0
1210 | BEQ FR02
1211 | INX
1212 | CPX #32 ;max unit for weaponsfire
1213 | BNE FR01
1214 | RTS
1215 | FR02: LDA #15 ;Fire pistol RIGHT AI routine
1216 | STA UNIT_TYPE,X
1217 | LDA #245 ;tile for horizontal weapons fire
1218 | STA UNIT_TILE,X
1219 | LDA #3 ;travel distance.
1220 | STA UNIT_A,X
1221 | LDA #0 ;weapon-type = pistol
1222 | STA UNIT_B,X
1223 | JMP AFTER_FIRE
1224 |
1225 | FIRE_RIGHT_PLASMA:
1226 | LDA BIG_EXP_ACT
1227 | CMP #1
1228 | BEQ FRP3
1229 | LDA PLASMA_ACT
1230 | CMP #1
1231 | BEQ FRP3
1232 | LDA AMMO_PLASMA
1233 | CMP #0
1234 | BNE FRP0
1235 | FRP3: RTS
1236 | FRP0: LDX #28
1237 | FRP1: LDA UNIT_TYPE,X
1238 | CMP #0
1239 | BEQ FRP2
1240 | INX
1241 | CPX #32 ;max unit for weaponsfire
1242 | BNE FRP1
1243 | RTS
1244 | FRP2: LDA #15 ;Fire pistol RIGHT AI routine
1245 | STA UNIT_TYPE,X
1246 | LDA #241 ;tile for horizontal weapons fire
1247 | STA UNIT_TILE,X
1248 | LDA #3 ;travel distance.
1249 | STA UNIT_A,X
1250 | LDA #1 ;weapon-type = plasma
1251 | STA UNIT_B,X
1252 | STA PLASMA_ACT
1253 | JMP AFTER_FIRE
1254 |
1255 | AFTER_FIRE:
1256 | LDA #0
1257 | STA UNIT_TIMER_A,X
1258 | LDA UNIT_LOC_X
1259 | STA UNIT_LOC_X,X
1260 | LDA UNIT_LOC_Y
1261 | STA UNIT_LOC_Y,X
1262 | STX UNIT
1263 | LDA #20
1264 | STA KEYTIMER
1265 | LDA SELECTED_WEAPON
1266 | CMP #2
1267 | BEQ AF01
1268 | LDA #09 ;PISTOL-SOUND
1269 | JSR PLAY_SOUND ;SOUND PLAY
1270 | DEC AMMO_PISTOL
1271 | JSR DISPLAY_WEAPON
1272 | RTS
1273 | AF01: LDA #08 ;PLASMA-GUN-SOUND
1274 | JSR PLAY_SOUND ;SOUND PLAY
1275 | DEC AMMO_PLASMA
1276 | JSR DISPLAY_WEAPON
1277 | RTS
1278 |
1279 | KEY_REPEAT:
1280 | LDA #16
1281 | STA $028C ;reset kernal repeat timer (to prevent repeats)
1282 | LDA KEYTIMER
1283 | CMP #0
1284 | BNE KEYR2
1285 | LDA $C5
1286 | CMP #64 ;no key pressed
1287 | BEQ KEYR1
1288 | LDA #64 ;clear LSTX register
1289 | STA $C5 ;clear LSTX register
1290 | LDA #7
1291 | STA KEYTIMER
1292 | RTS
1293 | KEYR1: ;No key pressed, reset all to defaults
1294 | LDA #0
1295 | STA KEY_FAST
1296 | LDA #7
1297 | STA KEYTIMER
1298 | KEYR2: RTS
1299 |
1300 | ;This routine handles things that are in common to
1301 | ;all 4 directions of movement.
1302 | AFTER_MOVE:
1303 | LDA MOVE_RESULT
1304 | CMP #1
1305 | BNE AM01
1306 | JSR ANIMATE_PLAYER
1307 | JSR CACULATE_AND_REDRAW
1308 | AM01: ;now reset key-repeat rate
1309 | LDA KEY_FAST
1310 | CMP #0
1311 | BNE KEYR3
1312 | ;FIRST REPEAT
1313 | LDA #15
1314 | STA KEYTIMER
1315 | INC KEY_FAST
1316 | KEYR4: JMP MAIN_GAME_LOOP
1317 | KEYR3: ;SUBSEQUENT REPEATS
1318 | LDA #7
1319 | STA KEYTIMER
1320 | JMP MAIN_GAME_LOOP
1321 | KEY_FAST !BYTE 0 ;0=DEFAULT STATE
1322 |
1323 | ;This routine is invoked when the user presses S to search
1324 | ;an object such as a crate, chair, or plant.
1325 | SEARCH_OBJECT:
1326 | JSR USER_SELECT_OBJECT
1327 | LDA #1
1328 | STA REDRAW_WINDOW
1329 | CHS1: ;first check of object is searchable
1330 | JSR CALC_COORDINATES
1331 | JSR GET_TILE_FROM_MAP
1332 | LDX TILE
1333 | LDA TILE_ATTRIB,X
1334 | AND #%01000000 ;can search attribute
1335 | CMP #%01000000
1336 | BEQ CHS2
1337 | LDA #0
1338 | STA CURSOR_ON
1339 | JMP CHS3
1340 | CHS2: ;is the tile a crate?
1341 | LDX TILE
1342 | CPX #041 ;BIG CRATE
1343 | BEQ CHS2B
1344 | CPX #045 ;small CRATE
1345 | BEQ CHS2B
1346 | CPX #199 ;"Pi" CRATE
1347 | BEQ CHS2B
1348 | JMP CHS2C
1349 | CHS2B: LDA DESTRUCT_PATH,X
1350 | STA TILE
1351 | JSR PLOT_TILE_TO_MAP
1352 | CHS2C: ;Now check if there is an object there.
1353 | LDA #0
1354 | STA SEARCHBAR
1355 | LDA #MSG_SEARCHING
1358 | STA $FC
1359 | JSR PRINT_INFO
1360 | SOBJ1: LDA #18 ;delay time between search periods
1361 | STA BGTIMER2
1362 | SOBJ2: JSR BACKGROUND_TASKS
1363 | LDA BGTIMER2
1364 | CMP #0
1365 | BNE SOBJ2
1366 | LDX SEARCHBAR
1367 | LDA #46 ;PERIOD
1368 | STA $1261,X
1369 | INC SEARCHBAR
1370 | LDA SEARCHBAR
1371 | CMP #8
1372 | BNE SOBJ1
1373 | LDA #0
1374 | STA CURSOR_ON
1375 | JSR DRAW_MAP_WINDOW ;ERASE THE CURSOR
1376 | JSR CALC_COORDINATES
1377 | JSR CHECK_FOR_HIDDEN_UNIT
1378 | LDA UNIT_FIND
1379 | CMP #255
1380 | BNE SOBJ5
1381 | CHS3: LDA #MSG_NOTFOUND
1384 | STA $FC
1385 | JSR PRINT_INFO
1386 | RTS
1387 | SOBJ5: LDX UNIT_FIND
1388 | LDA UNIT_TYPE,X
1389 | STA TEMP_A ;store object type
1390 | LDA UNIT_A,X
1391 | STA TEMP_B ;store secondary info
1392 | LDA #0 ;DELETE ITEM ONCE FOUND
1393 | STA UNIT_TYPE,X
1394 |
1395 | ;***NOW PROCESS THE ITEM FOUND***
1396 | LDA #10 ;ITEM-FOUND-SOUND
1397 | JSR PLAY_SOUND ;SOUND PLAY
1398 | LDA TEMP_A
1399 | CMP #128 ;key
1400 | BEQ SOBJ10
1401 | JMP SOBJ15
1402 | SOBJ10: LDA TEMP_B ;WHICH SORT OF KEY?
1403 | CMP #00
1404 | BNE SOBJK1
1405 | LDA KEYS
1406 | ORA #%00000001 ;Add spade key
1407 | STA KEYS
1408 | JMP SOBJ12
1409 | SOBJK1: CMP #01
1410 | BNE SOBJK2
1411 | LDA KEYS
1412 | ORA #%00000010 ;Add heart key
1413 | STA KEYS
1414 | JMP SOBJ12
1415 | SOBJK2: LDA KEYS
1416 | ORA #%00000100 ;Add star key
1417 | STA KEYS
1418 | SOBJ12: LDA #MSG_FOUNDKEY
1421 | STA $FC
1422 | JSR PRINT_INFO
1423 | JSR DISPLAY_KEYS
1424 | RTS
1425 | SOBJ15: CMP #129 ;TIME BOMB
1426 | BNE SOBJ17
1427 | LDA TEMP_B
1428 | CLC
1429 | ADC INV_BOMBS
1430 | STA INV_BOMBS
1431 | LDA #MSG_FOUNDBOMB
1434 | STA $FC
1435 | JSR PRINT_INFO
1436 | JSR DISPLAY_ITEM
1437 | RTS
1438 | SOBJ17: CMP #130 ;EMP
1439 | BNE SOBJ20
1440 | LDA TEMP_B
1441 | CLC
1442 | ADC INV_EMP
1443 | STA INV_EMP
1444 | LDA #MSG_FOUNDEMP
1447 | STA $FC
1448 | JSR PRINT_INFO
1449 | JSR DISPLAY_ITEM
1450 | RTS
1451 | SOBJ20: CMP #131 ;PISTOL
1452 | BNE SOBJ21
1453 | LDA TEMP_B
1454 | CLC
1455 | ADC AMMO_PISTOL
1456 | STA AMMO_PISTOL
1457 | BCC SOBJ2A ;If we rolled over past 255
1458 | LDA #255 ;set it to 255.
1459 | STA AMMO_PISTOL
1460 | SOBJ2A: LDA #MSG_FOUNDGUN
1463 | STA $FC
1464 | JSR PRINT_INFO
1465 | JSR DISPLAY_WEAPON
1466 | SOBJ21: CMP #132 ;PLASMA GUN
1467 | BNE SOBJ22
1468 | LDA TEMP_B
1469 | CLC
1470 | ADC AMMO_PLASMA
1471 | STA AMMO_PLASMA
1472 | LDA #MSG_FOUNDPLAS
1475 | STA $FC
1476 | JSR PRINT_INFO
1477 | JSR DISPLAY_WEAPON
1478 | SOBJ22: CMP #133 ;MEDKIT
1479 | BNE SOBJ23
1480 | LDA TEMP_B
1481 | CLC
1482 | ADC INV_MEDKIT
1483 | STA INV_MEDKIT
1484 | LDA #MSG_FOUNDMED
1487 | STA $FC
1488 | JSR PRINT_INFO
1489 | JSR DISPLAY_ITEM
1490 | SOBJ23: CMP #134 ;MAGNET
1491 | BNE SOBJ99
1492 | LDA TEMP_B
1493 | CLC
1494 | ADC INV_MAGNET
1495 | STA INV_MAGNET
1496 | LDA #MSG_FOUNDMAG
1499 | STA $FC
1500 | JSR PRINT_INFO
1501 | JSR DISPLAY_ITEM
1502 | SOBJ99: ;ADD CODE HERE FOR OTHER OBJECT TYPES
1503 | RTS
1504 | SEARCHBAR !BYTE 00 ;to count how many periods to display.
1505 |
1506 | ;combines cursor location with window location
1507 | ;to determine coordinates for MAP_X and MAP_Y
1508 | CALC_COORDINATES:
1509 | LDA CURSOR_X
1510 | CLC
1511 | ADC MAP_WINDOW_X
1512 | STA MAP_X
1513 | LDA CURSOR_Y
1514 | CLC
1515 | ADC MAP_WINDOW_Y
1516 | STA MAP_Y
1517 | RTS
1518 |
1519 | ;This routine is called by routines such as the move, search,
1520 | ;or use commands. It displays a cursor and allows the user
1521 | ;to pick a direction of an object.
1522 | USER_SELECT_OBJECT:
1523 | LDA #16 ;beep sound
1524 | JSR PLAY_SOUND ;SOUND PLAY
1525 | LDA #3
1526 | STA CURSOR_X
1527 | LDA #3
1528 | STA CURSOR_Y
1529 | LDA #1
1530 | STA CURSOR_ON
1531 | JSR REVERSE_TILE
1532 | ;First ask user which object to move
1533 | MV01: JSR BACKGROUND_TASKS
1534 | LDA UNIT_TYPE
1535 | CMP #0 ;Did player die wile moving something?
1536 | BNE MVCONT
1537 | LDA #0
1538 | STA CURSOR_ON
1539 | RTS
1540 | MVCONT: LDA CONTROL
1541 | CMP #2
1542 | BNE MV01A
1543 | JMP MVSNES
1544 | MV01A: JSR $FFE4
1545 | CMP #$00
1546 | BEQ MV02
1547 | MV02: CMP #$1D ;CURSOR RIGHT
1548 | BNE MV03
1549 | INC CURSOR_X
1550 | RTS
1551 | MV03: CMP #$9D ;CURSOR LEFT
1552 | BNE MV04
1553 | DEC CURSOR_X
1554 | RTS
1555 | MV04: CMP #$11 ;CURSOR DOWN
1556 | BNE MV05
1557 | INC CURSOR_Y
1558 | RTS
1559 | MV05: CMP #$91 ;CURSOR UP
1560 | BNE MV06
1561 | DEC CURSOR_Y
1562 | RTS
1563 | MV06: CMP KEY_MOVE_LEFT
1564 | BNE MV07
1565 | DEC CURSOR_X
1566 | RTS
1567 | MV07: CMP KEY_MOVE_DOWN
1568 | BNE MV08
1569 | INC CURSOR_Y
1570 | RTS
1571 | MV08: CMP KEY_MOVE_RIGHT
1572 | BNE MV09
1573 | INC CURSOR_X
1574 | RTS
1575 | MV09: CMP KEY_MOVE_UP
1576 | BNE MV0A
1577 | DEC CURSOR_Y
1578 | RTS
1579 | MV0A: JMP MV01
1580 |
1581 | MVSNES: ;SNES controls for this routine
1582 | JSR SNES_CONTROLER_READ
1583 | LDA NEW_RIGHT
1584 | CMP #1
1585 | BNE MVS03
1586 | INC CURSOR_X
1587 | LDA #0
1588 | STA NEW_RIGHT
1589 | RTS
1590 | MVS03: LDA NEW_LEFT
1591 | CMP #1
1592 | BNE MVS04
1593 | DEC CURSOR_X
1594 | LDA #0
1595 | STA NEW_LEFT
1596 | RTS
1597 | MVS04: LDA NEW_DOWN
1598 | CMP #1
1599 | BNE MVS05
1600 | INC CURSOR_Y
1601 | LDA #0
1602 | STA NEW_DOWN
1603 | RTS
1604 | MVS05: LDA NEW_UP
1605 | CMP #1
1606 | BNE MVS06
1607 | DEC CURSOR_Y
1608 | LDA #0
1609 | STA NEW_UP
1610 | RTS
1611 | MVS06: JMP MV01
1612 |
1613 | MOVE_OBJECT:
1614 | JSR USER_SELECT_OBJECT
1615 | LDA UNIT
1616 | ;now test that object to see if it
1617 | ;is allowed to be moved.
1618 | MV10: LDA #0
1619 | STA CURSOR_ON
1620 | JSR DRAW_MAP_WINDOW ;ERASE THE CURSOR
1621 | JSR CALC_COORDINATES
1622 | JSR CHECK_FOR_HIDDEN_UNIT
1623 | LDA UNIT_FIND
1624 | STA MOVTEMP_U
1625 | JSR GET_TILE_FROM_MAP
1626 | LDA TILE
1627 | TAY
1628 | LDA TILE_ATTRIB,Y
1629 | AND #%00000100 ;can it be moved?
1630 | CMP #%00000100
1631 | BEQ MV11
1632 | LDA #MSG_CANTMOVE
1635 | STA $FC
1636 | JSR PRINT_INFO
1637 | LDA #11 ;ERROR SOUND
1638 | JSR PLAY_SOUND ;SOUND PLAY
1639 | RTS
1640 | MV11: LDA TILE
1641 | STA MOVTEMP_O ;Store which tile it is we are moving
1642 | LDA MAP_X
1643 | STA MOVTEMP_X ;Store original location of object
1644 | LDA MAP_Y
1645 | STA MOVTEMP_Y
1646 | LDA #1
1647 | STA CURSOR_ON
1648 | JSR REVERSE_TILE
1649 | ;NOW ASK THE USER WHICH DIRECTION TO MOVE IT TO
1650 | MV15: JSR BACKGROUND_TASKS
1651 | LDA UNIT_TYPE
1652 | CMP #0 ;Did player die wile moving something?
1653 | BNE MVCONT2
1654 | LDA #0
1655 | STA CURSOR_ON
1656 | RTS
1657 | MVCONT2: ;which controller are we using?
1658 | LDA CONTROL
1659 | CMP #2
1660 | BNE MV15B
1661 | JMP SMV30
1662 | MV15B: ;KEYBOARD CONTROL
1663 | JSR $FFE4
1664 | CMP #$00
1665 | BEQ MV15
1666 | MV16: CMP #$1D ;CURSOR RIGHT
1667 | BNE MV17
1668 | INC CURSOR_X
1669 | JMP MV25
1670 | MV17: CMP #$9D ;CURSOR LEFT
1671 | BNE MV18
1672 | DEC CURSOR_X
1673 | JMP MV25
1674 | MV18: CMP #$11 ;CURSOR DOWN
1675 | BNE MV19
1676 | INC CURSOR_Y
1677 | JMP MV25
1678 | MV19: CMP #$91 ;CURSOR UP
1679 | BNE MV20
1680 | DEC CURSOR_Y
1681 | JMP MV25
1682 | MV20: CMP KEY_MOVE_LEFT
1683 | BNE MV2A
1684 | DEC CURSOR_X
1685 | JMP MV25
1686 | MV2A: CMP KEY_MOVE_DOWN
1687 | BNE MV2B
1688 | INC CURSOR_Y
1689 | JMP MV25
1690 | MV2B: CMP KEY_MOVE_RIGHT
1691 | BNE MV2C
1692 | INC CURSOR_X
1693 | JMP MV25
1694 | MV2C: CMP KEY_MOVE_UP
1695 | BNE MV2D
1696 | DEC CURSOR_Y
1697 | JMP MV25
1698 | MV2D: JMP MV15
1699 | SMV30: ;SNES controls
1700 | JSR SNES_CONTROLER_READ
1701 | LDA NEW_RIGHT
1702 | CMP #1
1703 | BNE SMV31
1704 | INC CURSOR_X
1705 | LDA #0
1706 | STA NEW_RIGHT
1707 | JMP MV25
1708 | SMV31: LDA NEW_LEFT
1709 | CMP #1
1710 | BNE SMV32
1711 | DEC CURSOR_X
1712 | LDA #0
1713 | STA NEW_LEFT
1714 | JMP MV25
1715 | SMV32: LDA NEW_DOWN
1716 | CMP #1
1717 | BNE SMV33
1718 | INC CURSOR_Y
1719 | LDA #0
1720 | STA NEW_DOWN
1721 | JMP MV25
1722 | SMV33: LDA NEW_UP
1723 | CMP #1
1724 | BNE SMV34
1725 | DEC CURSOR_Y
1726 | LDA #0
1727 | STA NEW_UP
1728 | JMP MV25
1729 | SMV34: JMP MV15
1730 |
1731 | ;NOW TEST TO SEE IF THAT SPOT IS OPEN
1732 | MV25: LDA #0
1733 | STA CURSOR_ON
1734 | JSR DRAW_MAP_WINDOW ;ERASE THE CURSOR
1735 | LDA CURSOR_X
1736 | CLC
1737 | ADC MAP_WINDOW_X
1738 | STA MAP_X
1739 | STA MOVTEMP_UX
1740 | LDA CURSOR_Y
1741 | CLC
1742 | ADC MAP_WINDOW_Y
1743 | STA MAP_Y
1744 | STA MOVTEMP_UY
1745 | JSR GET_TILE_FROM_MAP
1746 | LDA TILE
1747 | TAY
1748 | LDA TILE_ATTRIB,Y
1749 | AND #%00100000 ;is that spot available
1750 | CMP #%00100000 ;for something to move onto it?
1751 | BEQ MV30
1752 | JMP MV3A ;If not, then exit routine.
1753 | MV30: ;Now scan for any units at that location:
1754 | JSR CHECK_FOR_UNIT
1755 | LDA UNIT_FIND
1756 | CMP #255 ;255 means no unit found.
1757 | BEQ MV31
1758 | MV3A: LDA #MSG_BLOCKED
1761 | STA $FC
1762 | JSR PRINT_INFO
1763 | LDA #11 ;ERROR SOUND
1764 | JSR PLAY_SOUND ;SOUND PLAY
1765 | RTS
1766 | MV31: LDA #06 ;move sound
1767 | JSR PLAY_SOUND ;SOUND PLAY
1768 | LDY #0
1769 | LDA ($FD),Y ;Grab current object
1770 | STA MOVTEMP_D
1771 | LDA MOVTEMP_O
1772 | STA ($FD),Y ;replace with obect we are moving
1773 | LDA MOVTEMP_X ;RETRIEVE original location of object
1774 | STA MAP_X
1775 | LDA MOVTEMP_Y
1776 | STA MAP_Y
1777 | JSR GET_TILE_FROM_MAP
1778 | LDA MOVTEMP_D
1779 | CMP #148 ;trash compactor tile
1780 | BNE MV31A
1781 | LDA #09 ;Floor tile
1782 | MV31A: STA ($FD),Y ;Replace former location
1783 | LDA #1
1784 | STA REDRAW_WINDOW ;See the result
1785 | LDA MOVTEMP_U
1786 | CMP #255
1787 | BNE MV32
1788 | RTS
1789 | MV32: LDX MOVTEMP_U
1790 | LDA MOVTEMP_UX
1791 | STA UNIT_LOC_X,X
1792 | LDA MOVTEMP_UY
1793 | STA UNIT_LOC_Y,X
1794 | RTS
1795 | MOVTEMP_O: !BYTE 00 ;origin tile
1796 | MOVTEMP_D: !BYTE 00 ;destination tile
1797 | MOVTEMP_X: !BYTE 00 ;x-coordinate
1798 | MOVTEMP_Y: !BYTE 00 ;y-coordinate
1799 | MOVTEMP_U: !BYTE 00 ;unit number (255=none)
1800 | MOVTEMP_UX !BYTE 00
1801 | MOVTEMP_UY !BYTE 00
1802 |
1803 | CACULATE_AND_REDRAW:
1804 | LDA UNIT_LOC_X ;no index needed since it's player unit
1805 | SEC
1806 | SBC #3
1807 | STA MAP_WINDOW_X
1808 | LDA UNIT_LOC_Y ;no index needed since it's player unit
1809 | SEC
1810 | SBC #3
1811 | STA MAP_WINDOW_Y
1812 | LDA #1
1813 | STA REDRAW_WINDOW
1814 | RTS
1815 |
1816 | ;This routine checks all units from 0 to 31 and figures out if it should be dislpayed
1817 | ;on screen, and then grabs that unit's tile and stores it in the MAP_PRECALC array
1818 | ;so that when the window is drawn, it does not have to search for units during the
1819 | ;draw, speeding up the display routine.
1820 | MAP_PRE_CALCULATE:
1821 | ;CLEAR OLD BUFFER
1822 | LDA #0
1823 | LDY #0
1824 | PREC0: STA MAP_PRECALC,Y
1825 | INY
1826 | CPY #49
1827 | BNE PREC0
1828 | LDX #0
1829 | JMP PREC2 ;skip the check for unit zero, always draw it.
1830 | PREC1: ;CHECK THAT UNIT EXISTS
1831 | LDA UNIT_TYPE,X
1832 | CMP #0
1833 | BEQ PREC5
1834 | ;CHECK HORIZONTAL POSITION
1835 | LDA UNIT_LOC_X,X
1836 | CMP MAP_WINDOW_X
1837 | BCC PREC5
1838 | LDA MAP_WINDOW_X
1839 | CLC
1840 | ADC #6
1841 | CMP UNIT_LOC_X,X
1842 | BCC PREC5
1843 | ;NOW CHECK VERTICAL
1844 | LDA UNIT_LOC_Y,X
1845 | CMP MAP_WINDOW_Y
1846 | BCC PREC5
1847 | LDA MAP_WINDOW_Y
1848 | CLC
1849 | ADC #6
1850 | CMP UNIT_LOC_Y,X
1851 | BCC PREC5
1852 | ;Unit found in map window, now add that unit's
1853 | ;tile to the precalc map.
1854 | PREC2: LDA UNIT_LOC_Y,X
1855 | SEC
1856 | SBC MAP_WINDOW_Y
1857 | TAY
1858 | LDA UNIT_LOC_X,X
1859 | SEC
1860 | SBC MAP_WINDOW_X
1861 | CLC
1862 | ADC PRECALC_ROWS,Y
1863 | TAY
1864 | LDA UNIT_TILE,X
1865 | CMP #130 ;is it a bomb
1866 | BEQ PREC6
1867 | CMP #134 ;is it a magnet?
1868 | BEQ PREC6
1869 | PREC4: STA MAP_PRECALC,Y
1870 | PREC5: ;continue search
1871 | INX
1872 | CPX #32
1873 | BNE PREC1
1874 | RTS
1875 | PREC6: ;What to do in case of bomb or magnet that should
1876 | ;go underneath the unit or robot.
1877 | LDA MAP_PRECALC,Y
1878 | CMP #0
1879 | BNE PREC5
1880 | LDA UNIT_TILE,X
1881 | JMP PREC4
1882 |
1883 | PRECALC_ROWS: !BYTE 0,7,14,21,28,35,42
1884 |
1885 | ;This routine is where the MAP is displayed on the screen
1886 | ;This is a temporary routine, taken from the map editor.
1887 | DRAW_MAP_WINDOW:
1888 | JSR MAP_PRE_CALCULATE
1889 | LDA #0
1890 | STA REDRAW_WINDOW
1891 | STA TEMP_X
1892 | STA TEMP_Y
1893 | STA PRECALC_COUNT
1894 | DM01: ;FIRST CALCULATE WHERE THE BYTE IS STORED IN THE MAP
1895 | LDY #0
1896 | LDA TEMP_Y
1897 | CLC
1898 | ADC MAP_WINDOW_Y
1899 | ROR
1900 | PHP
1901 | CLC
1902 | ADC #>MAP
1903 | STA $FE ;HIGH BYTE OF MAP SOURCE
1904 | LDA #$0
1905 | PLP
1906 | ROR
1907 | CLC
1908 | ADC TEMP_X
1909 | ADC MAP_WINDOW_X
1910 | STA $FD ;LOW BYTE OF MAP SOURCE
1911 | LDA ($FD),Y
1912 | STA TILE
1913 | ;NOW FIGURE OUT WHERE TO PLACE IT ON SCREEN.
1914 | LDX TEMP_Y
1915 | LDA MAP_CHART_L,X
1916 | STA $FB ;LOW BYTE OF SCREEN AREA
1917 | LDA MAP_CHART_H,X
1918 | STA $FC ;HIGH BYTE OF SCREEN AREA
1919 | LDA TEMP_X
1920 | ASL ;MULTIPLY BY 2
1921 | CLC
1922 | ADC TEMP_X ;ADD ANOTHER TO MAKE X3
1923 | ADC $FB
1924 | STA $FB
1925 | LDA $FC
1926 | ADC #00 ;CARRY FLAG
1927 | STA $FC
1928 | JSR PLOT_TILE
1929 | ;now check for sprites in this location
1930 | LDY PRECALC_COUNT
1931 | LDA MAP_PRECALC,Y
1932 | CMP #00
1933 | BEQ DM02
1934 | STA TILE
1935 | LDX TEMP_Y
1936 | LDA MAP_CHART_L,X
1937 | STA $FB ;LOW BYTE OF SCREEN AREA
1938 | LDA MAP_CHART_H,X
1939 | STA $FC ;HIGH BYTE OF SCREEN AREA
1940 | LDA TEMP_X
1941 | ASL ;MULTIPLY BY 2
1942 | CLC
1943 | ADC TEMP_X ;ADD ANOTHER TO MAKE X3
1944 | ADC $FB
1945 | STA $FB
1946 | LDA $FC
1947 | ADC #00 ;CARRY FLAG
1948 | STA $FC
1949 | JSR PLOT_TRANSPARENT_TILE
1950 | DM02: INC TEMP_X
1951 | INC PRECALC_COUNT
1952 | LDA TEMP_X
1953 | CMP #7
1954 | BNE DM01
1955 | ;CHECK FOR CURSOR
1956 | DM03: LDA CURSOR_ON
1957 | CMP #1 ;Is cursor even on?
1958 | BNE DM04
1959 | LDA TEMP_Y
1960 | CMP CURSOR_Y ;is cursor on the same row that were drawing?
1961 | BNE DM04
1962 | JSR REVERSE_TILE
1963 | DM04: LDA #0
1964 | STA TEMP_X
1965 | INC TEMP_Y
1966 | LDA TEMP_Y
1967 | CMP #7
1968 | BEQ DM10
1969 | JMP DM01
1970 | DM10: RTS
1971 |
1972 | ;This routine plots a 3x3 tile from the tile database anywhere
1973 | ;on screen. But first you must define the tile number in the
1974 | ;TILE variable, as well as the starting screen address must
1975 | ;be defined in $FB.
1976 | PLOT_TILE:
1977 | LDA $FB ;Grab the starting address, and adjust it for
1978 | STA $FD ;the color RAM before we get started.
1979 | LDA $FC
1980 | STA $FE
1981 | LDX TILE
1982 | ;DRAW THE TOP 3 CHARACTERS
1983 | LDA TILE_DATA_TL,X
1984 | LDY #0
1985 | STA ($FB),Y
1986 | LDA TILE_DATA_TM,X
1987 | INY
1988 | STA ($FB),Y
1989 | LDA TILE_DATA_TR,X
1990 | INY
1991 | STA ($FB),Y
1992 | ;MOVE DOWN TO NEXT LINE
1993 | LDY #25
1994 | ;DRAW THE MIDDLE 3 CHARACTERS
1995 | LDA TILE_DATA_ML,X
1996 | STA ($FB),Y
1997 | LDA TILE_DATA_MM,X
1998 | INY
1999 | STA ($FB),Y
2000 | LDA TILE_DATA_MR,X
2001 | INY
2002 | STA ($FB),Y
2003 | ;MOVE DOWN TO NEXT LINE
2004 | LDY #50
2005 | ;DRAW THE BOTTOM 3 CHARACTERS
2006 | LDA TILE_DATA_BL,X
2007 | STA ($FB),Y
2008 | LDA TILE_DATA_BM,X
2009 | INY
2010 | STA ($FB),Y
2011 | LDA TILE_DATA_BR,X
2012 | INY
2013 | STA ($FB),Y
2014 | ;NOW DO THE COLOR
2015 | LDA $FE
2016 | CLC
2017 | ADC #$84 ;adjust to color RAM area by adding $D400
2018 | STA $FE
2019 | ;DRAW THE TOP 3 COLORS
2020 | LDA TILE_COLOR_TL,X
2021 | LDY #0
2022 | STA ($FD),Y
2023 | LDA TILE_COLOR_TM,X
2024 | INY
2025 | STA ($FD),Y
2026 | LDA TILE_COLOR_TR,X
2027 | INY
2028 | STA ($FD),Y
2029 | ;MOVE DOWN TO NEXT LINE
2030 | LDY #25
2031 | ;DRAW THE MIDDLE 3 COLORS
2032 | LDA TILE_COLOR_ML,X
2033 | STA ($FD),Y
2034 | LDA TILE_COLOR_MM,X
2035 | INY
2036 | STA ($FD),Y
2037 | LDA TILE_COLOR_MR,X
2038 | INY
2039 | STA ($FD),Y
2040 | ;MOVE DOWN TO NEXT LINE
2041 | LDY #50
2042 | ;DRAW THE BOTTOM 3 COLORS
2043 | LDA TILE_COLOR_BL,X
2044 | STA ($FD),Y
2045 | LDA TILE_COLOR_BM,X
2046 | INY
2047 | STA ($FD),Y
2048 | LDA TILE_COLOR_BR,X
2049 | INY
2050 | STA ($FD),Y
2051 | RTS
2052 |
2053 | ;This routine plots a transparent tile from the tile database
2054 | ;anywhere on screen. But first you must define the tile number
2055 | ;in the TILE variable, as well as the starting screen address must
2056 | ;be defined in $FB. Also, this routine is slower than the usual
2057 | ;tile routine, so is only used for sprites. The ":" character ($3A)
2058 | ;is not drawn.
2059 | PLOT_TRANSPARENT_TILE:
2060 | LDA $FB ;Grab the starting address, and adjust it for
2061 | STA $FD ;the color RAM before we get started.
2062 | LDA $FC
2063 | STA $FE
2064 | LDX TILE
2065 | ;DRAW THE TOP 3 CHARACTERS
2066 | LDA TILE_DATA_TL,X
2067 | LDY #0
2068 | CMP #$3A
2069 | BEQ PTT01
2070 | STA ($FB),Y
2071 | PTT01: LDA TILE_DATA_TM,X
2072 | INY
2073 | CMP #$3A
2074 | BEQ PTT02
2075 | STA ($FB),Y
2076 | PTT02: LDA TILE_DATA_TR,X
2077 | INY
2078 | CMP #$3A
2079 | BEQ PTT03
2080 | STA ($FB),Y
2081 | ;MOVE DOWN TO NEXT LINE
2082 | PTT03: LDY #25
2083 | ;DRAW THE MIDDLE 3 CHARACTERS
2084 | LDA TILE_DATA_ML,X
2085 | CMP #$3A
2086 | BEQ PTT04
2087 | STA ($FB),Y
2088 | PTT04: LDA TILE_DATA_MM,X
2089 | INY
2090 | CMP #$3A
2091 | BEQ PTT05
2092 | STA ($FB),Y
2093 | PTT05: LDA TILE_DATA_MR,X
2094 | INY
2095 | CMP #$3A
2096 | BEQ PTT06
2097 | STA ($FB),Y
2098 | ;MOVE DOWN TO NEXT LINE
2099 | PTT06: LDY #50
2100 | ;DRAW THE BOTTOM 3 CHARACTERS
2101 | LDA TILE_DATA_BL,X
2102 | CMP #$3A
2103 | BEQ PTT07
2104 | STA ($FB),Y
2105 | PTT07: LDA TILE_DATA_BM,X
2106 | INY
2107 | CMP #$3A
2108 | BEQ PTT08
2109 | STA ($FB),Y
2110 | PTT08: LDA TILE_DATA_BR,X
2111 | INY
2112 | CMP #$3A
2113 | BEQ PTT09
2114 | STA ($FB),Y
2115 | PTT09: ;****NOW DO THE COLOR****
2116 | LDA $FE
2117 | CLC
2118 | ADC #$84 ;adjust to color RAM area by adding $8400
2119 | STA $FE
2120 | ;DRAW THE TOP 3 COLORS
2121 | LDA TILE_COLOR_TL,X
2122 | LDY #0
2123 | CMP #$00 ;If it is black, don't draw it.
2124 | BEQ PTT10
2125 | STA ($FD),Y
2126 | PTT10: LDA TILE_COLOR_TM,X
2127 | INY
2128 | CMP #$00 ;If it is black, don't draw it.
2129 | BEQ PTT11
2130 | STA ($FD),Y
2131 | PTT11: LDA TILE_COLOR_TR,X
2132 | INY
2133 | CMP #$00 ;If it is black, don't draw it.
2134 | BEQ PTT12
2135 | STA ($FD),Y
2136 | ;MOVE DOWN TO NEXT LINE
2137 | PTT12: LDY #25
2138 | ;DRAW THE MIDDLE 3 COLORS
2139 | LDA TILE_COLOR_ML,X
2140 | CMP #$00 ;If it is black, don't draw it.
2141 | BEQ PTT13
2142 | STA ($FD),Y
2143 | PTT13: LDA TILE_COLOR_MM,X
2144 | INY
2145 | CMP #$00 ;If it is black, don't draw it.
2146 | BEQ PTT14
2147 | STA ($FD),Y
2148 | PTT14: LDA TILE_COLOR_MR,X
2149 | INY
2150 | CMP #$00 ;If it is black, don't draw it.
2151 | BEQ PTT15
2152 | STA ($FD),Y
2153 | ;MOVE DOWN TO NEXT LINE
2154 | PTT15: LDY #50
2155 | ;DRAW THE BOTTOM 3 COLORS
2156 | LDA TILE_COLOR_BL,X
2157 | CMP #$00 ;If it is black, don't draw it.
2158 | BEQ PTT16
2159 | STA ($FD),Y
2160 | PTT16: LDA TILE_COLOR_BM,X
2161 | INY
2162 | CMP #$00 ;If it is black, don't draw it.
2163 | BEQ PTT17
2164 | STA ($FD),Y
2165 | PTT17: LDA TILE_COLOR_BR,X
2166 | INY
2167 | CMP #$00 ;If it is black, don't draw it.
2168 | BEQ PTT18
2169 | STA ($FD),Y
2170 | PTT18: RTS
2171 |
2172 |
2173 | ;This routine puts the cursor on the game map. Originally it reversed
2174 | ;the characters, but after moving to a custom character set, there was
2175 | ;no reverse set to use anymore, so now it draws a box.
2176 | REVERSE_TILE:
2177 | LDX CURSOR_Y
2178 | LDA MAP_CHART_L,X
2179 | STA $FB ;LOW BYTE OF SCREEN AREA
2180 | LDA MAP_CHART_H,X
2181 | STA $FC ;HIGH BYTE OF SCREEN AREA
2182 | LDA CURSOR_X
2183 | ASL ;MULTIPLY BY 2
2184 | CLC
2185 | ADC CURSOR_X ;ADD ANOTHER TO MAKE X3
2186 | ADC $FB
2187 | STA $FB
2188 | LDA $FC
2189 | ADC #00 ;CARRY FLAG
2190 | STA $FC
2191 | LDY #00
2192 | LDA #$70
2193 | STA ($FB),Y
2194 | INY
2195 | INY
2196 | LDA #$6E
2197 | STA ($FB),Y
2198 | LDY #50
2199 | LDA #$6D
2200 | STA ($FB),Y
2201 | INY
2202 | INY
2203 | LDA #$7D
2204 | STA ($FB),Y
2205 | LDX CURSOR_Y
2206 | LDA MAP_CHART_L,X
2207 | STA $FB ;LOW BYTE OF SCREEN AREA
2208 | LDA MAP_CHART_H,X
2209 | STA $FC ;HIGH BYTE OF SCREEN AREA
2210 | LDA CURSOR_X
2211 | ASL ;MULTIPLY BY 2
2212 | CLC
2213 | ADC CURSOR_X ;ADD ANOTHER TO MAKE X3
2214 | ADC $FB
2215 | STA $FB
2216 | LDA $FC
2217 | ADC #$84 ;CARRY FLAG AND $D4 TO MOVE TO COLOR RAM
2218 | STA $FC
2219 | LDY #00
2220 | LDA #01 ;WHITE ON BLACK
2221 | STA ($FB),Y
2222 | INY
2223 | INY
2224 | STA ($FB),Y
2225 | LDY #50
2226 | LDA #01 ;WHITE ON BLACK
2227 | STA ($FB),Y
2228 | INY
2229 | INY
2230 | STA ($FB),Y
2231 | RTS
2232 |
2233 | ;SOURCE_CHAR !BYTE 00
2234 | ;DEST_CAR !BYTE 00
2235 |
2236 | ;REVERSE_CHAR:
2237 | ; LDA SOURCE_CHAR
2238 |
2239 |
2240 | ;This routine checks to see if UNIT is occupying any space
2241 | ;that is currently visible in the window. If so, the
2242 | ;flag for redrawing the window will be set.
2243 | CHECK_FOR_WINDOW_REDRAW:
2244 | LDX UNIT
2245 | ;FIRST CHECK HORIZONTAL
2246 | LDA UNIT_LOC_X,X
2247 | CMP MAP_WINDOW_X
2248 | BCC CFR1
2249 | LDA MAP_WINDOW_X
2250 | CLC
2251 | ADC #6 ;this number is unique to VIC-20 due to smaller screen
2252 | CMP UNIT_LOC_X,X
2253 | BCC CFR1
2254 | ;NOW CHECK VERTICAL
2255 | LDA UNIT_LOC_Y,X
2256 | CMP MAP_WINDOW_Y
2257 | BCC CFR1
2258 | LDA MAP_WINDOW_Y
2259 | CLC
2260 | ADC #6
2261 | CMP UNIT_LOC_Y,X
2262 | BCC CFR1
2263 | LDA #1
2264 | STA REDRAW_WINDOW
2265 | CFR1: RTS
2266 |
2267 | DECWRITE:
2268 | LDA #$00
2269 | STA SCREENPOS
2270 | LDA DECNUM
2271 | LDX #2
2272 | LDY #$4C
2273 | DEC1 STY DECB
2274 | LSR
2275 | DEC2 ROL
2276 | BCS DEC3
2277 | CMP DECA,X
2278 | BCC DEC4
2279 | DEC3 SBC DECA,X
2280 | SEC
2281 | DEC4 ROL DECB
2282 | BCC DEC2
2283 | STA DECTEMP
2284 | LDA DECB
2285 | LDY SCREENPOS
2286 | STA ($FB),Y
2287 | INC SCREENPOS
2288 | LDA DECTEMP
2289 | LDY #$13
2290 | DEX
2291 | BPL DEC1
2292 | RTS
2293 | DECA !BYTE 128,160,200
2294 | DECB !BYTE 1
2295 | SCREENPOS !BYTE $00
2296 | DECTEMP !BYTE $00
2297 |
2298 | ; The following routine loads the tileset from disk
2299 | TILE_LOAD_ROUTINE:
2300 | LDA #11 ;LENGTH OF FILENAME
2301 | LDX #TILENAME
2303 | JSR $FFBD ;SETNAM A=FILE NAME LENGTH X/Y=POINTER TO FILENAME
2304 | LDA #$02
2305 | LDX #$08
2306 | LDY #$00
2307 | JSR $FFBA ;SETFLS A=LOGICAL NUMBER X=DEVICE NUMBER Y=SECONDARY
2308 | LDX #$00 ;LOW BYTE FOR LOAD ADDRESS
2309 | LDY #$A0 ;HIGH BYTE FOR LOAD ADDRESS
2310 | LDA #$00
2311 | JSR $FFD5 ;LOAD FILE A=0 FOR LOAD X/Y=LOAD ADDRESS
2312 | JSR $FFC3 ;CLOSE FILE
2313 | RTS
2314 |
2315 | ; The following routine loads the map from disk
2316 | MAP_LOAD_ROUTINE:
2317 | LDA #7 ;LENGTH OF FILENAME
2318 | LDX #MAPNAME
2320 | JSR $FFBD ;SETNAM A=FILE NAME LENGTH X/Y=POINTER TO FILENAME
2321 | LDA #$02
2322 | LDX #$08
2323 | LDY #$00
2324 | JSR $FFBA ;SETFLS A=LOGICAL NUMBER X=DEVICE NUMBER Y=SECONDARY
2325 | LDX #$00 ;LOW BYTE FOR LOAD ADDRESS
2326 | LDY #$5D ;HIGH BYTE FOR LOAD ADDRESS
2327 | LDA #$00
2328 | JSR $FFD5 ;LOAD FILE A=0 FOR LOAD X/Y=LOAD ADDRESS
2329 | JSR $FFC3 ;CLOSE FILE
2330 | RTS
2331 |
2332 | ; The following routine loads the sound routines from disk
2333 | SOUND_LOAD_ROUTINE:
2334 | ;load sound driver to $0400
2335 | LDA #8 ;LENGTH OF FILENAME
2336 | LDX #SNDNAME
2338 | JSR $FFBD ;SETNAM A=FILE NAME LENGTH X/Y=POINTER TO FILENAME
2339 | LDA #$02
2340 | LDX #$08
2341 | LDY #$00
2342 | JSR $FFBA ;SETFLS A=LOGICAL NUMBER X=DEVICE NUMBER Y=SECONDARY
2343 | LDX #$00 ;LOW BYTE FOR LOAD ADDRESS
2344 | LDY #$04 ;HIGH BYTE FOR LOAD ADDRESS
2345 | LDA #$00
2346 | JSR $FFD5 ;LOAD FILE A=0 FOR LOAD X/Y=LOAD ADDRESS
2347 | JSR $FFC3 ;CLOSE FILE
2348 | ;load music to $B400
2349 | LDA #10 ;LENGTH OF FILENAME
2350 | LDX #MUSICNAME
2352 | JSR $FFBD ;SETNAM A=FILE NAME LENGTH X/Y=POINTER TO FILENAME
2353 | LDA #$02
2354 | LDX #$08
2355 | LDY #$00
2356 | JSR $FFBA ;SETFLS A=LOGICAL NUMBER X=DEVICE NUMBER Y=SECONDARY
2357 | LDX #$00 ;LOW BYTE FOR LOAD ADDRESS
2358 | LDY #$B4 ;HIGH BYTE FOR LOAD ADDRESS
2359 | LDA #$00
2360 | JSR $FFD5 ;LOAD FILE A=0 FOR LOAD X/Y=LOAD ADDRESS
2361 | JSR $FFC3 ;CLOSE FILE
2362 | RTS
2363 |
2364 | DISPLAY_GAME_SCREEN:
2365 | LDA #$CD
2366 | STA $9005 ;enabled custom charset at $1400
2367 | ;SET SOURCE
2368 | LDA #SCR_TEXT
2371 | STA $FC
2372 | ;SET DESTINATION
2373 | LDA #$00
2374 | STA $FD
2375 | LDA #$10
2376 | STA $FE
2377 | ;SET END
2378 | LDA #$12
2379 | STA DGS5+1
2380 | LDA #$70
2381 | STA DGS6+1
2382 | JSR DECOMPRESS_SCREEN
2383 | ;SET SOURCE
2384 | LDA #SCR_COLOR
2387 | STA $FC
2388 | ;SET DESTINATION
2389 | LDA #$00
2390 | STA $FD
2391 | LDA #$94
2392 | STA $FE
2393 | ;SET END
2394 | LDA #$96
2395 | STA DGS5+1
2396 | LDA #$70
2397 | STA DGS6+1
2398 | JSR DECOMPRESS_SCREEN
2399 | RTS
2400 |
2401 | DISPLAY_INTRO_SCREEN:
2402 | LDA #$C0
2403 | STA $9005 ; Turn off custom character set.
2404 | ;SET SOURCE
2405 | LDA #INTRO_TEXT
2408 | STA $FC
2409 | ;SET DESTINATION
2410 | LDA #$00
2411 | STA $FD
2412 | LDA #$10
2413 | STA $FE
2414 | ;SET END
2415 | LDA #$12
2416 | STA DGS5+1
2417 | LDA #$70
2418 | STA DGS6+1
2419 | JSR DECOMPRESS_SCREEN
2420 | ;SET SOURCE
2421 | LDA #INTRO_COLOR
2424 | STA $FC
2425 | ;SET DESTINATION
2426 | LDA #$00
2427 | STA $FD
2428 | LDA #$94
2429 | STA $FE
2430 | ;SET END
2431 | LDA #$96
2432 | STA DGS5+1
2433 | LDA #$70
2434 | STA DGS6+1
2435 | JSR DECOMPRESS_SCREEN
2436 | RTS
2437 |
2438 | DISPLAY_ENDGAME_SCREEN:
2439 | ;first clear the color RAM.
2440 | LDA #05; GREEN
2441 | LDX #0
2442 | DESA: STA $9400,X
2443 | STA $9500,X
2444 | INX
2445 | CPX #0
2446 | BNE DESA
2447 | DESB: STA $9600,X
2448 | INX
2449 | CPX #113
2450 | BNE DESB
2451 | ;Now decompress text
2452 | ;SET SOURCE
2453 | LDA #SCR_ENDGAME
2456 | STA $FC
2457 | ;SET DESTINATION
2458 | LDA #$00
2459 | STA $FD
2460 | LDA #$10
2461 | STA $FE
2462 | ;SET END
2463 | LDA #$12
2464 | STA DGS5+1
2465 | LDA #$70
2466 | STA DGS6+1
2467 | JSR DECOMPRESS_SCREEN
2468 | ;display map number
2469 | LDA #$D3
2470 | STA $FB
2471 | LDA #$10
2472 | STA $FC
2473 | LDA SELECTED_MAP
2474 | STA DECNUM
2475 | INC DECNUM
2476 | JSR DECWRITE
2477 | ;count robots remaining
2478 | LDX #1
2479 | LDA #0
2480 | STA DECNUM
2481 | DEG7: LDA UNIT_TYPE,X
2482 | CMP #0
2483 | BEQ DEG8
2484 | INC DECNUM
2485 | DEG8: INX
2486 | CPX #28
2487 | BNE DEG7
2488 | LDA #$11
2489 | STA $FC
2490 | LDA #$69
2491 | STA $FB
2492 | JSR DECWRITE
2493 | ;Count secrets remaining
2494 | LDA #0
2495 | STA DECNUM
2496 | LDX #48
2497 | DEG9: LDA UNIT_TYPE,X
2498 | CMP #0
2499 | BEQ DEG10
2500 | INC DECNUM
2501 | DEG10: INX
2502 | CPX #64
2503 | BNE DEG9
2504 | LDA #$11
2505 | STA $FC
2506 | LDA #$B4
2507 | STA $FB
2508 | JSR DECWRITE
2509 | RTS
2510 |
2511 | DECOMPRESS_SCREEN:
2512 | LDY #00
2513 | DGS1: LDA ($FB),Y
2514 | CMP #96 ;REPEAT FLAG
2515 | BEQ DGS10
2516 | DGS2: STA ($FD),Y
2517 | ;CHECK TO SEE IF WE REACHED $83E7 YET.
2518 | DGS4: LDA $FE
2519 | DGS5: CMP #$83 ;SELF MODIFYING CODE
2520 | BNE DGS3
2521 | LDA $FD
2522 | DGS6: CMP #$E7 ;SELF MODIFYING CODE
2523 | BNE DGS3
2524 | RTS
2525 | DGS3: JSR INC_SOURCE
2526 | JSR INC_DEST
2527 | JMP DGS1
2528 | DGS10: ;REPEAT CODE
2529 | JSR INC_SOURCE
2530 | LDA ($FB),Y
2531 | STA RPT
2532 | JSR INC_SOURCE
2533 | LDA ($FB),Y
2534 | TAX
2535 | DGS11: LDA RPT
2536 | STA ($FD),Y
2537 | JSR INC_DEST
2538 | DEX
2539 | CPX #$FF
2540 | BNE DGS11
2541 | LDA $FD
2542 | SEC
2543 | SBC #01
2544 | STA $FD
2545 | LDA $FE
2546 | SBC #00
2547 | STA $FE
2548 | JMP DGS4
2549 | INC_SOURCE:
2550 | LDA $FB
2551 | CLC
2552 | ADC #01
2553 | STA $FB
2554 | LDA $FC
2555 | ADC #00
2556 | STA $FC
2557 | RTS
2558 | INC_DEST:
2559 | LDA $FD
2560 | CLC
2561 | ADC #01
2562 | STA $FD
2563 | LDA $FE
2564 | ADC #00
2565 | STA $FE
2566 | RTS
2567 | RPT !BYTE 00 ;repeat value
2568 |
2569 | DISPLAY_PLAYER_HEALTH:
2570 | LDA UNIT_HEALTH ;No index needed because it is the player
2571 | LSR ;divide by two
2572 | STA TEMP_A
2573 | LDY #00
2574 | DPH01: CPY TEMP_A
2575 | BEQ DPH02
2576 | LDA #$66 ;GRAY BLOCK
2577 | STA $1252,Y
2578 | INY
2579 | JMP DPH01
2580 | DPH02: LDA UNIT_HEALTH
2581 | AND #%00000001
2582 | CMP #%00000001
2583 | BNE DPH03
2584 | LDA #$5C ;HALF GRAY BLOCK
2585 | STA $1252,Y
2586 | INY
2587 | DPH03: CPY #6
2588 | BEQ DPH04
2589 | LDA #$20 ;SPACE
2590 | STA $1252,Y
2591 | INY
2592 | JMP DPH03
2593 | DPH04: RTS
2594 |
2595 | DISPLAY_KEYS:
2596 | LDA #32
2597 | STA $11A6 ;ERASE ALL 3 SPOTS
2598 | STA $11A7
2599 | STA $11A8
2600 | LDA KEYS
2601 | AND #%00000001
2602 | CMP #%00000001 ;Spade key
2603 | BNE DKS1
2604 | LDA #$41
2605 | STA $11A6
2606 | DKS1: LDA KEYS
2607 | AND #%00000010
2608 | CMP #%00000010 ;heart key
2609 | BNE DKS2
2610 | LDA #$53
2611 | STA $11A7
2612 | DKS2: LDA KEYS
2613 | AND #%00000100
2614 | CMP #%00000100 ;star key
2615 | BNE DKS3
2616 | LDA #$2A
2617 | STA $11A8
2618 | DKS3: RTS
2619 |
2620 | CYCLE_ITEM:
2621 | LDA #13 ;CHANGE-ITEM-SOUND
2622 | JSR PLAY_SOUND ;SOUND PLAY
2623 | LDA #20
2624 | STA KEYTIMER
2625 | INC SELECTED_ITEM
2626 | LDA SELECTED_ITEM
2627 | CMP #5
2628 | BEQ CYIT1
2629 | JMP DISPLAY_ITEM
2630 | CYIT1: LDA #0
2631 | STA SELECTED_ITEM
2632 | JMP DISPLAY_ITEM
2633 |
2634 | DISPLAY_ITEM:
2635 | JSR PRESELECT_ITEM
2636 | DSIT00: LDA SELECTED_ITEM
2637 | CMP #0 ;no items to show
2638 | BNE DSIT01
2639 | ;add routine to draw blank space
2640 | RTS
2641 | DSIT01: CMP #5 ;number too high!
2642 | BNE DSIT0A
2643 | LDA #0
2644 | STA SELECTED_ITEM
2645 | RTS
2646 | DSIT0A: CMP #1 ;bomb
2647 | BNE DSIT03
2648 | LDA INV_BOMBS
2649 | CMP #0 ;did we run out?
2650 | BNE DSIT02
2651 | INC SELECTED_ITEM
2652 | JMP DSIT00
2653 | DSIT02: JSR DISPLAY_TIMEBOMB
2654 | RTS
2655 | DSIT03: CMP #2 ;emp
2656 | BNE DSIT05
2657 | LDA INV_EMP
2658 | CMP #0 ;did we run out?
2659 | BNE DSIT04
2660 | INC SELECTED_ITEM
2661 | JMP DSIT00
2662 | DSIT04: JSR DISPLAY_EMP
2663 | RTS
2664 | DSIT05: CMP #3 ;medkit
2665 | BNE DSIT07
2666 | LDA INV_MEDKIT
2667 | CMP #0 ;did we run out?
2668 | BNE DSIT06
2669 | INC SELECTED_ITEM
2670 | JMP DSIT00
2671 | DSIT06: JSR DISPLAY_MEDKIT
2672 | RTS
2673 | DSIT07: CMP #4 ;magnet
2674 | BNE DSIT09
2675 | LDA INV_MAGNET
2676 | CMP #0 ;did we run out?
2677 | BNE DSIT08
2678 | INC SELECTED_ITEM
2679 | JMP DSIT09
2680 | DSIT08: JSR DISPLAY_MAGNET
2681 | RTS
2682 | DSIT09: LDA #0
2683 | STA SELECTED_ITEM
2684 | JSR PRESELECT_ITEM
2685 | JMP DISPLAY_ITEM
2686 |
2687 | ;This routine checks to see if currently selected
2688 | ;item is zero. And if it is, then it checks inventories
2689 | ;of other items to decide which item to automatically
2690 | ;select for the user.
2691 | PRESELECT_ITEM:
2692 | LDA SELECTED_ITEM
2693 | CMP #0 ;If item already selected, return
2694 | BEQ PRSI01
2695 | RTS
2696 | PRSI01: LDA INV_BOMBS
2697 | CMP #0
2698 | BEQ PRSI02
2699 | LDA #1 ;BOMB
2700 | STA SELECTED_ITEM
2701 | RTS
2702 | PRSI02: LDA INV_EMP
2703 | CMP #0
2704 | BEQ PRSI03
2705 | LDA #2 ;EMP
2706 | STA SELECTED_ITEM
2707 | RTS
2708 | PRSI03: LDA INV_MEDKIT
2709 | CMP #0
2710 | BEQ PRSI04
2711 | LDA #3 ;MEDKIT
2712 | STA SELECTED_ITEM
2713 | RTS
2714 | PRSI04: LDA INV_MAGNET
2715 | CMP #0
2716 | BEQ PRSI05
2717 | LDA #4 ;MAGNET
2718 | STA SELECTED_ITEM
2719 | RTS
2720 | PRSI05: ;Nothing found in inventory at this point, so set
2721 | ;selected-item to zero.
2722 | LDA #0 ;nothing in inventory
2723 | STA SELECTED_ITEM
2724 | JSR DISPLAY_BLANK_ITEM
2725 | RTS
2726 |
2727 | DISPLAY_TIMEBOMB:
2728 | LDY #0
2729 | DTB1: LDA TBOMB1A,Y
2730 | STA $10DE,Y
2731 | LDA TBOMB1B,Y
2732 | STA $10F7,Y
2733 | LDA TBOMB1C,Y
2734 | STA $1110,Y
2735 | LDA TBOMB1D,Y
2736 | STA $1129,Y
2737 | LDA TBOMB1E,Y
2738 | STA $94DE,Y
2739 | LDA TBOMB1F,Y
2740 | STA $94F7,Y
2741 | LDA TBOMB1G,Y
2742 | STA $9510,Y
2743 | LDA TBOMB1H,Y
2744 | STA $9529,Y
2745 | INY
2746 | CPY #3
2747 | BNE DTB1
2748 | LDA INV_BOMBS
2749 | STA DECNUM
2750 | LDA #$42
2751 | STA $FB
2752 | LDA #$11
2753 | STA $FC
2754 | JSR DECWRITE
2755 | RTS
2756 |
2757 | DISPLAY_EMP:
2758 | LDY #0
2759 | DEM1: LDA EMP1A,Y
2760 | STA $10DE,Y
2761 | LDA EMP1B,Y
2762 | STA $10F7,Y
2763 | LDA EMP1C,Y
2764 | STA $1110,Y
2765 | LDA EMP1D,Y
2766 | STA $1129,Y
2767 | LDA EMP1E,Y
2768 | STA $94DE,Y
2769 | LDA EMP1F,Y
2770 | STA $94F7,Y
2771 | LDA EMP1G,Y
2772 | STA $9510,Y
2773 | LDA EMP1H,Y
2774 | STA $9529,Y
2775 | INY
2776 | CPY #3
2777 | BNE DEM1
2778 | LDA INV_EMP
2779 | STA DECNUM
2780 | LDA #$42
2781 | STA $FB
2782 | LDA #$11
2783 | STA $FC
2784 | JSR DECWRITE
2785 | RTS
2786 |
2787 | DISPLAY_MEDKIT:
2788 | LDY #0
2789 | DMK1: LDA MED1A,Y
2790 | STA $10DE,Y
2791 | LDA MED1B,Y
2792 | STA $10F7,Y
2793 | LDA MED1C,Y
2794 | STA $1110,Y
2795 | LDA MED1D,Y
2796 | STA $1129,Y
2797 | LDA MED1E,Y
2798 | STA $94DE,Y
2799 | LDA MED1F,Y
2800 | STA $94F7,Y
2801 | LDA MED1G,Y
2802 | STA $9510,Y
2803 | LDA MED1H,Y
2804 | STA $9529,Y
2805 | INY
2806 | CPY #3
2807 | BNE DMK1
2808 | LDA INV_MEDKIT
2809 | STA DECNUM
2810 | LDA #$42
2811 | STA $FB
2812 | LDA #$11
2813 | STA $FC
2814 | JSR DECWRITE
2815 | RTS
2816 |
2817 | DISPLAY_MAGNET:
2818 | LDY #0
2819 | DMG1: LDA MAG1A,Y
2820 | STA $10DE,Y
2821 | LDA MAG1B,Y
2822 | STA $10F7,Y
2823 | LDA MAG1C,Y
2824 | STA $1110,Y
2825 | LDA MAG1D,Y
2826 | STA $1129,Y
2827 | LDA MAG1E,Y
2828 | STA $94DE,Y
2829 | LDA MAG1F,Y
2830 | STA $94F7,Y
2831 | LDA MAG1G,Y
2832 | STA $9510,Y
2833 | LDA MAG1H,Y
2834 | STA $9529,Y
2835 | INY
2836 | CPY #3
2837 | BNE DMG1
2838 | LDA INV_MAGNET
2839 | STA DECNUM
2840 | LDA #$42
2841 | STA $FB
2842 | LDA #$11
2843 | STA $FC
2844 | JSR DECWRITE
2845 | RTS
2846 |
2847 | DISPLAY_BLANK_ITEM:
2848 | LDY #0
2849 | DBI1: LDA #32
2850 | STA $10DE,Y
2851 | STA $10F7,Y
2852 | STA $1110,Y
2853 | STA $1129,Y
2854 | STA $1142,Y
2855 | INY
2856 | CPY #3
2857 | BNE DBI1
2858 | RTS
2859 |
2860 | CYCLE_WEAPON:
2861 | LDA #12 ;CHANGE WEAPON-SOUND
2862 | JSR PLAY_SOUND ;SOUND PLAY
2863 | LDA #20
2864 | STA KEYTIMER
2865 | INC SELECTED_WEAPON
2866 | LDA SELECTED_WEAPON
2867 | CMP #2
2868 | BNE CYWE1
2869 | JMP DISPLAY_WEAPON
2870 | CYWE1: LDA #0
2871 | STA SELECTED_WEAPON
2872 | JMP DISPLAY_WEAPON
2873 |
2874 | DISPLAY_WEAPON:
2875 | JSR PRESELECT_WEAPON
2876 | LDA SELECTED_WEAPON
2877 | CMP #0 ;no weapon to show
2878 | BNE DSWP01
2879 | ;add routine to draw blank space
2880 | RTS
2881 | DSWP01: CMP #1 ;PISTOL
2882 | BNE DSWP03
2883 | LDA AMMO_PISTOL
2884 | CMP #0 ;did we run out?
2885 | BNE DSWP02
2886 | LDA #0
2887 | STA SELECTED_WEAPON
2888 | JMP DISPLAY_WEAPON
2889 | DSWP02: JSR DISPLAY_PISTOL
2890 | RTS
2891 | DSWP03: CMP #2 ;PLASMA GUN
2892 | BNE DSWP05
2893 | LDA AMMO_PLASMA
2894 | CMP #0 ;did we run out?
2895 | BNE DSWP04
2896 | LDA #0
2897 | STA SELECTED_WEAPON
2898 | JMP DISPLAY_WEAPON
2899 | DSWP04: JSR DISPLAY_PLASMA_GUN
2900 | RTS
2901 | DSWP05: LDA #0
2902 | STA SELECTED_WEAPON ;should never happen
2903 | JMP DISPLAY_WEAPON
2904 |
2905 | ;This routine checks to see if currently selected
2906 | ;weapon is zero. And if it is, then it checks inventories
2907 | ;of other weapons to decide which item to automatically
2908 | ;select for the user.
2909 | PRESELECT_WEAPON:
2910 | LDA SELECTED_WEAPON
2911 | CMP #0 ;If item already selected, return
2912 | BEQ PRSW01
2913 | RTS
2914 | PRSW01: LDA AMMO_PISTOL
2915 | CMP #0
2916 | BEQ PRSW02
2917 | LDA #1 ;PISTOL
2918 | STA SELECTED_WEAPON
2919 | RTS
2920 | PRSW02: LDA AMMO_PLASMA
2921 | CMP #0
2922 | BEQ PRSW04
2923 | LDA #2 ;PLASMAGUN
2924 | STA SELECTED_WEAPON
2925 | RTS
2926 | PRSW04: ;Nothing found in inventory at this point, so set
2927 | ;selected-item to zero.
2928 | LDA #0 ;nothing in inventory
2929 | STA SELECTED_WEAPON
2930 | JSR DISPLAY_BLANK_WEAPON
2931 | RTS
2932 |
2933 | DISPLAY_PISTOL:
2934 | LDY #0
2935 | DW2: LDA PISTOL1A,Y
2936 | STA $102F,Y
2937 | LDA PISTOL1B,Y
2938 | STA $1048,Y
2939 | LDA PISTOL1C,Y
2940 | STA $1061,Y
2941 | LDA PISTOL1D,Y
2942 | STA $107A,Y
2943 | LDA PISTOL1E,Y
2944 | STA $942F,Y
2945 | LDA PISTOL1F,Y
2946 | STA $9448,Y
2947 | LDA PISTOL1G,Y
2948 | STA $9461,Y
2949 | LDA PISTOL1H,Y
2950 | STA $947A,Y
2951 | INY
2952 | CPY #3
2953 | BNE DW2
2954 | LDA AMMO_PISTOL
2955 | STA DECNUM
2956 | LDA #$93
2957 | STA $FB
2958 | LDA #$10
2959 | STA $FC
2960 | JSR DECWRITE
2961 | RTS
2962 |
2963 | DISPLAY_PLASMA_GUN:
2964 | LDY #0
2965 | DW1: LDA WEAPON1A,Y
2966 | STA $102F,Y
2967 | LDA WEAPON1B,Y
2968 | STA $1048,Y
2969 | LDA WEAPON1C,Y
2970 | STA $1061,Y
2971 | LDA WEAPON1D,Y
2972 | STA $107A,Y
2973 | LDA WEAPON1E,Y
2974 | STA $942F,Y
2975 | LDA WEAPON1F,Y
2976 | STA $9448,Y
2977 | LDA WEAPON1G,Y
2978 | STA $9461,Y
2979 | LDA WEAPON1H,Y
2980 | STA $947A,Y
2981 | INY
2982 | CPY #3
2983 | BNE DW1
2984 | LDA AMMO_PLASMA
2985 | STA DECNUM
2986 | LDA #$93
2987 | STA $FB
2988 | LDA #$10
2989 | STA $FC
2990 | JSR DECWRITE
2991 | RTS
2992 |
2993 | DISPLAY_BLANK_WEAPON:
2994 | LDY #0
2995 | DBW2: LDA #32
2996 | STA $102F,Y
2997 | STA $1048,Y
2998 | STA $1061,Y
2999 | STA $107A,Y
3000 | STA $1093,Y
3001 | INY
3002 | CPY #6
3003 | BNE DBW2
3004 | RTS
3005 |
3006 | GAME_OVER:
3007 | ;Did player die or win?
3008 | LDA UNIT_TYPE
3009 | CMP #0
3010 | BNE GOM0
3011 | LDA #111 ;dead player tile
3012 | STA UNIT_TILE
3013 | LDA #100
3014 | STA KEYTIMER
3015 | GOM0: JSR BACKGROUND_TASKS
3016 | LDA KEYTIMER
3017 | CMP #0
3018 | BNE GOM0
3019 | ;stop screen shake
3020 | LDA #0
3021 | STA SCREEN_SHAKE
3022 | LDX #0
3023 | GOM1: LDA GAMEOVER1,X
3024 | STA $10E6,X
3025 | LDA GAMEOVER2,X
3026 | STA $10FF,X
3027 | LDA GAMEOVER3,X
3028 | STA $1118,X
3029 | LDA #01 ;COLOR WHITE
3030 | STA $94E6,X
3031 | STA $94FF,X
3032 | STA $9518,X
3033 | INX
3034 | CPX #11
3035 | BNE GOM1
3036 | LDA #100
3037 | STA KEYTIMER
3038 | GOM2: LDA KEYTIMER
3039 | CMP #0
3040 | BNE GOM2
3041 | LDA #0
3042 | STA $00C6 ;CLEAR KEYBOARD BUFFER
3043 | GOM3: JSR $FFE4
3044 | CMP #$00
3045 | BEQ GOM3
3046 | GOM4: LDA #0
3047 | STA $00C6 ;CLEAR KEYBOARD BUFFER
3048 | LDA #15 ;menu beep
3049 | JSR PLAY_SOUND ;SOUND PLAY
3050 | JSR DISPLAY_ENDGAME_SCREEN
3051 | GOM5: JSR $FFE4
3052 | CMP #$00
3053 | BEQ GOM5
3054 | LDA #0
3055 | STA $009E ;CLEAR KEYBOARD BUFFER
3056 | JMP INTRO_SCREEN
3057 |
3058 | GAMEOVER1: !BYTE $70,$40,$40,$40,$40,$40,$40,$40,$40,$40,$6e
3059 | GAMEOVER2: !BYTE $5d,$07,$01,$0d,$05,$20,$0f,$16,$05,$12,$5d
3060 | GAMEOVER3: !BYTE $6d,$40,$40,$40,$40,$40,$40,$40,$40,$40,$7d
3061 |
3062 | PRINT_INTRO_MESSAGE:
3063 | LDA #INTRO_MESSAGE
3066 | STA $FC
3067 | JSR PRINT_INFO
3068 | RTS
3069 |
3070 | ;This routine will print something to the "information" window
3071 | ;at the bottom left of the screen. You must first define the
3072 | ;source of the text in $FB. The text should terminate with
3073 | ;a null character.
3074 | PRINT_INFO:
3075 | JSR SCROLL_INFO ;New text always causes a scroll
3076 | LDY #0
3077 | STY PRINTX
3078 | PI01: LDA ($FB),Y
3079 | CMP #0 ;null terminates string
3080 | BNE PI02
3081 | RTS
3082 | PI02: CMP #255 ;return
3083 | BNE PI03
3084 | LDX #0
3085 | STX PRINTX
3086 | JSR SCROLL_INFO
3087 | JMP PI04
3088 | PI03: LDX PRINTX
3089 | STA $1258,X
3090 | INC PRINTX
3091 | PI04: INY
3092 | JMP PI01
3093 | PRINTX: !BYTE 00 ;used to store X-cursor location
3094 |
3095 | ;This routine scrolls the info screen by one row, clearing
3096 | ;a new row at the bottom.
3097 | SCROLL_INFO:
3098 | LDX #0
3099 | SCI1: LDA $123F,X
3100 | STA $1226,X
3101 | LDA $1258,X ;BOTTOM ROW
3102 | STA $123F,X
3103 | INX
3104 | CPX #18
3105 | BNE SCI1
3106 | ;NOW CLEAR BOTTOM ROW
3107 | LDX #0
3108 | LDA #32
3109 | SCI2: STA $1258,X;BOTTOM ROW
3110 | INX
3111 | CPX #18
3112 | BNE SCI2
3113 | RTS
3114 |
3115 | RESET_KEYS_AMMO:
3116 | LDA #$00
3117 | STA KEYS
3118 | STA AMMO_PISTOL
3119 | STA AMMO_PLASMA
3120 | STA INV_BOMBS
3121 | STA INV_EMP
3122 | STA INV_MEDKIT
3123 | STA INV_MAGNET
3124 | STA SELECTED_WEAPON
3125 | STA SELECTED_ITEM
3126 | STA MAGNET_ACT
3127 | STA PLASMA_ACT
3128 | STA BIG_EXP_ACT
3129 | RTS
3130 |
3131 | INTRO_SCREEN:
3132 | LDX #$B4 ;find music at $B400
3133 | LDA #$00
3134 | JSR PEST_SOUND+$09 ;PEST MUSIC LOAD
3135 | JSR PEST_SOUND+$0C ;PEST MUSIC PLAY
3136 | JSR DISPLAY_INTRO_SCREEN
3137 | JSR DISPLAY_MAP_NAME
3138 | JSR CHANGE_DIFFICULTY_LEVEL
3139 | LDA #0
3140 | STA MENUY
3141 | JSR REVERSE_MENU_OPTION
3142 | ISLOOP JSR $FFE4
3143 | CMP #00
3144 | BEQ ISLOOP
3145 | CMP #$11 ;CURSOR DOWN
3146 | BNE IS001
3147 | IS001A: LDA MENUY
3148 | CMP #3
3149 | BEQ ISLOOP
3150 | JSR REVERSE_MENU_OPTION
3151 | INC MENUY
3152 | JSR REVERSE_MENU_OPTION
3153 | LDA #15
3154 | JSR PEST_SOUND+$15 ;SOUND PLAY
3155 | JMP ISLOOP
3156 | IS001: CMP #$91 ;CURSOR UP
3157 | BNE IS002
3158 | IS002A: LDA MENUY
3159 | CMP #0
3160 | BEQ ISLOOP
3161 | JSR REVERSE_MENU_OPTION
3162 | DEC MENUY
3163 | JSR REVERSE_MENU_OPTION
3164 | LDA #15
3165 | JSR PLAY_SOUND ;SOUND PLAY
3166 | JMP ISLOOP
3167 | IS002: CMP #32 ;SPACE
3168 | BNE IS003
3169 | JMP EXEC_COMMAND
3170 | IS003: CMP KEY_MOVE_UP
3171 | BNE IS004
3172 | JMP IS002A
3173 | IS004: CMP KEY_MOVE_DOWN
3174 | BNE IS005
3175 | JMP IS001A
3176 | IS005: CMP #13 ;RETURN
3177 | BNE IS006
3178 | LDA #15 ;menu beep
3179 | JSR PLAY_SOUND ;SOUND PLAY
3180 | JMP EXEC_COMMAND
3181 | IS006: JMP ISLOOP
3182 |
3183 |
3184 | EXEC_COMMAND:
3185 | LDA MENUY
3186 | CMP #00 ;START GAME
3187 | BNE EXEC1
3188 | JSR SET_CONTROLS
3189 | JSR PEST_SOUND+$0F ;MUSIC STOP
3190 | LDA #0
3191 | STA MUSIC_STATE
3192 | JMP INIT_GAME
3193 | EXEC1: CMP #2 ;DIFF LEVEL
3194 | BNE EXEC05
3195 | INC DIFF_LEVEL
3196 | LDA DIFF_LEVEL
3197 | CMP #3
3198 | BNE EXEC02
3199 | LDA #0
3200 | STA DIFF_LEVEL
3201 | EXEC02: JSR CHANGE_DIFFICULTY_LEVEL
3202 | JMP ISLOOP
3203 | EXEC05: CMP #1 ;cycle map
3204 | BNE EXEC06
3205 | JSR CYCLE_MAP
3206 | EXEC06: CMP #3
3207 | BNE EXEC07
3208 | JSR CYCLE_CONTROLS
3209 | EXEC07: JMP ISLOOP
3210 |
3211 | CYCLE_CONTROLS:
3212 | INC CONTROL
3213 | LDA CONTROL
3214 | CMP #3
3215 | BNE CCON2
3216 | LDA #0
3217 | STA CONTROL
3218 | CCON2: ;display control method on screen
3219 | LDY CONTROL
3220 | LDA CONTROLSTART,Y
3221 | TAY
3222 | LDX #0
3223 | CCON3: LDA CONTROLTEXT,Y
3224 | ORA #%10000000
3225 | STA $105C,X
3226 | INX
3227 | INY
3228 | CPX #8
3229 | BNE CCON3
3230 | RTS
3231 |
3232 | CONTROLTEXT: !SCR"keyset 1"
3233 | !SCR"keyset 2"
3234 | !SCR"snes pad"
3235 | CONTROLSTART: !BYTE 00,8,16
3236 |
3237 | CYCLE_MAP:
3238 | INC SELECTED_MAP
3239 | LDA SELECTED_MAP
3240 | CMP #10 ;max number of maps
3241 | BNE CYM1
3242 | LDA #0
3243 | STA SELECTED_MAP
3244 | CYM1: JSR DISPLAY_MAP_NAME
3245 | RTS
3246 |
3247 | DISPLAY_MAP_NAME:
3248 | LDA SELECTED_MAP
3249 | STA DECNUM
3250 | INC DECNUM
3251 | LDA #$1A
3252 | STA $FB
3253 | LDA #$10
3254 | STA $FC
3255 | JSR DECWRITE
3256 | ;now set the mapname for the filesystem load
3257 | LDA SELECTED_MAP
3258 | CLC
3259 | ADC #65
3260 | STA MAPNAME+6
3261 | RTS
3262 |
3263 | REVERSE_MENU_OPTION:
3264 | LDY MENUY
3265 | LDA MENU_CHART_L,Y
3266 | STA $FB
3267 | LDA #$10
3268 | STA $FC
3269 | LDY #0
3270 | RMO1: LDA ($FB),Y
3271 | EOR #%10000000
3272 | STA ($FB),Y
3273 | INY
3274 | CPY #8
3275 | BNE RMO1
3276 | RTS
3277 | MENUY !BYTE $00 ;CURRENT MENU SELECTION
3278 | MENU_CHART_L:
3279 | !BYTE $11,$2A,$43,$5C
3280 |
3281 | CHANGE_DIFFICULTY_LEVEL:
3282 | LDY DIFF_LEVEL
3283 | LDA FACE_LEVEL,Y
3284 | TAY
3285 | ;DO CHARACTERS FIRST
3286 | LDA ROBOT_FACE,Y
3287 | STA $1083
3288 | INY
3289 | LDA ROBOT_FACE,Y
3290 | STA $1084
3291 | INY
3292 | LDA ROBOT_FACE,Y
3293 | STA $1085
3294 | INY
3295 | LDA ROBOT_FACE,Y
3296 | STA $1087
3297 | INY
3298 | LDA ROBOT_FACE,Y
3299 | STA $1088
3300 | INY
3301 | LDA ROBOT_FACE,Y
3302 | STA $1089
3303 | INY
3304 | LDA ROBOT_FACE,Y
3305 | STA $109E
3306 | INY
3307 | LDA ROBOT_FACE,Y
3308 | STA $10A0
3309 | ;NOW DO COLORS
3310 | INY
3311 | LDA ROBOT_FACE,Y
3312 | STA $9483
3313 | INY
3314 | LDA ROBOT_FACE,Y
3315 | STA $9484
3316 | INY
3317 | LDA ROBOT_FACE,Y
3318 | STA $9485
3319 | INY
3320 | LDA ROBOT_FACE,Y
3321 | STA $9487
3322 | INY
3323 | LDA ROBOT_FACE,Y
3324 | STA $9488
3325 | INY
3326 | LDA ROBOT_FACE,Y
3327 | STA $9489
3328 | RTS
3329 | DIFF_LEVEL !BYTE 01 ;default is medium
3330 |
3331 | ROBOT_FACE:
3332 | !BYTE $3A,$43,$49,$55,$43,$3A,$49,$55,$06,$01,$01,$01,$01,$06 ;EASY LEVEL
3333 | !BYTE $40,$40,$6E,$70,$40,$40,$49,$55,$01,$01,$01,$01,$01,$01 ;MEDIUM LEVEL
3334 | !BYTE $3A,$4D,$3A,$3A,$4E,$3A,$4D,$4E,$02,$01,$02,$02,$01,$02 ;HARD LEVEL
3335 | FACE_LEVEL:
3336 | !BYTE 0,14,28
3337 |
3338 | ;This routine is run after the map is loaded, but before the
3339 | ;game starts. If the diffulcty is set to normal, nothing
3340 | ;actually happens. But if it is set to easy or hard, then
3341 | ;some changes occur accordingly.
3342 | SET_DIFF_LEVEL:
3343 | LDA DIFF_LEVEL
3344 | CMP #0 ;easy
3345 | BNE SDLE1
3346 | JMP SET_DIFF_EASY
3347 | SDLE1: CMP #2 ;hard
3348 | BNE SDLE2
3349 | JMP SET_DIFF_HARD
3350 | SDLE2: RTS
3351 |
3352 | SET_DIFF_EASY:
3353 | ;Find all hidden items and double the quantity.
3354 | LDX #48
3355 | SDE1: LDA UNIT_TYPE,X
3356 | CMP #0
3357 | BEQ SDE2
3358 | CMP #128 ;KEY
3359 | BEQ SDE2
3360 | ASL UNIT_A,X ;item qty
3361 | SDE2: INX
3362 | CPX #64
3363 | BNE SDE1
3364 | RTS
3365 |
3366 | SET_DIFF_HARD:
3367 | ;Find all hoverbots and change AI
3368 | LDX #0
3369 | SDH1: LDA UNIT_TYPE,X
3370 | CMP #2 ;hoverbot left/right
3371 | BEQ SDH4
3372 | CMP #3 ;hoverbot up/down
3373 | BEQ SDH4
3374 | SDH2: INX
3375 | CPX #28
3376 | BNE SDH1
3377 | RTS
3378 | SDH4: LDA #4 ;hoverbot attack mode
3379 | STA UNIT_TYPE,X
3380 | JMP SDH2
3381 |
3382 | ;This chart contains the left-most staring position for each
3383 | ;row of tiles on the map-editor. 7 Rows.
3384 | MAP_CHART_L:
3385 | !BYTE $00,$4B,$96,$E1,$2C,$77,$C2
3386 |
3387 | MAP_CHART_H:
3388 | !BYTE $10,$10,$10,$10,$11,$11,$11
3389 |
3390 | ;This routine animates the tile #204 (water)
3391 | ;and also tile 148 (trash compactor)
3392 | ANIMATE_WATER:
3393 | LDA ANIMATE
3394 | CMP #1
3395 | BEQ AW00
3396 | RTS
3397 | AW00: INC WATER_TIMER
3398 | LDA WATER_TIMER
3399 | CMP #20
3400 | BEQ AW01
3401 | RTS
3402 | AW01: LDA #0
3403 | STA WATER_TIMER
3404 |
3405 | LDA TILE_DATA_BR+204
3406 | STA WATER_TEMP1
3407 | LDA TILE_DATA_MM+204
3408 | STA TILE_DATA_BR+204
3409 | STA TILE_DATA_BR+221
3410 | LDA TILE_DATA_TL+204
3411 | STA TILE_DATA_MM+204
3412 | LDA WATER_TEMP1
3413 | STA TILE_DATA_TL+204
3414 |
3415 | LDA TILE_DATA_BL+204
3416 | STA WATER_TEMP1
3417 | LDA TILE_DATA_MR+204
3418 | STA TILE_DATA_BL+204
3419 | STA TILE_DATA_BL+221
3420 | LDA TILE_DATA_TM+204
3421 | STA TILE_DATA_MR+204
3422 | LDA WATER_TEMP1
3423 | STA TILE_DATA_TM+204
3424 | STA TILE_DATA_TM+221
3425 |
3426 | LDA TILE_DATA_BM+204
3427 | STA WATER_TEMP1
3428 | LDA TILE_DATA_ML+204
3429 | STA TILE_DATA_BM+204
3430 | STA TILE_DATA_BM+221
3431 | LDA TILE_DATA_TR+204
3432 | STA TILE_DATA_ML+204
3433 | LDA WATER_TEMP1
3434 | STA TILE_DATA_TR+204
3435 | STA TILE_DATA_TR+221
3436 |
3437 | ;now do trash compactor
3438 | LDA TILE_COLOR_TR+148
3439 | STA WATER_TEMP1
3440 | LDA TILE_COLOR_TM+148
3441 | STA TILE_COLOR_TR+148
3442 | LDA TILE_COLOR_TL+148
3443 | STA TILE_COLOR_TM+148
3444 | LDA WATER_TEMP1
3445 | STA TILE_COLOR_TL+148
3446 |
3447 | LDA TILE_COLOR_MR+148
3448 | STA WATER_TEMP1
3449 | LDA TILE_COLOR_MM+148
3450 | STA TILE_COLOR_MR+148
3451 | LDA TILE_COLOR_ML+148
3452 | STA TILE_COLOR_MM+148
3453 | LDA WATER_TEMP1
3454 | STA TILE_COLOR_ML+148
3455 |
3456 | LDA TILE_COLOR_BR+148
3457 | STA WATER_TEMP1
3458 | LDA TILE_COLOR_BM+148
3459 | STA TILE_COLOR_BR+148
3460 | LDA TILE_COLOR_BL+148
3461 | STA TILE_COLOR_BM+148
3462 | LDA WATER_TEMP1
3463 | STA TILE_COLOR_BL+148
3464 |
3465 | ;Now do HVAC fan
3466 | LDA HVAC_STATE
3467 | CMP #0
3468 | BEQ HVAC1
3469 | LDA #$CD
3470 | STA TILE_DATA_MM+196
3471 | STA TILE_DATA_TL+201
3472 | LDA #$CE
3473 | STA TILE_DATA_ML+197
3474 | STA TILE_DATA_TM+200
3475 | LDA #$A0
3476 | STA TILE_DATA_MR+196
3477 | STA TILE_DATA_BM+196
3478 | STA TILE_DATA_BL+197
3479 | STA TILE_DATA_TR+200
3480 | LDA #0
3481 | STA HVAC_STATE
3482 | JMP HVAC2
3483 | HVAC1:
3484 | LDA #$A0
3485 | STA TILE_DATA_MM+196
3486 | STA TILE_DATA_TL+201
3487 | STA TILE_DATA_ML+197
3488 | STA TILE_DATA_TM+200
3489 | LDA #$C2
3490 | STA TILE_DATA_MR+196
3491 | STA TILE_DATA_TR+200
3492 | LDA #$C0
3493 | STA TILE_DATA_BM+196
3494 | STA TILE_DATA_BL+197
3495 | LDA #1
3496 | STA HVAC_STATE
3497 | HVAC2: ;now do cinema screen tiles
3498 | ; ;FIRST COPY OLD LETTERS TO THE LEFT.
3499 | ; LDA TILE_DATA_MR+20 ;#2
3500 | ; STA TILE_DATA_MM+20 ;#1
3501 | ; LDA TILE_DATA_ML+21 ;#3
3502 | ; STA TILE_DATA_MR+20 ;#2
3503 | ; LDA TILE_DATA_MM+21 ;#4
3504 | ; STA TILE_DATA_ML+21 ;#3
3505 | ; LDA TILE_DATA_MR+21 ;#5
3506 | ; STA TILE_DATA_MM+21 ;#4
3507 | ; LDA TILE_DATA_ML+22 ;#6
3508 | ; STA TILE_DATA_MR+21 ;#5
3509 | ; ;now insert new character.
3510 | ; LDY CINEMA_STATE
3511 | ; LDA CINEMA_MESSAGE,Y
3512 | ; STA TILE_DATA_ML+22 ;#6
3513 | ; INC CINEMA_STATE
3514 | ; LDA CINEMA_STATE
3515 | ; CMP #197
3516 | ; BNE CINE2
3517 | ; LDA #0
3518 | ; STA CINEMA_STATE
3519 | ;CINE2: ;Now animate light on server computers
3520 | ; LDA TILE_DATA_MR+143
3521 | ; CMP #$D7
3522 | ; BNE CINE3
3523 | ; LDA #$D1
3524 | ; JMP CINE4
3525 | ;CINE3: LDA #$D7
3526 | ;CINE4: STA TILE_DATA_MR+143
3527 | LDA #1
3528 | STA REDRAW_WINDOW
3529 | RTS
3530 | WATER_TIMER !BYTE 00
3531 | WATER_TEMP1 !BYTE 00
3532 | HVAC_STATE !BYTE 00
3533 | ;CINEMA_STATE !BYTE 00
3534 |
3535 | ;This is the routine that allows a person to select
3536 | ;a level and highlights the selection in the information
3537 | ;display. It is unique to each computer since it writes
3538 | ;to the screen directly.
3539 | ELEVATOR_SELECT:
3540 | JSR DRAW_MAP_WINDOW
3541 | LDX UNIT
3542 | LDA UNIT_D,X ;get max levels
3543 | STA ELEVATOR_MAX_FLOOR
3544 | ;Now draw available levels on screen
3545 | LDY #0
3546 | LDA #$31
3547 | ELS1: STA $125E,Y
3548 | CLC
3549 | ADC #01
3550 | INY
3551 | CPY ELEVATOR_MAX_FLOOR
3552 | BNE ELS1
3553 | LDA UNIT_C,X ;what level are we on now?
3554 | STA ELEVATOR_CURRENT_FLOOR
3555 | ;Now highlight current level
3556 | JSR ELEVATOR_INVERT
3557 | ;Now get user input
3558 | LDA CONTROL
3559 | CMP #2
3560 | BNE ELS5
3561 | JMP SELS5
3562 | ELS5: ;KEYBOARD INPUT
3563 | JSR $FFE4
3564 | CMP #$00
3565 | BEQ ELS5
3566 | CMP KEY_MOVE_LEFT
3567 | BNE ELS6
3568 | JSR ELEVATOR_DEC
3569 | JMP ELS5
3570 | ELS6: CMP KEY_MOVE_RIGHT
3571 | BNE ELS7
3572 | JSR ELEVATOR_INC
3573 | JMP ELS5
3574 | ELS7: CMP #$9D ;CURSOR LEFT
3575 | BNE ELS8
3576 | JSR ELEVATOR_DEC
3577 | JMP ELS5
3578 | ELS8: CMP #$1D ;CURSOR RIGHT
3579 | BNE ELS9
3580 | JSR ELEVATOR_INC
3581 | JMP ELS5
3582 | ELS9: CMP #$11 ;CURSOR DOWN
3583 | BNE ELS10
3584 | ELS9B: JSR SCROLL_INFO
3585 | JSR SCROLL_INFO
3586 | JSR SCROLL_INFO
3587 | JSR CLEAR_KEY_BUFFER
3588 | RTS
3589 | ELS10: CMP KEY_MOVE_DOWN
3590 | BEQ ELS9B
3591 | ELS11: JMP ELS5
3592 |
3593 | SELS5: ;SNES INPUT
3594 | JSR SNES_CONTROLER_READ
3595 | LDA NEW_LEFT
3596 | CMP #1
3597 | BNE SELS8
3598 | JSR ELEVATOR_DEC
3599 | LDA #0
3600 | STA NEW_LEFT
3601 | JMP SELS5
3602 | SELS8: LDA NEW_RIGHT
3603 | CMP #1
3604 | BNE SELS9
3605 | JSR ELEVATOR_INC
3606 | LDA #0
3607 | STA NEW_RIGHT
3608 | JMP SELS5
3609 | SELS9: LDA NEW_DOWN
3610 | CMP #1
3611 | BNE SELS10
3612 | JSR SCROLL_INFO
3613 | JSR SCROLL_INFO
3614 | JSR SCROLL_INFO
3615 | LDA #15
3616 | STA KEYTIMER
3617 | LDA #0
3618 | STA NEW_DOWN
3619 | RTS
3620 | SELS10: JMP SELS5
3621 |
3622 | ELEVATOR_MAX_FLOOR !BYTE 00
3623 | ELEVATOR_CURRENT_FLOOR !BYTE 00
3624 |
3625 | ELEVATOR_INVERT:
3626 | LDY ELEVATOR_CURRENT_FLOOR
3627 | LDA $125D,Y
3628 | EOR #%10000000
3629 | STA $125D,Y
3630 | RTS
3631 | ELEVATOR_INC:
3632 | LDA ELEVATOR_CURRENT_FLOOR
3633 | CMP ELEVATOR_MAX_FLOOR
3634 | BNE ELVIN1
3635 | RTS
3636 | ELVIN1: JSR ELEVATOR_INVERT
3637 | INC ELEVATOR_CURRENT_FLOOR
3638 | JSR ELEVATOR_INVERT
3639 | JSR ELEVATOR_FIND_XY
3640 | RTS
3641 | ELEVATOR_DEC:
3642 | LDA ELEVATOR_CURRENT_FLOOR
3643 | CMP #1
3644 | BNE ELVDE1
3645 | RTS
3646 | ELVDE1: JSR ELEVATOR_INVERT
3647 | DEC ELEVATOR_CURRENT_FLOOR
3648 | JSR ELEVATOR_INVERT
3649 | JSR ELEVATOR_FIND_XY
3650 | RTS
3651 |
3652 | ELEVATOR_FIND_XY:
3653 | LDX #32 ;start of doors
3654 | ELXY1: LDA UNIT_TYPE,X
3655 | CMP #19 ;elevator
3656 | BNE ELXY5
3657 | LDA UNIT_C,X
3658 | CMP ELEVATOR_CURRENT_FLOOR
3659 | BNE ELXY5
3660 | JMP ELXY10
3661 | ELXY5: INX
3662 | CPX #48
3663 | BNE ELXY1
3664 | RTS
3665 | ELXY10: LDA UNIT_LOC_X,X ;new elevator location
3666 | STA UNIT_LOC_X ;player location
3667 | SEC
3668 | SBC #3
3669 | STA MAP_WINDOW_X
3670 | LDA UNIT_LOC_Y,X ;new elevator location
3671 | STA UNIT_LOC_Y ;player location
3672 | DEC UNIT_LOC_Y
3673 | SEC
3674 | SBC #4
3675 | STA MAP_WINDOW_Y
3676 | JSR DRAW_MAP_WINDOW
3677 | LDA #17 ;elevator sound
3678 | JSR PLAY_SOUND ;SOUND PLAY
3679 | RTS
3680 |
3681 | SET_CONTROLS:
3682 | LDA CONTROL
3683 | CMP #1 ;alternate keyset
3684 | BNE SETC1
3685 | LDY #0
3686 | SETC3: LDA ALTERNATE_CONTROLS,Y
3687 | STA KEY_MOVE_UP,Y
3688 | INY
3689 | CPY #13
3690 | BNE SETC3
3691 | RTS
3692 | SETC1: ;load standard values for key controls
3693 | LDY #0
3694 | SETC2: LDA STANDARD_CONTROLS,Y
3695 | STA KEY_MOVE_UP,Y
3696 | INY
3697 | CPY #13
3698 | BNE SETC2
3699 | RTS
3700 |
3701 | ;This is technically part of a background routine, but it has to
3702 | ;be here in the main code because the screen effects are unique
3703 | ;to each system.
3704 | DEMATERIALIZE:
3705 | LDX UNIT
3706 | LDA UNIT_TIMER_B,X
3707 | AND #%00000001
3708 | CLC
3709 | ADC #160 ;dematerialize tile
3710 | STA UNIT_TILE
3711 | LDA UNIT_TIMER_B,X
3712 | AND #%00001000
3713 | LSR
3714 | LSR
3715 | LSR
3716 | ADC UNIT_TILE
3717 | STA UNIT_TILE
3718 | INC UNIT_TIMER_B,X
3719 | LDA UNIT_TIMER_B,X
3720 | CMP #%00010000
3721 | BEQ DEMA1
3722 | LDA #1
3723 | STA UNIT_TIMER_A,X
3724 | LDA #1
3725 | STA REDRAW_WINDOW
3726 | JMP AILP
3727 | DEMA1: ;TRANSPORT COMPLETE
3728 | LDA UNIT_B,X
3729 | CMP #1 ;transport somewhere
3730 | BEQ DEMA2
3731 | LDA #2 ;this means game over condition
3732 | STA UNIT_TYPE ;player type
3733 | LDA #7 ;Normal transporter pad
3734 | STA UNIT_TYPE,X
3735 | JMP AILP
3736 | DEMA2: LDA #97
3737 | STA UNIT_TILE
3738 | LDA UNIT_C,X ;target X coordinates
3739 | STA UNIT_LOC_X
3740 | LDA UNIT_D,X ;target Y coordinates
3741 | STA UNIT_LOC_Y
3742 | LDA #7 ;Normal transporter pad
3743 | STA UNIT_TYPE,X
3744 | JSR CACULATE_AND_REDRAW
3745 | JMP AILP
3746 |
3747 | STANDARD_CONTROLS:
3748 | !BYTE 73 ;MOVE UP
3749 | !BYTE 75 ;MOVE DOWN
3750 | !BYTE 74 ;MOVE LEFT
3751 | !BYTE 76 ;MOVE RIGHT
3752 | !BYTE 87 ;FIRE UP
3753 | !BYTE 83 ;FIRE DOWN
3754 | !BYTE 65 ;FIRE LEFT
3755 | !BYTE 68 ;FIRE RIGHT
3756 | !BYTE 133 ;CYCLE WEAPONS
3757 | !BYTE 134 ;CYCLE ITEMS
3758 | !BYTE 32 ;USE ITEM
3759 | !BYTE 90 ;SEARCH OBEJCT
3760 | !BYTE 77 ;MOVE OBJECT
3761 |
3762 | ALTERNATE_CONTROLS:
3763 | !BYTE 87 ;MOVE UP
3764 | !BYTE 83 ;MOVE DOWN
3765 | !BYTE 65 ;MOVE LEFT
3766 | !BYTE 68 ;MOVE RIGHT
3767 | !BYTE 73 ;FIRE UP
3768 | !BYTE 75 ;FIRE DOWN
3769 | !BYTE 74 ;FIRE LEFT
3770 | !BYTE 76 ;FIRE RIGHT
3771 | !BYTE 133 ;CYCLE WEAPONS
3772 | !BYTE 134 ;CYCLE ITEMS
3773 | !BYTE 32 ;USE ITEM
3774 | !BYTE 90 ;SEARCH OBEJCT
3775 | !BYTE 77 ;MOVE OBJECT
3776 |
3777 | TOGGLE_MUSIC:
3778 | LDA MUSIC_STATE
3779 | CMP #0
3780 | BEQ TMU1
3781 | LDA #0
3782 | STA MUSIC_STATE
3783 | JSR PEST_SOUND+$0F
3784 | RTS
3785 | TMU1: LDA #1
3786 | STA MUSIC_STATE
3787 | JSR PEST_SOUND+$0C
3788 | RTS
3789 |
3790 | ANIMATE_PLAYER:
3791 | LDA PLAYER_ANI
3792 | CMP #0
3793 | BEQ PANI1
3794 | LDA #0
3795 | STA PLAYER_ANI
3796 | JMP PANI2
3797 | PANI1: LDA #56
3798 | STA PLAYER_ANI
3799 | PANI2: LDX #0
3800 | LDY PLAYER_ANI
3801 | LDA PLAYER_DIR
3802 | CMP #0
3803 | BEQ APU1
3804 | CMP #1
3805 | BEQ APD1
3806 | CMP #2
3807 | BEQ APL1
3808 | JMP APR1
3809 | APU1: LDA PLAYER_UP_1A,Y
3810 | STA $1400+$0480,X
3811 | LDA PLAYER_UP_1B,Y
3812 | STA $1400+$0488,X
3813 | LDA PLAYER_UP_1C,Y
3814 | STA $1400+$04C0,X
3815 | LDA PLAYER_UP_1D,Y
3816 | STA $1400+$04D8,X
3817 | LDA PLAYER_UP_1E,Y
3818 | STA $1400+$04E0,X
3819 | LDA PLAYER_UP_1F,Y
3820 | STA $1400+$04E8,X
3821 | LDA PLAYER_UP_1G,Y
3822 | STA $1400+$0510,X
3823 | INY
3824 | INX
3825 | CPX #8
3826 | BNE APU1
3827 | RTS
3828 | APD1: LDA PLAYER_DOWN_1A,Y
3829 | STA $1400+$0480,X
3830 | LDA PLAYER_DOWN_1B,Y
3831 | STA $1400+$0488,X
3832 | LDA PLAYER_DOWN_1C,Y
3833 | STA $1400+$04C0,X
3834 | LDA PLAYER_DOWN_1D,Y
3835 | STA $1400+$04D8,X
3836 | LDA PLAYER_DOWN_1E,Y
3837 | STA $1400+$04E0,X
3838 | LDA PLAYER_DOWN_1F,Y
3839 | STA $1400+$04E8,X
3840 | LDA PLAYER_DOWN_1G,Y
3841 | STA $1400+$0510,X
3842 | INY
3843 | INX
3844 | CPX #8
3845 | BNE APD1
3846 | RTS
3847 | APL1: LDA PLAYER_LEFT_1A,Y
3848 | STA $1400+$0480,X
3849 | LDA PLAYER_LEFT_1B,Y
3850 | STA $1400+$0488,X
3851 | LDA PLAYER_LEFT_1C,Y
3852 | STA $1400+$04C0,X
3853 | LDA PLAYER_LEFT_1D,Y
3854 | STA $1400+$04D8,X
3855 | LDA PLAYER_LEFT_1E,Y
3856 | STA $1400+$04E0,X
3857 | LDA PLAYER_LEFT_1F,Y
3858 | STA $1400+$04E8,X
3859 | LDA PLAYER_LEFT_1G,Y
3860 | STA $1400+$0510,X
3861 | INY
3862 | INX
3863 | CPX #8
3864 | BNE APL1
3865 | RTS
3866 | APR1: LDA PLAYER_RIGHT_1A,Y
3867 | STA $1400+$0480,X
3868 | LDA PLAYER_RIGHT_1B,Y
3869 | STA $1400+$0488,X
3870 | LDA PLAYER_RIGHT_1C,Y
3871 | STA $1400+$04C0,X
3872 | LDA PLAYER_RIGHT_1D,Y
3873 | STA $1400+$04D8,X
3874 | LDA PLAYER_RIGHT_1E,Y
3875 | STA $1400+$04E0,X
3876 | LDA PLAYER_RIGHT_1F,Y
3877 | STA $1400+$04E8,X
3878 | LDA PLAYER_RIGHT_1G,Y
3879 | STA $1400+$0510,X
3880 | INY
3881 | INX
3882 | CPX #8
3883 | BNE APR1
3884 | RTS
3885 | ;CHARACTER $90,$91,$98,$9B,$9C,$9D,$A2
3886 |
3887 | !SOURCE "BACKGROUND_TASKS.ASM"
3888 |
3889 | ;These are the included binary files that contain the screen
3890 | ;image for the main editor.
3891 | SCR_TEXT:
3892 | !BYTE $60, $20, $14, $5D, $17, $10, $0E, $60, $20, $14, $5D, $60, $20, $02, $60
3893 | !BYTE $20, $14, $5D, $60, $20, $02, $60, $20, $14, $5D, $60, $20, $02, $60, $20
3894 | !BYTE $14, $5D, $60, $20, $02, $60, $20, $14, $5D, $60, $20, $02, $60, $20, $14
3895 | !BYTE $6B, $60, $40, $02, $60, $20, $14, $5D, $09, $14, $0D, $60, $20, $14, $5D
3896 | !BYTE $60, $20, $02, $60, $20, $14, $5D, $60, $20, $02, $60, $20, $14, $5D, $60
3897 | !BYTE $20, $02, $60, $20, $14, $5D, $60, $20, $02, $60, $20, $14, $5D, $60, $20
3898 | !BYTE $02, $60, $20, $14, $6B, $60, $40, $02, $60, $20, $14, $5D, $0B, $05, $19
3899 | !BYTE $60, $20, $14, $5D, $60, $20, $02, $60, $20, $14, $5D, $60, $20, $02, $60
3900 | !BYTE $20, $14, $6B, $60, $40, $02, $60, $20, $14, $5D, $60, $20, $02, $60, $20
3901 | !BYTE $14, $5D, $60, $20, $02, $60, $20, $14, $5D, $60, $20, $02, $73, $09, $0E
3902 | !BYTE $06, $0F, $6B, $60, $40, $0B, $72, $40, $40, $71, $60, $40, $02, $60, $20
3903 | !BYTE $11, $5D, $08, $05, $01, $0C, $14, $08, $60, $20, $11, $5D, $60, $20, $17
3904 | !BYTE $5D, $60, $71, $05, $22
3905 |
3906 | SCR_COLOR:
3907 | !BYTE $60, $11, $FF, $60, $11, $A6, $12, $15, $60, $11, $7C, $60, $15, $11
3908 | !BYTE $60, $11, $06, $60, $15, $11, $60, $11, $06, $60, $15, $11, $11, $12, $12
3909 | !BYTE $17, $17, $15, $15
3910 |
3911 | ;These are the included binary files that contain the screen
3912 | ;image for the main editor.
3913 | INTRO_TEXT:
3914 | !BYTE $20, $0D, $01, $10, $60, $20, $03, $E9, $CE, $20, $20, $E9, $CE, $60, $20
3915 | !BYTE $02, $13, $14, $01, $12, $14, $60, $20, $02, $20, $30, $30, $31, $60, $20
3916 | !BYTE $03, $66, $A0, $20, $20, $66, $A0, $60, $20, $02, $0D, $01, $10, $20, $13
3917 | !BYTE $05, $0C, $60, $20, $07, $E9, $66, $CE, $A0, $A0, $66, $CE, $CE, $20, $20
3918 | !BYTE $13, $0B, $09, $0C, $0C, $60, $20, $08, $E9, $A0, $E3, $60, $A0, $02, $E3
3919 | !BYTE $60, $CE, $02, $20, $03, $0F, $0E, $14, $12, $0F, $0C, $13, $60, $20, $04
3920 | !BYTE $E9, $60, $66, $06, $CE, $CE, $A0, $60, $20, $0D, $66, $3A, $43, $49, $3A
3921 | !BYTE $55, $43, $3A, $66, $A0, $A0, $60, $20, $02, $E9, $CE, $20, $20, $E9, $CE
3922 | !BYTE $60, $20, $04, $66, $55, $43, $49, $3A, $55, $43, $49, $66, $A0, $A0, $60
3923 | !BYTE $20, $02, $66, $A0, $20, $20, $66, $A0, $60, $20, $04, $66, $42, $51, $48
3924 | !BYTE $3A, $42, $51, $48, $66, $A0, $69, $60, $20, $02, $66, $A0, $20, $20, $66
3925 | !BYTE $A0, $60, $20, $04, $66, $4A, $46, $4B, $3A, $4A, $46, $4B, $66, $CE, $60
3926 | !BYTE $20, $03, $66, $CE, $A0, $A0, $66, $A0, $60, $20, $05, $60, $66, $06, $A0
3927 | !BYTE $A0, $60, $20, $03, $60, $66, $04, $69, $60, $20, $05, $66, $60, $D0, $04
3928 | !BYTE $66, $A0, $A0, $60, $20, $05, $66, $A0, $20, $20, $60, $43, $05, $66, $60
3929 | !BYTE $D0, $04, $66, $A0, $69, $60, $43, $05, $66, $A0, $43, $43, $60, $3A, $05
3930 | !BYTE $60, $66, $06, $CE, $A0, $A0, $CE, $60, $3A, $03, $66, $A0, $60, $3A, $07
3931 | !BYTE $E9, $A0, $A0, $E7, $D0, $CE, $60, $A0, $02, $CE, $A0, $60, $3A, $03, $66
3932 | !BYTE $A0, $60, $3A, $06, $E9, $60, $A0, $03, $E3, $60, $A0, $02, $CE, $A0, $A0
3933 | !BYTE $60, $3A, $03, $66, $A0, $60, $3A, $02, $E9, $CE, $DF, $3A, $60, $66, $08
3934 | !BYTE $D5, $C0, $C9, $60, $3A, $03, $66, $CE, $DF, $3A, $E9, $A0, $CD, $CE, $A0
3935 | !BYTE $66, $51, $60, $66, $04, $51, $66, $DD, $CE, $E3, $60, $A0, $02, $CE, $A0
3936 | !BYTE $CD, $CE, $3A, $A0, $D1, $E7, $60, $66, $0A, $DD, $60, $66, $04, $A0, $D1
3937 | !BYTE $E7, $69, $3A, $5F, $A0, $CE, $3A, $3A, $60, $66, $08, $CA, $C0, $CB, $60
3938 | !BYTE $3A, $02, $5F, $E4, $69, $3A, $3A, $E9, $A0, $A0, $CE, $3A, $E9, $A0, $A0
3939 | !BYTE $CE, $E9, $A0, $CE, $3A, $E9, $A0, $A0, $CE, $E9, $A0, $A0, $CE, $E9, $A0
3940 | !BYTE $A0, $CE, $60, $66, $02, $CE, $CE, $60, $66, $02, $A0, $66, $66, $CE, $CE
3941 | !BYTE $60, $66, $02, $A0, $60, $66, $02, $69, $60, $66, $02, $69, $66, $CE, $A0
3942 | !BYTE $66, $CE, $66, $A0, $66, $A0, $66, $CE, $66, $69, $66, $A0, $66, $A0, $3A
3943 | !BYTE $66, $A0, $3A, $66, $CE, $A0, $CE, $60, $66, $02, $CE, $CE, $66, $A0, $66
3944 | !BYTE $A0, $66, $66, $CE, $CE, $66, $A0, $66, $A0, $3A, $66, $A0, $3A, $60, $66
3945 | !BYTE $02, $A0, $66, $A0, $3A, $66, $A0, $66, $CE, $66, $A0, $66, $CE, $66, $69
3946 | !BYTE $66, $CE, $66, $A0, $3A, $66, $A0, $3A, $3A, $E9, $66, $A0, $66, $69, $3A
3947 | !BYTE $66, $69, $60, $66, $02, $69, $66, $66, $69, $3A, $60, $66, $02, $69, $3A
3948 | !BYTE $66, $69, $3A, $60, $66, $02, $69
3949 |
3950 | INTRO_COLOR:
3951 | !BYTE $60, $25, $03, $60, $21, $03, $23, $23, $21, $21, $23, $23, $60, $21, $02
3952 | !BYTE $60, $25, $0B, $60, $21, $02, $2C, $22, $23, $21, $21, $22, $23, $60, $21
3953 | !BYTE $02, $60, $25, $09, $60, $21, $04, $23, $22, $60, $23, $02, $22, $23, $23
3954 | !BYTE $21, $21, $60, $25, $09, $60, $21, $03, $60, $23, $09, $21, $60, $25, $09
3955 | !BYTE $60, $21, $02, $23, $60, $22, $06, $60, $23, $02, $60, $21, $08, $25, $25
3956 | !BYTE $60, $21, $02, $22, $26, $21, $21, $22, $21, $21, $26, $22, $23, $23, $60
3957 | !BYTE $21, $02, $23, $23, $21, $21, $23, $23, $25, $25, $60, $21, $02, $22, $60
3958 | !BYTE $21, $02, $22, $60, $21, $02, $22, $23, $23, $60, $21, $02, $22, $23, $21
3959 | !BYTE $21, $22, $23, $25, $60, $21, $03, $22, $21, $22, $21, $22, $21, $22, $21
3960 | !BYTE $22, $23, $23, $60, $21, $02, $22, $23, $21, $23, $22, $23, $25, $60, $21
3961 | !BYTE $03, $22, $60, $21, $02, $22, $60, $21, $02, $22, $23, $2C, $60, $21, $02
3962 | !BYTE $22, $60, $23, $02, $22, $23, $60, $25, $04, $21, $60, $22, $06, $23, $23
3963 | !BYTE $60, $21, $03, $60, $22, $04, $23, $60, $21, $05, $22, $60, $21, $04, $22
3964 | !BYTE $23, $23, $60, $21, $05, $22, $23, $21, $21, $60, $26, $05, $22, $60, $21
3965 | !BYTE $04, $22, $23, $23, $60, $26, $05, $22, $23, $60, $26, $07, $60, $22, $06
3966 | !BYTE $60, $23, $03, $60, $26, $03, $22, $23, $60, $26, $07, $60, $23, $03, $28
3967 | !BYTE $60, $23, $05, $60, $26, $03, $22, $23, $60, $26, $06, $60, $23, $0B, $60
3968 | !BYTE $26, $03, $22, $23, $60, $26, $02, $60, $23, $02, $26, $60, $22, $08, $60
3969 | !BYTE $23, $02, $60, $26, $03, $22, $23, $23, $26, $60, $23, $04, $22, $21, $60
3970 | !BYTE $22, $04, $21, $22, $60, $23, $09, $26, $60, $23, $02, $60, $22, $0A, $23
3971 | !BYTE $60, $22, $04, $60, $23, $03, $26, $60, $23, $02, $26, $26, $60, $22, $08
3972 | !BYTE $60, $23, $02, $60, $26, $02, $60, $23, $02, $60, $26, $1A, $60, $21, $02
3973 | !BYTE $26, $26, $60, $21, $02, $26, $21, $21, $26, $26, $60, $21, $02, $26, $60
3974 | !BYTE $21, $02, $26, $60, $21, $02, $26, $21, $26, $26, $21, $26, $21, $26, $21
3975 | !BYTE $26, $21, $26, $21, $26, $21, $26, $21, $26, $26, $21, $26, $26, $21, $60
3976 | !BYTE $26, $02, $60, $21, $02, $26, $26, $21, $26, $21, $26, $21, $21, $26, $26
3977 | !BYTE $21, $26, $21, $26, $26, $21, $26, $26, $60, $21, $02, $26, $21, $26, $26
3978 | !BYTE $21, $26, $21, $26, $21, $26, $21, $26, $21, $26, $21, $26, $21, $26, $26
3979 | !BYTE $21, $60, $26, $03, $21, $26, $21, $26, $26, $21, $26, $60, $21, $02, $26
3980 | !BYTE $21, $21, $26, $26, $60, $21, $02, $26, $26, $21, $26, $26, $60, $21, $02
3981 | !BYTE $26
3982 |
3983 | SCR_ENDGAME:
3984 | !BYTE $55, $60, $40, $03, $73, $16, $09, $03, $2D, $32, $30, $20, $12, $0F, $02
3985 | !BYTE $0F, $14, $13, $6B, $60, $40, $03, $49, $5D, $60, $20, $16, $5D, $5D, $60
3986 | !BYTE $20, $16, $5D, $5D, $60, $20, $16, $5D, $5D, $60, $20, $16, $5D, $5D, $60
3987 | !BYTE $20, $16, $5D, $5D, $60, $20, $16, $5D, $5D, $60, $20, $06, $13, $03, $05
3988 | !BYTE $0E, $01, $12, $09, $0F, $60, $20, $07, $5D, $5D, $60, $20, $16, $5D, $5D
3989 | !BYTE $60, $20, $16, $5D, $5D, $60, $20, $10
3990 | !BYTE $60, $20, $05, $5D, $5D, $60, $20, $16, $5D, $5D
3991 | !BYTE $60, $20, $16, $5D, $5D, $60, $20, $02, $12, $0F, $02, $0F, $14, $13, $20
3992 | !BYTE $12, $05, $0D, $01, $09, $0E, $09, $0E, $07, $60, $20, $03, $5D, $5D, $60
3993 | !BYTE $20, $16, $5D, $5D, $60, $20, $16, $5D, $5D, $60, $20, $02, $13, $05, $03
3994 | !BYTE $12, $05, $14, $13, $20, $12, $05, $0D, $01, $09, $0E, $09, $0E, $07, $60
3995 | !BYTE $20, $02, $5D, $5D, $60, $20, $16, $5D, $5D, $60, $20, $16, $5D, $5D, $60
3996 | !BYTE $20, $16, $5D, $5D, $60, $20, $16, $5D, $5D, $60, $20, $16, $5D, $5D, $60
3997 | !BYTE $20, $16, $5D, $5D, $60, $20, $16, $5D, $4A, $60, $40, $16, $4B
3998 |
3999 | ;CINEMA_MESSAGE:
4000 | ; !SCR"coming soon: space balls 2 - the search for more money, "
4001 | ; !SCR"attack of the paperclips: clippy's revenge, "
4002 | ; !SCR"it came from planet earth, "
4003 | ; !SCR"rocky 5000, all my circuits the movie, "
4004 | ; !SCR"conan the librarian, and more! "
4005 |
4006 | ;Pistol (VIC-20)
4007 | PISTOL1A !BYTE $20,$20,$20
4008 | PISTOL1B !BYTE $E2,$F5,$F6
4009 | PISTOL1C !BYTE $20,$20,$F4
4010 | PISTOL1D !BYTE $20,$20,$20
4011 | ;Color for Blaster Gun (VIC-20)
4012 | PISTOL1E !BYTE $01,$01,$01
4013 | PISTOL1F !BYTE $05,$05,$05
4014 | PISTOL1G !BYTE $01,$01,$01
4015 | PISTOL1H !BYTE $01,$01,$01
4016 |
4017 | ;Blaster Gun (VIC-20)
4018 | WEAPON1A !BYTE $20,$20,$2c
4019 | WEAPON1B !BYTE $e2,$ef,$66
4020 | WEAPON1C !BYTE $20,$20,$F4
4021 | WEAPON1D !BYTE $20,$20,$20
4022 | ;Color for Blaster Gun (VIC-20)
4023 | WEAPON1E !BYTE $01,$01,$01
4024 | WEAPON1F !BYTE $03,$03,$06
4025 | WEAPON1G !BYTE $01,$01,$01
4026 | WEAPON1H !BYTE $01,$01,$01
4027 |
4028 | ;Time Bomb (VIC-20)
4029 | TBOMB1A !BYTE $20,$55,$2a
4030 | TBOMB1B !BYTE $55,$66,$49
4031 | TBOMB1C !BYTE $42,$20,$48
4032 | TBOMB1D !BYTE $4a,$46,$4b
4033 | ;Color for Time Bomb (VIC-20)
4034 | TBOMB1E !BYTE $01,$02,$07
4035 | TBOMB1F !BYTE $03,$03,$03
4036 | TBOMB1G !BYTE $03,$01,$03
4037 | TBOMB1H !BYTE $03,$03,$03
4038 |
4039 | ;EMP (VIC-20)
4040 | EMP1A !BYTE $55,$43,$49
4041 | EMP1B !BYTE $DF,$51,$E9
4042 | EMP1C !BYTE $69,$57,$5F
4043 | EMP1D !BYTE $4A,$46,$4B
4044 | ;Color for EMP (VIC-20)
4045 | EMP1E !BYTE $02,$02,$02
4046 | EMP1F !BYTE $03,$07,$03
4047 | EMP1G !BYTE $03,$07,$03
4048 | EMP1H !BYTE $02,$02,$02
4049 |
4050 | ;Magnet (VIC-20)
4051 | MAG1A !BYTE $4D,$20,$4E
4052 | MAG1B !BYTE $70,$E0,$6E
4053 | MAG1C !BYTE $42,$52,$48
4054 | MAG1D !BYTE $4A,$46,$4B
4055 | ;Color for EMP (VIC-20)
4056 | MAG1E !BYTE $01,$01,$01
4057 | MAG1F !BYTE $07,$07,$07
4058 | MAG1G !BYTE $02,$02,$02
4059 | MAG1H !BYTE $02,$02,$02
4060 |
4061 | ;Medkit (VIC-20)
4062 | MED1A !BYTE $55,$43,$49
4063 | MED1B !BYTE $A0,$A0,$A0
4064 | MED1C !BYTE $A0,$E1,$A0
4065 | MED1D !BYTE $E4,$E4,$E4
4066 | ;Color for Medkit (VIC-20)
4067 | MED1E !BYTE $01,$01,$01
4068 | MED1F !BYTE $01,$01,$01
4069 | MED1G !BYTE $01,$01,$01
4070 | MED1H !BYTE $01,$01,$01
4071 |
4072 | ;****PLAYER TILE BITMAPS****
4073 | ;CHARACTER $90,$91,$98,$9B,$9C,$9D,$A2
4074 |
4075 | PLAYER_DOWN_1A: ;facing down step 1
4076 | !BYTE %00000000
4077 | !BYTE %00000000
4078 | !BYTE %00000000
4079 | !BYTE %00000000
4080 | !BYTE %00000111
4081 | !BYTE %00001111
4082 | !BYTE %00011111
4083 | !BYTE %00011111
4084 | PLAYER_DOWN_1B:
4085 | !BYTE %00000000
4086 | !BYTE %00000000
4087 | !BYTE %00000000
4088 | !BYTE %00000000
4089 | !BYTE %11000000
4090 | !BYTE %11100000
4091 | !BYTE %11100000
4092 | !BYTE %11101100
4093 | PLAYER_DOWN_1C:
4094 | !BYTE %00011111
4095 | !BYTE %00010111
4096 | !BYTE %00001000
4097 | !BYTE %00000100
4098 | !BYTE %00000011
4099 | !BYTE %00000011
4100 | !BYTE %00000001
4101 | !BYTE %00000001
4102 | PLAYER_DOWN_1D:
4103 | !BYTE %11100011
4104 | !BYTE %10100000
4105 | !BYTE %00100010
4106 | !BYTE %01000011
4107 | !BYTE %10000111
4108 | !BYTE %10011001
4109 | !BYTE %10000000
4110 | !BYTE %10100001
4111 | PLAYER_DOWN_1E:
4112 | !BYTE %00000000
4113 | !BYTE %10000000
4114 | !BYTE %01000000
4115 | !BYTE %10100000
4116 | !BYTE %01010000
4117 | !BYTE %10111000
4118 | !BYTE %10011000
4119 | !BYTE %11001000
4120 | PLAYER_DOWN_1F:
4121 | !BYTE %11010011
4122 | !BYTE %11001111
4123 | !BYTE %01000111
4124 | !BYTE %00000001
4125 | !BYTE %00000001
4126 | !BYTE %00000000
4127 | !BYTE %00000000
4128 | !BYTE %00000000
4129 | PLAYER_DOWN_1G:
4130 | !BYTE %11100000
4131 | !BYTE %01110000
4132 | !BYTE %10111000
4133 | !BYTE %10011100
4134 | !BYTE %10000110
4135 | !BYTE %00000110
4136 | !BYTE %00000000
4137 | !BYTE %00000000
4138 |
4139 | PLAYER_DOWN_2A: ;facing down step 2
4140 | !BYTE %00000000
4141 | !BYTE %00000000
4142 | !BYTE %00000000
4143 | !BYTE %00000000
4144 | !BYTE %00000111
4145 | !BYTE %00001111
4146 | !BYTE %00011111
4147 | !BYTE %00011111
4148 | PLAYER_DOWN_2B:
4149 | !BYTE %00000000
4150 | !BYTE %00000000
4151 | !BYTE %00000000
4152 | !BYTE %00000000
4153 | !BYTE %11000000
4154 | !BYTE %11100000
4155 | !BYTE %11100000
4156 | !BYTE %11100000
4157 | PLAYER_DOWN_2C:
4158 | !BYTE %00011111
4159 | !BYTE %00010111
4160 | !BYTE %00001000
4161 | !BYTE %00000100
4162 | !BYTE %00000111
4163 | !BYTE %00000011
4164 | !BYTE %00000000
4165 | !BYTE %00000000
4166 | PLAYER_DOWN_2D:
4167 | !BYTE %11101000
4168 | !BYTE %10100100
4169 | !BYTE %00100010
4170 | !BYTE %01000001
4171 | !BYTE %10001001
4172 | !BYTE %10111100
4173 | !BYTE %10000110
4174 | !BYTE %01000010
4175 | PLAYER_DOWN_2E:
4176 | !BYTE %00000000
4177 | !BYTE %00000000
4178 | !BYTE %00000000
4179 | !BYTE %00000000
4180 | !BYTE %00000000
4181 | !BYTE %10000000
4182 | !BYTE %10000000
4183 | !BYTE %11000000
4184 | PLAYER_DOWN_2F:
4185 | !BYTE %00100111
4186 | !BYTE %00011100
4187 | !BYTE %00011100
4188 | !BYTE %00001110
4189 | !BYTE %00001111
4190 | !BYTE %00000011
4191 | !BYTE %00000011
4192 | !BYTE %00000000
4193 | PLAYER_DOWN_2G:
4194 | !BYTE %11111000
4195 | !BYTE %01111000
4196 | !BYTE %00011000
4197 | !BYTE %00000000
4198 | !BYTE %00000000
4199 | !BYTE %00000000
4200 | !BYTE %00000000
4201 | !BYTE %00000000
4202 |
4203 | PLAYER_UP_1A: ;facing up step 1
4204 | !BYTE %00000000
4205 | !BYTE %00000000
4206 | !BYTE %00000000
4207 | !BYTE %00000000
4208 | !BYTE %00000111
4209 | !BYTE %00001110
4210 | !BYTE %00011111
4211 | !BYTE %00011111
4212 | PLAYER_UP_1B:
4213 | !BYTE %00000000
4214 | !BYTE %00000000
4215 | !BYTE %00000000
4216 | !BYTE %00000000
4217 | !BYTE %11000000
4218 | !BYTE %00100000
4219 | !BYTE %10010000
4220 | !BYTE %11010000
4221 | PLAYER_UP_1C:
4222 | !BYTE %00011111
4223 | !BYTE %00011111
4224 | !BYTE %00001111
4225 | !BYTE %00000111
4226 | !BYTE %00000011
4227 | !BYTE %00000011
4228 | !BYTE %00000001
4229 | !BYTE %00000000
4230 | PLAYER_UP_1D:
4231 | !BYTE %11111100
4232 | !BYTE %11110010
4233 | !BYTE %11100001
4234 | !BYTE %10000000
4235 | !BYTE %10000011
4236 | !BYTE %11000011
4237 | !BYTE %11100001
4238 | !BYTE %11110001
4239 | PLAYER_UP_1E:
4240 | !BYTE %00000000
4241 | !BYTE %00000000
4242 | !BYTE %00000000
4243 | !BYTE %10000000
4244 | !BYTE %01000000
4245 | !BYTE %10100000
4246 | !BYTE %11110000
4247 | !BYTE %11110000
4248 | PLAYER_UP_1F:
4249 | !BYTE %01111111
4250 | !BYTE %00011110
4251 | !BYTE %00001111
4252 | !BYTE %00000111
4253 | !BYTE %00000011
4254 | !BYTE %00000001
4255 | !BYTE %00000000
4256 | !BYTE %00000000
4257 | PLAYER_UP_1G:
4258 | !BYTE %11110000
4259 | !BYTE %11111000
4260 | !BYTE %11111000
4261 | !BYTE %10111000
4262 | !BYTE %10011000
4263 | !BYTE %10000000
4264 | !BYTE %00000000
4265 | !BYTE %00000000
4266 |
4267 | PLAYER_UP_2A: ;facing up step 2
4268 | !BYTE %00000000
4269 | !BYTE %00000000
4270 | !BYTE %00000000
4271 | !BYTE %00000000
4272 | !BYTE %00000111
4273 | !BYTE %00001110
4274 | !BYTE %00011111
4275 | !BYTE %00011111
4276 | PLAYER_UP_2B:
4277 | !BYTE %00000000
4278 | !BYTE %00000000
4279 | !BYTE %00000000
4280 | !BYTE %00000000
4281 | !BYTE %11000000
4282 | !BYTE %00100000
4283 | !BYTE %10010000
4284 | !BYTE %11010000
4285 | PLAYER_UP_2C:
4286 | !BYTE %00011111
4287 | !BYTE %00011111
4288 | !BYTE %00001111
4289 | !BYTE %00001111
4290 | !BYTE %00000111
4291 | !BYTE %00000111
4292 | !BYTE %00000011
4293 | !BYTE %00000011
4294 | PLAYER_UP_2D:
4295 | !BYTE %11111000
4296 | !BYTE %11110110
4297 | !BYTE %11100001
4298 | !BYTE %10000111
4299 | !BYTE %10000111
4300 | !BYTE %11000010
4301 | !BYTE %11000001
4302 | !BYTE %11100001
4303 | PLAYER_UP_2E:
4304 | !BYTE %00000000
4305 | !BYTE %00000000
4306 | !BYTE %10000000
4307 | !BYTE %01100000
4308 | !BYTE %11100000
4309 | !BYTE %00100000
4310 | !BYTE %00000000
4311 | !BYTE %00000000
4312 | PLAYER_UP_2F:
4313 | !BYTE %11110001
4314 | !BYTE %10111111
4315 | !BYTE %10011111
4316 | !BYTE %10000111
4317 | !BYTE %00000000
4318 | !BYTE %00000000
4319 | !BYTE %00000000
4320 | !BYTE %00000000
4321 | PLAYER_UP_2G:
4322 | !BYTE %10000000
4323 | !BYTE %11000000
4324 | !BYTE %11100000
4325 | !BYTE %11110000
4326 | !BYTE %01110000
4327 | !BYTE %00110000
4328 | !BYTE %00000000
4329 | !BYTE %00000000
4330 |
4331 | PLAYER_LEFT_1A: ;facing LEFT step 1
4332 | !BYTE %00000000
4333 | !BYTE %00000000
4334 | !BYTE %00000000
4335 | !BYTE %00000000
4336 | !BYTE %00000111
4337 | !BYTE %00001111
4338 | !BYTE %00011111
4339 | !BYTE %00011111
4340 | PLAYER_LEFT_1B:
4341 | !BYTE %00000000
4342 | !BYTE %00000000
4343 | !BYTE %00000000
4344 | !BYTE %00000000
4345 | !BYTE %10000000
4346 | !BYTE %11000000
4347 | !BYTE %11100000
4348 | !BYTE %11110000
4349 | PLAYER_LEFT_1C:
4350 | !BYTE %00010111
4351 | !BYTE %00010111
4352 | !BYTE %00010011
4353 | !BYTE %00001001
4354 | !BYTE %00000111
4355 | !BYTE %00000001
4356 | !BYTE %00000001
4357 | !BYTE %00000000
4358 | PLAYER_LEFT_1D:
4359 | !BYTE %11111100
4360 | !BYTE %11101110
4361 | !BYTE %11100111
4362 | !BYTE %11000011
4363 | !BYTE %10000001
4364 | !BYTE %00000000
4365 | !BYTE %10000000
4366 | !BYTE %10011000
4367 | PLAYER_LEFT_1E:
4368 | !BYTE %00000000
4369 | !BYTE %00000000
4370 | !BYTE %00000000
4371 | !BYTE %10000000
4372 | !BYTE %11000000
4373 | !BYTE %10000000
4374 | !BYTE %11000000
4375 | !BYTE %11000000
4376 | PLAYER_LEFT_1F:
4377 | !BYTE %11001101
4378 | !BYTE %01111111
4379 | !BYTE %00111111
4380 | !BYTE %00011101
4381 | !BYTE %00001110
4382 | !BYTE %00000000
4383 | !BYTE %00000000
4384 | !BYTE %00000000
4385 | PLAYER_LEFT_1G:
4386 | !BYTE %11100000
4387 | !BYTE %01100000
4388 | !BYTE %10000000
4389 | !BYTE %11000000
4390 | !BYTE %11100000
4391 | !BYTE %11110000
4392 | !BYTE %11110000
4393 | !BYTE %00000000
4394 |
4395 | PLAYER_LEFT_2A: ;facing LEFT step 2
4396 | !BYTE %00000000
4397 | !BYTE %00000000
4398 | !BYTE %00000000
4399 | !BYTE %00000000
4400 | !BYTE %00000111
4401 | !BYTE %00001111
4402 | !BYTE %00011111
4403 | !BYTE %00011111
4404 | PLAYER_LEFT_2B:
4405 | !BYTE %00000000
4406 | !BYTE %00000000
4407 | !BYTE %00000000
4408 | !BYTE %00000000
4409 | !BYTE %10000000
4410 | !BYTE %11000000
4411 | !BYTE %11100000
4412 | !BYTE %11111000
4413 | PLAYER_LEFT_2C:
4414 | !BYTE %00010111
4415 | !BYTE %00010111
4416 | !BYTE %00010011
4417 | !BYTE %00001001
4418 | !BYTE %00000111
4419 | !BYTE %00000000
4420 | !BYTE %00000000
4421 | !BYTE %00000000
4422 | PLAYER_LEFT_2D:
4423 | !BYTE %11111100
4424 | !BYTE %11101110
4425 | !BYTE %11100010
4426 | !BYTE %11000001
4427 | !BYTE %10000000
4428 | !BYTE %11001100
4429 | !BYTE %01100110
4430 | !BYTE %01110011
4431 | PLAYER_LEFT_2E:
4432 | !BYTE %00000000
4433 | !BYTE %00000000
4434 | !BYTE %00000000
4435 | !BYTE %00000000
4436 | !BYTE %10000000
4437 | !BYTE %11000000
4438 | !BYTE %11100000
4439 | !BYTE %11111000
4440 | PLAYER_LEFT_2F:
4441 | !BYTE %00111111
4442 | !BYTE %00011111
4443 | !BYTE %00011100
4444 | !BYTE %00011100
4445 | !BYTE %00001111
4446 | !BYTE %00001111
4447 | !BYTE %00000000
4448 | !BYTE %00000000
4449 | PLAYER_LEFT_2G:
4450 | !BYTE %01111000
4451 | !BYTE %00000000
4452 | !BYTE %00000000
4453 | !BYTE %10000000
4454 | !BYTE %00000000
4455 | !BYTE %00000000
4456 | !BYTE %00000000
4457 | !BYTE %00000000
4458 |
4459 | PLAYER_RIGHT_1A: ;facing RIGHT step 1
4460 | !BYTE %00000000
4461 | !BYTE %00000000
4462 | !BYTE %00000000
4463 | !BYTE %00000000
4464 | !BYTE %00000111
4465 | !BYTE %00001111
4466 | !BYTE %00011111
4467 | !BYTE %00011111
4468 | PLAYER_RIGHT_1B:
4469 | !BYTE %00000000
4470 | !BYTE %00000000
4471 | !BYTE %00000000
4472 | !BYTE %00000000
4473 | !BYTE %10000000
4474 | !BYTE %11000000
4475 | !BYTE %10100000
4476 | !BYTE %10011000
4477 | PLAYER_RIGHT_1C:
4478 | !BYTE %00011111
4479 | !BYTE %00011111
4480 | !BYTE %00001111
4481 | !BYTE %00000111
4482 | !BYTE %00000011
4483 | !BYTE %00000011
4484 | !BYTE %00000011
4485 | !BYTE %00000001
4486 | PLAYER_RIGHT_1D:
4487 | !BYTE %10010111
4488 | !BYTE %10010001
4489 | !BYTE %00100101
4490 | !BYTE %11000110
4491 | !BYTE %10000101
4492 | !BYTE %10000000
4493 | !BYTE %11000000
4494 | !BYTE %11110001
4495 | PLAYER_RIGHT_1E:
4496 | !BYTE %00000000
4497 | !BYTE %10000000
4498 | !BYTE %11000000
4499 | !BYTE %00000000
4500 | !BYTE %00000000
4501 | !BYTE %10000000
4502 | !BYTE %11000000
4503 | !BYTE %11110000
4504 | PLAYER_RIGHT_1F:
4505 | !BYTE %11111011
4506 | !BYTE %11101111
4507 | !BYTE %01110011
4508 | !BYTE %00111000
4509 | !BYTE %00011100
4510 | !BYTE %00001110
4511 | !BYTE %00000000
4512 | !BYTE %00000000
4513 | PLAYER_RIGHT_1G:
4514 | !BYTE %01110000
4515 | !BYTE %10000000
4516 | !BYTE %11000000
4517 | !BYTE %11100000
4518 | !BYTE %01111000
4519 | !BYTE %00111000
4520 | !BYTE %00000000
4521 | !BYTE %00000000
4522 |
4523 | PLAYER_RIGHT_2A: ;facing RIGHT step 2
4524 | !BYTE %00000000
4525 | !BYTE %00000000
4526 | !BYTE %00000000
4527 | !BYTE %00000000
4528 | !BYTE %00000111
4529 | !BYTE %00001111
4530 | !BYTE %00011111
4531 | !BYTE %00011111
4532 | PLAYER_RIGHT_2B:
4533 | !BYTE %00000000
4534 | !BYTE %00000000
4535 | !BYTE %00000000
4536 | !BYTE %00000000
4537 | !BYTE %10000000
4538 | !BYTE %11000000
4539 | !BYTE %10100000
4540 | !BYTE %10010000
4541 | PLAYER_RIGHT_2C:
4542 | !BYTE %00011111
4543 | !BYTE %00011111
4544 | !BYTE %00001111
4545 | !BYTE %00000111
4546 | !BYTE %00000011
4547 | !BYTE %00000001
4548 | !BYTE %00000000
4549 | !BYTE %00000000
4550 | PLAYER_RIGHT_2D:
4551 | !BYTE %10010000
4552 | !BYTE %10010100
4553 | !BYTE %00100110
4554 | !BYTE %11000001
4555 | !BYTE %11000000
4556 | !BYTE %11100000
4557 | !BYTE %11111001
4558 | !BYTE %01111111
4559 | PLAYER_RIGHT_2E:
4560 | !BYTE %00000000
4561 | !BYTE %00000000
4562 | !BYTE %00000000
4563 | !BYTE %00000000
4564 | !BYTE %11000000
4565 | !BYTE %11110000
4566 | !BYTE %11111100
4567 | !BYTE %00011100
4568 | PLAYER_RIGHT_2F:
4569 | !BYTE %00111111
4570 | !BYTE %00001111
4571 | !BYTE %00000011
4572 | !BYTE %00000001
4573 | !BYTE %00000001
4574 | !BYTE %00000000
4575 | !BYTE %00000000
4576 | !BYTE %00000000
4577 | PLAYER_RIGHT_2G:
4578 | !BYTE %00000000
4579 | !BYTE %00000000
4580 | !BYTE %10000000
4581 | !BYTE %11000000
4582 | !BYTE %11000000
4583 | !BYTE %00000000
4584 | !BYTE %00000000
4585 | !BYTE %00000000
4586 |
4587 | ;*****Documentation for Alex Semenov's PEST sound system*******
4588 | ;+$00 pest_init:
4589 | ; Initialize sound system. Call it once when program starts.
4590 | ; Clears all variables, init hardware, set up timer IRQ (if required)
4591 | ; in: none
4592 | ; out: none
4593 | ;
4594 | ;+$03 pest_done
4595 | ; De-initialize sound system. It may be needed before disk operations, so I kept it here just in case.
4596 | ; Stop sound, restore timer IRQ (if required)
4597 | ; in: none
4598 | ; out: none
4599 | ;
4600 | ;+$06 pest_update
4601 | ; Update sound system state and produce sounds
4602 | ; Should be called 50 or 60 times per second, normally from frame interrupt
4603 | ; in: none
4604 | ; out: none
4605 | ;
4606 | ;+$09 pest_music_load
4607 | ; Load music data, initialize music player vars
4608 | ; in: X:A pointer to music data, can be located anywhere (music data is relocatable)
4609 | ; out: none
4610 | ;
4611 | ;+$0c pest_music_play
4612 | ; Start playing music from beginning
4613 | ; in: none
4614 | ; out: none
4615 | ;
4616 | ;+$0f pest_music_stop
4617 | ; Stop playing music
4618 | ; in: none
4619 | ; out: none
4620 | ;
4621 | ;+$12 pest_music_pause
4622 | ; Pause and resume music
4623 | ; in: A=0 unpause, !0 pause
4624 | ; out: none
4625 | ;
4626 | ;+$15 pest_sound_play
4627 | ; Request sound effect to be played
4628 | ; in: A sound effect number, 0..63
4629 | ; out: none
4630 | ;
4631 | ;+$18 pest_stop_all
4632 | ; Stop all sounds, including music and sound effect
4633 | ; in: none
4634 | ; out: none
4635 | ;
4636 | ;+$1b pest_detect_rate
4637 | ; Detect framerate (50/60Hz). Actual detection happens during pest_init, this is just a readback.
4638 | ; Used internally for music tempo compensation, can be used externally too
4639 | ; in: none
4640 | ; out: A=0 for 60Hz, !0 for 50Hz
4641 |
--------------------------------------------------------------------------------