-------------------------------------------------------------------------------
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Abuse FAQ v0.2.0 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>> Maintained by Mike Perry <<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>> mj-perry@ux4.cso.uiuc.edu <<<<<<<<<<<<<<<<<<<<<<<<<<
-------------------------------------------------------------------------------
Construction Note:
------------------
The construction of this FAQ is currently in progress. There are numerous
sections of the FAQ that have not been filled in yet. I have tried, in the
best of my ability, to provide enough information suffient for an initial
release of the FAQ that could be released in conjuction with the release
of the DOS beta of Abuse. If you find any glaring errors or information
that is incorrect, please mail me at the address at the end of the FAQ.
Introduction:
-------------
Hello and welcome to the first public release of the Abuse FAQ (v0.1.0).
This FAQ contains answers to (f)requently (a)sked (q)uestions about the
computer game Abuse. In actuality, most of the questions are not actual
questions that I have been asked but are questions that, if I were totally
new to the game, would want to have answers to. I have tried to provide
answers to questions that would be asked by newcomers, intermediate and
advanced players.
If you feel that there is a question or feature of the game that has not been
properly addressed, please e-mail me so that I can review your question for
possible inclusion into the FAQ. If you already have the answers (or a good
description of the feature you want to have included) please mail those also.
Include your name and e-mail address so that I can give you proper credit.
If you happen to create a document pertaining to Abuse let me know and I will
add it to a list of supplementary documentation in the FAQ. And now prepare
to be abused.
Overview of Contents:
---------------------
Construction Note
Introduction
Overview of Contents
I. What is Abuse?
A. General Information
B. What is the Plot?
C. Who Wrote Abuse?
D. What Kind of Game is Abuse?
E. Was Abuse Written Entirely in Lisp?
F. How Long Did it Take to Develop Abuse?
II. Can You Tell Me a Little Bit More About Crack Dot Com?
III. Who and What Are the Main Characters/Objects in the Game?
A. Weapons and Ammo
B. Power-Ups
C. Health Boosters
D. Nick Vrenna
E. Enemies
F. Tricks, Traps, Harmful Objects and Other Interactive Objects
G. Scenery
IV. What are the Main Components That Comprise a Level?
V. Which Dialect of Lisp Does the Lisp Interpreter Implement?
VI. What Constructs are Missing From the Lisp Interpreter?
VII. What Multiplayer Abuse Variants Exist?
VIII. Where Can I Learn More About Level Editing and Game Alteration?
VIIII. What Channels Exist on IRC for Discussing Abuse?
X. What Newsgroups Exist for Discussing Abuse?
XI. What Mailing Lists Exist for Discussing Abuse?
XII. How Can I Get Abuse?
XIII. FAQ Change History
XIIII. Credits
Copyright Recognition
Disclaimer
I. What is Abuse?
------------------
A. General Information
Abuse is the first game to be released by the budding new computer
game company Crack Dot Com. Abuse is an action game that pits you --
assuming the role of Nick Vrenna, resistance fighter -- against ruthless
alien killers, called ants, that have taken control over humanity. The game
an engine that allows modification to the stock game through such means
as a built-in lisp interpreter, external game-object lisp code, a windowing
system, multiplayer support through IPX or TCP/IP protocols and network
file support.
B. What is the Plot?
Here is the plot from the finger info at help@crack.com:
The Ants were fearless, efficient killers. The Unified Underground's
only opening was that the Ant defense systems were designed by engineers
too arrogant to consider the threat of an individual. It was enough to
justify the covert Abuse Missions.
On August 31, 2021, eight bytes were zeroed in a computer, and Nick
Vrenna's identity was erased. A suit of armor cradling a smoking auto
rifle stood in shadows appreciating the stench coming from the first
retired Ant of the day. The armored soul feared the effort would end up
as pathetic as the Terran Surrender Terms, but humanity had nothing
else.
C. Who Wrote Abuse?
Abuse is engineered by the game company Crack Dot Com. The programmer behind
the game is Jonathan Clark. The artwork was created by Doung Dai Nguyen and
Murray Macmillan. Rounding up the cast is Bobby Prince (sound effects) who
also designed the music and sound effects for Doom, and Dave Taylor
(funding and beating), programmer at iD software -- creators of Doom and the
upcoming Quake.
D. What Kind of Game is Abuse?
Abuse is an 2D side-scrolling shoot-em up action/puzzle game. Although the
game borrows features from many genres of games it best fits under the
platform category. The Abuse game engine boasts many features with a
built-in Lisp interpreter (for modification and extension of the game world)
most likely being the most promising and exciting feature.
Here are the features of the game engine that are listed in the finger
information at help@crack.com:
This is THE game to see.
- Beautiful shaped, point-source lighting
- Engine has built-in Lisp Interpreter. You can
add code into the game, or create a whole new
game which is instantly ported to many platforms,
has lighting, sound, mouse/joystick, network,
hi-rez and window support. You will be able to
licence copies of the engine to sell as your own.
* - Multi-player. IPX and TCPIP
* - Server/client. Start your game as a server and people can
join in/leave later, automatically downloading the current
level and state of game.
* - Built in Network File System abilities.
When you start up net games, just connect to the server and
access files like they were on your computer. Connect to
a "pacman" server and automatically download art, sfx, and
lisp code. Game compiles and starts running.
- Color matching system ensures you will see perfect graphics
even if your moniter is miscalibrated.
- Animation rendered with in-house vector animation CAD (VCAD).
- Explosions and special effects rendered with in-house PART (particle
animation rendering tool).
- Artwork is editable by users with Satan Paint (free with CDROM
version). (beta available now at npc.ece.utexas.edu:/pub/satan_paint)
- Weapons, weapons, weapons.
- Hi-rez support with VESA drivers
- Ports for DOS, Linux Console, Linux X11; *(348,486,Pentium Linux)
SGI has graciously given us a Indgo II to port abuse
other ports to be announced.
* Not in initial release (we didn't have time to finish & test it as well,
as it should be). Look for a patch shortly after release.
E. Was Abuse Written Entirely in Lisp?
This has the unfortunate possibilty of becoming a well spread misconception.
While the external entity code that you will write for modifications and
additions (or total reconstruction) of the game will be in Lisp, the game
engine was written in C++. There is also a small amount of 80x86 assembly
in the DOS version.
Here is the wc (word count) output on the source code.
Lisp code: 5374 16377 142220 total
C++ code: 67904 185889 1717174 total
Asm code: (negligible)
Approximately seven percent of the game engine and Abuse combined is
Lisp code. The rest is C++. There 5044 lines of Lisp code distributed in
the 0.3.2 version of the Linux version, so you are seeing _all_ of the Lisp
code (the difference is likely due to some lisp net Abuse code that hasn't
been finished yet).
F. How Long Did it Take to Develop Abuse?
After the game engine was completed the development of Abuse took approximately
four months.
II. Can You Tell Me a Little Bit More About Crack Dot Com?
-----------------------------------------------------------
Crack Dot Com is a budding new computer game company owned by programmers
Dave Taylor (of iD software) and Jonathan Clark.
Abuse will be Crack Dot Com's first published game but it is was not the first
game that they worked on.
III. Who and What are the Main Characters and Objects in the Game?
-------------------------------------------------------------------
A. Weapons and Ammo
Laser Rifle
The laser rifle is the most basic weapon in the game. It shoots red
laser pulses (ala Star Wars) in the direction in which you point the rifle.
You can use the laser rifle even without the proper ammunition because if
you couldn't shoot, as JC puts it, that would suck. Having ammunition for
the laser rifle is still a crucial item to have as a loaded laser rifle
fires considerably faster than an unloaded laser rifle. The laser rifle
does not care whether the rifle ammo count is 1 or 1000 -- it will still
fire at the same rate.
Grenade Launcher
This weapon launches grenades in a realistic parabolic arc. Realistic that
is if you ignore the fact that the game world would have to be a vacuum in
order for the trajectory of the grenade to be that perfect. You will
probably be too busy watching the pretty explosions inflict your opponents
with massive damage to notice anyway.
Guided Missle Launcher
The guided missle launcher is Abuse's version of the second most popular
weapon in Doom (the shotgun is almost unarguably the favorite weapon of
Doomaholics everywhere). The highly manueverable missles that this weapon
launches will follow your opponent to the ends of the Earth. That is, if
you don't overshoot.
Firebomb Rifle
You might have a hard time distinguishing this weapon from a flamethrower.
However, this weapon is projectile based an produces a trail of flaming
particles that follow each other like the cars of a train. Since the
weapon is particle based, the projectiles _are_ affected by gravity and
you do not have to fire straight at an opponent in order to hit them.
Plasma Gun
Another weapon found in Doom, this plasma gun produces a burst of plasma
that looks more like the maximum energy burst that you can shoot in the
game R-Type. This weapon is available only in the commercial release of
Abuse.
Death Frizbee
This weapon is available only in the commercial release of Abuse. Maybe
someone will design some Tron modifications to Abuse.
Laser Saber
You've always wanted one and now you have it. The Star Wars weapon is
a reality in Abuse. This weapon is available only in the commercial
release of Abuse.
B. Power-Ups
Fast Power-Up
This power up looks like a giant IC emblazoned with a lightning bolt.
When you run over this power-up you gain robotic legs that allow you to
run twice as fast as normal, jump higher and climb ladders much more
quickly than normal.
Fly Power-Up
This power-up gives you the the ability to fly. It is only available in
the commercial version of Abuse.
Health Power-Up
This power-up ups the players health maximum from 100 to 200. It is
available only in the commercial version of Abuse.
Sneaky Power-Up
This power-up allows the player to become partially invisible. It is
available only in the commercial version of Abuse.
Visor Power-Up
I swear that I caught mention of this somewhere. I would guess that it
turns off lighting effects or provides the user with a high beam headlight.
It is available only in the commercial version of Abuse if at all :)
C. Health Boosters
Health boosters increase your characters health as the name would imply. They
take the form of miniature hearts and when you move over them your health is
raised by a variable number of points depending on the difficulty level.
D. Nick Vrenna
This is your character. Its Nick's job to exterminate the Ants and free
humanity from certain slaughter.
E. Enemies
Ants
The ant is the enemy that you will meet most frequently. Much more deadly
than the insect variety, these ants will _REALLY_ spoil your picnic.
Straight out of _Alien_, these creatures will gnash, claw and shoot their
way to a chance to dine on your tender flesh. Ants are somewhat
intelligent predators in that they will use their ability to walk on
ceilings in order to avoid your attempts to destroy them. Beware: ants
often travel in packs.
There are seven varieties of ants in the commercial release of Abuse and
four varieties in the shareware release. Each type of ant is a different
color and fires one of the seven (or four) weapons provided in the game.
Juggernauts
These giant robots have in their possesion an unlimited number of grenades
and they aren't exactly conservative with their supply. Some models of this
robot are immobile while later models will walk towards your character in
order to get a better shot. Juggernauts are quite tough and can take a lot
of direct hits before they shatter to pieces but unfortunately you usually
aren't given a choice to run away.
Flyers
These agile robots have the ability of flight. Flyers never stand still
so they are often difficult to target however a steady stream of laser
pulses or guided missles usually do the trick
F. Tricks, Traps, Harmful Objects and Other Interactive Objects
Bombs
Bombs are explosive devices which can kill a player if they are within
the blast radius.
Boulders
Boulders are gigantic spiked metal spheres. They are affected by gravity
and will fall when if in the air. When they hit the ground they will
bounce.
A boulder will cause damage to a player when it collides with them.
Boulders can also damage aliens and other objects that can be hurt.
When a boulder is dealt enough damage it will break up into smaller
boulders which will then explode on contact with the floor.
Concussion Mines
These small mines will cause damage to the player upon contact. They can
be found in the air as well as on the ground. Sometimes they even move.
Force Fields
Force fields are walls of energy which prevent the user from moving
through them. Force fields may be as high as one screen.
Lava
Lava tiles will do constant damage to a player while they are in contact
with the lava.
Shock Pulses
These objects intermittently shoot out pulses of electricity which deal
a healthy amount of damage to the player.
Spray Guns
Spray guns are turret-like guns which will rotate in a left-right-left
fashion shooting out sprays of shots. Spray guns may fire any type of
weapon.
Tunnel Robots
This large robot can chase a player down a hall, forcing the player to
either destroy it or to die a horrible death within the robot's spinning
blades.
Track Guns
Track guns are similar to spray guns except that track guns will track
the motion of a player.
Trap Doors
Trap doors on the floor can be activated by sensors and switches. Watch
where you chose to take a breather when playing net Abuse.
Doors
Abuse contains both switch activated and sensor activated doors.
Springs
Springs provide a player with an upward boost when they player comes in
contact with one.
Switches
These state changing devices will hopefully activate something beneficial
to your player like a trap door with more ammo. If you aren't so lucky
you might unleash a pack of ants.
Abuse contains both select-activated switches and shot-activated switches.
Platforms
Platforms are moving tiles that can lift and move you to different floors
and sections of a level.
Pushers
Pushers are objects that will give your player a push in the direction of
the arrows on the pusher. Pushers have varying strengths so it may or
not be a futile attempt to avoid going with the flow.
G. Scenery and Graphics
Foreground
The foreground scenery is made up of the floor, ceiling, wall textures and
other graphics components that your character interacts with. Foreground is
created using combinations of tiles that you choose from a foreground
palette. When you place an object in the screen it is placed in the
foreground as well although it can be moved and manipulated as a seperate
entity.
Abuse comes with a large palette of predefined foreground tiles that include
floor tiles, walls, ceilings, ramps, cavern textures, forest textures,
ladders, pipes and more
Background
The game engine that Abuse is based on allows for two levels of parallax
scrolling. Using the background palette one can make a background which
can be set to scroll at a defined rate in order to add the feeling of
depth to the level.
Abuse has background tiles that can be used to construct a city skyscape,
forest backgrounds and cavern backgrounds.
IV. What are the Main Components That Comprise a Complete Level?
------------------------------------------------------------------
[Objects, Links, Messages, Lighting, Dimmers, Sounds, Weapons/Ammo, Enemies,
Sensors, Force Fields, Respawners (both kinds), Logic Gates,
Save Game Stations]
V. Which Dialect of Lisp Does the Lisp Interpreter Implement?
--------------------------------------------------------------
Common Lisp is the dialect of Lisp that is understood by the built-in
Lisp interpreter.
VI. Which Constructs are Not Supported by the Lisp Interpreter?
----------------------------------------------------------------
Structures and Objects are the two main Lisp constructs that are not
implemented by the built-in Lisp interpreter.
VII. What Multiplayer Abuse Variants Exist?
------------------------------------------------------------------
Currently no multiplayer variants exist because the net code has not been
released. Dave Taylor says to expect the network patch one or two weeks after
release.
VIII. Where Can I Learn More About Level Editing?
----------------------------------------------
A. General Level Editing Information and Guidelines
Duong Nyugen's documentation of the built-in level editor is the best place to
start if you are totally new to the editor. It is not a tutorial, regardless
of the title (Tutorial Number One), but it does document the features of the
built-in editor and lists all of the objects available an describes their
purpose and usage thoroughly.
[Insert guide to general level editing tutorials. Point out that Doom level
editing is a good place to get a feel for the general needs of a level in
a level based action game such as the proper use of lighting and distribution
of enemies and ammunition. It is also a good place to get a feel for what
is needed to make a good multiplayer cooperative or deathmatch level]
B. Level Editor Documentation
Currently the only documentation on the supplied level editor is the abuse.doc
file that comes with the beta version of Abuse.
C. Lisp documentation and tutorials
Guy Steele's definitive description of the Common Lisp language, _Common Lisp
the Language_, second edition, can be accessed through the World Wide Web.
The address is www.supelec.fr/docs/cltl/cltl2.html.
A brief tutorial that covers some of the basics of the language is available
as the tutorial packaged with the Linux version of CLisp ( possibly
obtainable elsewhere ).
VIIII. What Channels Exist on IRC for Discussing Abuse?
------------------------------------------------
#Abuse, the official Abuse discussion channel will be the main IRC channel
for discussing the game. You will probably be able to strike up a
conversation about Abuse on #Doom as well. Dave Taylor (of iD Software and
Crack Dot Com) makes appearances quasi-frequently on #doom and if we're lucky,
he will pop into #abuse from time to time.
X. What Newsgroups Exist for Discussing Abuse?
--------------------------------------------------
Currently there are none but rec.computer.games.ibm.pc.action often has
posts concerning Abuse although they are mostly messages asking when the
game will be released
XI. What Mailing Lists Exist for Discussing Abuse?
------------------------------------------------------
There are no mailing lists as of yet. Firehawk of #abuse is looking into
starting one, however.
XII. How Can I Get Abuse?
------------------------
You can get ordering information by fingering abuse@crack.com or by
checking out Crack Dot Com's brand new web page at www.crack.com. The
game will also be carried in stores but you most likely won't get the
t-shirt.
XIII. FAQ Change History
-----------------------
Version 0.1.0: First public release of incomplete FAQ. Sections involving
level entities and objects incomplete. Made available
on August 31st, 1995, the DOS Beta release date.
Version 0.1.1: Fixed misspellings of Crack Dot Com employees. Added
FAQ Change History list. Updated revision number (which
was labeled incorrectly in the header).
Version 0.2.0: Added credits section. Fixed minor errors. Finished
descriptions of scenery components and tricks/traps/objects.
XIIII. Credits
-------------
Thanks go to:
-- Jonathan Clark, author of Abuse, for providing me with detailed
information on the exact amount of Lisp code in the game in respect
to the size of all of the code in the game and information and for
stopping by #abuse on the eve of the DOS shareware release and answering
a barrage of questions from Hank Leukart and myself.
-- Dave Taylor, John Romero and Shawn Green, again, for stopping by #abuse
on the day of the DOS shareware release which generated a lot of activity
in the channel.
-- The crew at Crack Dot Com for giving us such a great looking game that
plays so smoothly.
Copyright Recognition
---------------------
_Abuse_ is a registered trademark of Crack Dot Com.
_Doom_ and _Quake_ are registered trademarks of iD Software.
_Star Wars_ is a registered trademark of Lucasfilms.
_Tron_ is a registered trademark of the Walt Disney Company.
This FAQ is the intellectual property of the author, Mike Perry.
I cannot keep anyone from copying this FAQ and editing it for
redistribution nor can I lay claim to any of the underlying
information on this page other than its wording. There is no
copyright on this FAQ registered with the copyright office however
I have placed a copyright notice at the bottom of the FAQ for dating
purposes.
Disclaimer
----------
The information and ideas conveyed in this FAQ are not guaranteed to be fact.
The author of the FAQ dismisses all responsibilty for any financial loss and
for any physical or emotional damages caused by any placement of faith upon
the ideas and answers contained this document. It is up to the reader to decide
what he or she contends is fact. Should the support of any product, software
package or add-on mentioned in this document cease or if an upcoming software
release becomes vaporware, the author must not be held responsible for that
outcome.
--- Abuse FAQ v0.2.0 Copyright (C) August 31, 1995 Mike Perry ---
--- mj-perry@ux4.cso.uiuc (Riff on #doom and #abuse) ---
--
Bill Lachance
ad904@Freenet.Carleton.CA
///////////////////////////////////////////////////////////////////////////
// Advanced Abuse Editing : Builtin Function Documentation (v1.000) //
// Maintained by: Tony Cannon (cannon@cs.stanford.edu) //
// (Ponder on #abuse irc channel) //
///////////////////////////////////////////////////////////////////////////
Section I. Things Not Related to Editing
--== Introduction ==--
This is an attempt to document (as much as possible) all of the lisp
functions built into Abuse. Why? If you want to make something besides
a 2D scoller, you're going to have to start hacking the lisp eventually.
You're also going to have to start mucking around the lisp to create
a new creature, or just change the ai of an existing one. Hopefully,
the registered version of Abuse will eventually include some sort of
comprehensive documentation covering all the functions, but until (if?)
that happens, this should help some of you get started.
--== This Document is Not ==--
This is not a tutorial by any stretch of the imagination. It's just
a list of functions and as much as I've been able to infer about each
one by looking at the source code. Nor is it the Abuse FAQ. The Abuse
FAQ is maintained by Mike Perry (mj-perry@ux4.cso.uiuc.edu) and can
be obtained either from usenet or from the bot on the #abuse irc channel.
It's not a lisp manual, either. If you need help on lisp, I recommend
buying a book, taking a course, or browsing one of the web pages mentioned
in the Abuse FAQ. It won't tell you how to use the level editor, or how to
make $10,000 though some stupid pyramid scheme (thank god). It won't take
out the garbage, or feed the cat. It's just a list of functions.
--== How'd you figure this out? ==--
By looking at the files lsp/*.lsp in the abuse directory and playing with
the editor a bit. Of course, there's only so much you can figure out
from (largely) undocumented source. There are quite a few holes in this,
but it's better than nothing. Hopefully, it'll fill in more as people
send in what they've figured out or when I get more time to play with it.
--== What can I do with this? ==--
I'd appreciate it if you'd only distribute this in it's entire, unedited
format. Send comments and suggestions to the Tony Cannon via
cannon@cs.stanford.edu. Other than that, feel free to distribute it in
any form to any forum so long as you do not derive any profit from said
distribution.
Section II. How to Read This Document
--== My God This Is BIG ==--
Yes, it is big, isn't it? If you really want to learn all of this, you
can just sit down and start with (activated) and make your way down. I
HIGHLY discourage that, though. Personally, I think the best way to read
this is to start with the following topics, and fill your way out from
there:
New Objects: ai_fun, def_char, move_fun, def_char again, ai_state,
draw_fun, def_char, def_char, damage_fun, one more look at
def_char.
Linking: add_object, get_object, with_object, link_object, remove_object
Lighting: add_light, get_light, link_light, delete_light, set_light_r2,
set_ambiend_light.
Finding Things: bg, first_focus, next_focus, can_see, find_object_*
Section IV. Credits
Special Thanks goes to...
Jonathan Clark ...................Help all over the place!
;;------------------------------------------------------------------------
Object Function: activated
Usage: (activated)
Returns: T or nil
Returns T if the (me) object is activated, nil otherwise.
An activated object is one who's aistate does not equal 0. Thus,
you could have just done a (not (eq (aistate) 0)), but (activated)
is shorter.
;;------------------------------------------------------------------------
Function: ascatter_line
Usage: (ascatter_line x1 y1 x2 y2 color1 color2 spread)
Returns: dunno
Draws a fuzzy line between points 1 and 2 using colors 1 and 2. You
can control the fuzziness with the [spread] parameter, which should
take a value between 0 and 8.
;;------------------------------------------------------------------------
Object Function: add_ammo
Usage: (add_ammo weapon_type amount)
Returns: dunno
Adds [amount] ammo to the weapon [weapon_type]. Amount can be
negative to subract ammo. Make sure to call (has_weapon) to see
if the player has that weapon or not. If they don't you can call
(give_weapon) to give it to them.
;;------------------------------------------------------------------------
Object Function: add_hp
Usage: (add_hp amount)
Returns: dunno
Gives [amount] of hitpoints to the current object. For example,
you might do (with_object (bg) (add_hp (hp))) to double the main
character's hitpoints.
;;------------------------------------------------------------------------
Function: add_light
Usage: (add_light type x y r1 r2 xshift yshift)
Returns: the new light
Creates a new light at position [x]+[xshift] [y]+[yshift]. Note that
this light isn't linked to anything, it
s just created. If you want to link,
use thel link_light function. Use the [type] field to determine which
kind of light you want (half dome, etc.)
;;------------------------------------------------------------------------
Function: add_object
Usage: (add_object obj_class x y [aitype])
Returns: The newly created object
Creates a new object specifed by the [obj_class] and starts it off at
location [x] [y]. The object isn't linked to anything. You might
say something like: (add_object SMALL_DARK_CLOUD (x) (y)). If you
want to add a light, call add_light, not add_object. The [aitype]
parameter at the end is strictly optional.
;;------------------------------------------------------------------------
Function: add_object_after
Usage: (add_object_after obj_class x y [aitype])
Returns: The newly created object
Just like add_object, except that the object is added directly
after the current object in the global object list.
;;------------------------------------------------------------------------
Funciton: add_panim
Usage: (add_panim part_class x y dir)
Returns: dunno
dunno. Creats a new particle animation at location [x] [y].
[part_class] is a class previously declared with the def_particle
function, I think. What's a particle? I have no clue.
;;------------------------------------------------------------------------
Object Function: aistate
Usage: (aistate)
Returns: An object's current aistate
Gets the current value of the aistate. In Abuse, the aistate is
a generic, 4 byte variable used to describe something as on or
off (on being non-zero), and to control state machines. You'll
almost always use (aistate) in a construct similar to:
(select (aistate) (0 blah) (1 other-blah)). You can set
the aistate with the (set_aistate) function.
;;------------------------------------------------------------------------
Object Function: aitype
Usage: (aitype)
Returns: An object's current aitype
It looks like aitypes are used to distinguish between several
different "flavors" of objects that all use the same AI function.
For example, you can use the aitype to select how many hitpoints
to give a mob or which palette to use to draw it. The aitype
is usually accessible in the editor by use of the fields sub-
function in (def_char). You can set the aitype with the
(set_aitype) function.
;;------------------------------------------------------------------------
Object Function: ammo_total
Usage: (ammo_total weapon_type)
Returns: How much ammo the object has
Good for counting exactly how much ammo the object has in a
certain slot. For example, in the (bg)'s ai, you might do:
(ammo_total (current_weapon_type)). I can't see why you'd want
to do this outside of the (bg)...
;;------------------------------------------------------------------------
Function: argc
Usage: (argc)
Returns: Int
Use (argc) to extract the number of command line parameters. For
example, if you started abuse by just typing "abuse -edit", then
(argc) would return 2.
;;------------------------------------------------------------------------
Function: argv
Usage: (argv [n])
Returns: String
(argv) will extract the [n]th argument from the command line.
Note that n is 0 as in C and C++. So, if you started abuse with the
command line "abuse -edit", then (argv 1) returns "-edit".
;;------------------------------------------------------------------------
Object Function: bg
Usage: (bg)
Returns: A pointer to the closest player object
bg stands for BadGuy. It returns a pointer to the _closest_ player
in the game. If you're playing a networked or multi-player game,
this may not always be the same player. For example, you might say
(with_object (bg) (set_hp 100)) to give the closest player 100% health.
;;------------------------------------------------------------------------
Function: blocked_down
Usage: (blocked_down block_flags)
Returns: T or nil
Parses the block_flags (for example, the flags returned by the
move function) to see if the blocked_down bit is set or something.
You might say, (if (blocked_down (move 0 0 0)).
;;------------------------------------------------------------------------
Function: blocked_left
Usage: (blocked_left block_flags)
Returns: T or nil
See blocked_down, it's probably the same
;;------------------------------------------------------------------------
Function: blocked_right
Usage: (blocked_right block_flags)
Returns: T or nil
See blocked_down, it's probably the same
;;------------------------------------------------------------------------
Function: blocked_up
Usage: (blocked_up block_flags)
Returns: T or nil
See blocked_down, it's probably the same
;;------------------------------------------------------------------------
Object Function: bmove
Usage: (bmove obj_ptr)
Return: The object hit
dunno. Move like a bullet. As best as I can figure out, it
takes the values from a call to (set_course) and moves the
object 1 step. If it hits anything in its path _besides_
[obj_ptr] it will return that object. Otherwise, it will
return nil. Updates both x and y of this object.
;;------------------------------------------------------------------------
Function: break
Usage: break
Return: dunno
Stops execution of the currently running program and shells
into the lisp interpreter. Pretty cool, but unlikely that
you'd use it in a game (although you could get clever, I
guess). Great for debugging, though.
;;------------------------------------------------------------------------
Function: can_see
Usage: (can_see sourcex sourcey destx desty obj_ptr)
Return: T or nil
Returns whether or not there is a line of sight from
[source] to [dest]. I assume the things that block you from
moving are the same things that can block a line of sight.
I dunno what obj_ptr is (or even if it really is an obj_ptr)
because it's always nil. I suppose it might be an objec that
can also block sight, but again, I dunno.
;;------------------------------------------------------------------------
Function: create_players
Usage: (create_players obj-tag)
Returns: dunno
Creates a player to be controlled by the local PC. The player starts
off in the same location as the START object. If you don't do a
(create_player) BEFORE you enter the editor, you can't to squat (try
commenting out the create_player in abuse.lsp and see what I mean).
;;------------------------------------------------------------------------
Object Functino: current_weapon_type
Usage: (current_weapon_type)
Returns: The currently selected weapon.
Returns the current weapons selected by the local character.
For example, you might want to do a:
(if (> (ammo_total (current_weapon_type)) 0) to see if the player
can fire the weapon.
;;------------------------------------------------------------------------
Object Function: damage_fun
Usage: (damage_fun amount from hitx hity push_xvel push_yvel)
Returns: dunno
Causes the current object to take [amount] damage. I suppose this
entails subtracting [amount] from the object's hitpoints. It also
"moves" them with velocity [push], but I'm not sure if this is
added directly to the position or the velocity. [hit] is the location
that the damage occured, and I think [from] is the object that
damaged you, though I can't know for certain.
;;------------------------------------------------------------------------
Function: def_char
Usage: (def_char obj_class (sub_function)*)
Returns: nothing important
(def_char) is the function you use to create new types of objects.
Everything you see in the object window of the editor (and more)
has a def_char associated with it somewhere in the lisp code (unless
it's pre-compiled, but I don't think any are). [obj_class] is the
way you refer to the new object. There are several different
sub_functions that you have to call as parameters to the def_char
to fully define the object. They are described below:
Sub-function: vars
Usage: (vars [var]*)
The (vars) function creates a set of local variables visible
only inside this object. You can set these variables using
(setq) and you can get their values by just typing the token.
For example, I might type in an ai_function: (setq tics (+ tick 1))
You can put as many vars as you want, bounded only by what's
sensible and probably a cap on some array in JC's interpreter.
Sub-function: funs
Usage: (func [func-pair]*)
The (funs) function lets you hook you certain functions to
the object's methods. Each [func-pair] is of the form
(fun-type fun-you've-written), where fun-type is one of
the following:
ai_fun - The brain of the object. The ai_fun is called
every tick. Most ai_funs are a finite state machine
using the aistate as a state pointer. The function
you write for ai_fun shouldn't take any arguments.
constructor - Just like a C++ constructor. This function
is called when the object is just created. It takes
no arguments.
damage_fun - The function to be called when this object
takes damage. Arguments? Yes, actually. This funciton
needs to have the same type of arguments as the builtin
do_damage.
draw_fun - The function called whenever an object needs
to be draw. It also takes no arguments.
move_fun - The function called to move the object around.
It takes three parameters: the first is the x direction
(<0 for left >0 for right), the next is the y direction
(<0 for up >0 for down), and the last is the status
of the mouse buttons (bit 1 is set for the right,
bit 2 for the left). I've only seen move functions
on the player, in which case, the three variables just
represent keystrokes. *NOTE* The move function NEEDS
to return blocked_flags. I'm not sure how to
assemble them, though.
reload_fun - It think this is the function that's called
whenever an item is loaded _after_ the first time,
as opposed to the constructor which is called on the
first time. Don't quote me, though. This function
takes no arguments.
type_change_fun - The function called when the aitype
changes. I think. Guess what? This doesn't take
any arguments either.
user_fun - The userfun can be invoked at any time by
calling (user_fun signal value) from inside the
object. The parameters are, of course, the signal
and the value. I have no idea if this description is
accurate, but it seems like it to me.
I'm not sure what happens when you try to make a function
that's not one of the above. It _could_ be that you can
invoke it by just calling it by name (as in the user_fun),
but I'm not certain.
Sub-function: fields
Usage: (fields [field-pair]*)
You use the (fields) function to provide hooks into the editor.
Each field-pair is of the form (var prompt) where both are strings.
The var is the name of the variable that you'd like to modify.
They can be both builtin variables (hp, aitype, xvel) or things
that you've mentioned in the vars sub-function. The prompt is
what you want to appear to the left of the text-field for this
variable in the editor. Both must be quoted For example, I might use:
(fields ("aitype" "Mob Type (0-15):")
Sub-function: abilities
Usage: (abilites [ability-pair]*)
Used to set constants in the object. The ability-pair is of the
form (constant value). For example, (run_top_speed 10). In order
to read the value of an ability, you need to use the
(get_ability) function.
Sub-function: range
Usage: (range x y)
Sets the range for this object.
Sub-function: draw_range
Usage: (draw_range x y)
Sets the drawing range for this object.
Sub-function: flags
Usage: (flags [flag-pair]*)
Sets up all kinds of little quirky things about an object.
Each flag-pair is of the form (flag value) where value is
PROBABLY either T or nil. I say probably because I've never
seen a flag with a nil value. Oh well, here's the flags I've
found:
unlistable - The item won't appear in the objects window
of the editor
add_front - When you create this object, put it in front
of all other object so it's drawn on top.
hurtable - You can hurt this object.
force_health - Dunno. Only appears in ants.
can_block - This object behaves as an obstruction. You
can't walk thought it. (More specifically, trying to
move through it will set the blocking flags)
unactive_shield - Dunno. Only appears in hidden_walls.
Sub-function: states
Usage: (states [spe] [state-pair]*)
Defines all the different positions the object can have. The
[spe] is the .spe file where the frames for all these states
can be found. Each [state-pair] is of the form
(state frame-list). The state is just a token to refer to
this state by (as in (set_state) and (state)). The frame-list
is a lisp form containing the names for all frames for this
state. Examples include a single frame, "bomb.pcx", a list
of frames, `("one.pcx" "two.pcx"), and a sequence of frames
built by the (seq) function, (seq "f" 9 12) which evaluates
to `("f0009.pcx" "f0010.pcx" "f0011.pcx" "f0012.pcx").
No example is given because it probably wouldn't be helpful and
because there are TONS in the source.
;;------------------------------------------------------------------------
Function def_image
Usage: (setf [some_image] (def_image [spe] [name]))
Returns: dunno
Lets you refer to the image [name] in the [spe] .spe file by the token
[some_image] so you can use it in a call to (put_image). Not very
descriptive, I know. For example, you might say:
(setf an_image (def_image "art/misc.spe" "some_image.pcx"))
(put_image 20 5 an_image)
;;------------------------------------------------------------------------
Function: def_particle
Usage: (def_particle '[part_class] [spe])
Returns: dunno
Here's a guess, but I dunno. Defines a particle animation that you
can use for special affects. The [part_class] is the class that you'll
need to pass to (add_panim) to display the effect. The [spe] is
the name of the file that contains the effect.
;;------------------------------------------------------------------------
Function: def_sound
Usage: (def_sound '[sound_class] [file])
Returns: sound_class
Creates a sound resource that you can refer to by [sound_class].
Is used in cooperation with the function (play_sound). [file]
is the path from the abuse directory to the .wav. For example,
(def_sound 'SBALL_SND "sfx/ball01.wav")). (def_sound) returns
the class of the sound, in this case, SBALL_SND.
;;------------------------------------------------------------------------
Function: def_tint
Usage: (def_tint [spe])
Returns: the tint
Dunno. Haven't messed with it yet.
;;------------------------------------------------------------------------
Function: delete_light
Usage: (delete_light [light])
Returns: dunno.
Completely removes a light from the game. [light] is the actual
light object that you want to remove. For example, you could type
(delete_light (get_light 0)) from inside some object with a link
to a light.
;;------------------------------------------------------------------------
Object Function: dev_draw
Usage: (dev_draw)
Returns: dunno, probably nothin'.
Basically, calls the normal draw function if and only if the editor
is currently running. Sensors, gates, etc. all use def_draw for
their draw functions.
;;------------------------------------------------------------------------
Object Function: do_damage
Usage: (do_damage amount who ???x ???y)
Returns: dunno, probably nothin'.
Does [amount] damage to [who]. [x] and [y] are probably the
amount to recoil, or maybe xvel and yvel like in damage_fun.
I dunno.
;;------------------------------------------------------------------------
Object Function: draw
Usage: (draw)
Returns: dunno
Draw the person in a very standard way.
;;------------------------------------------------------------------------
Function: draw_line
Usage: (draw_line x1 y1 x2 y2 color)
Returns: dunno
Draws a line in the usual fashion. Here's another example for the
faint of heart: (draw_line 10 10 20 20 (find_rgb 128 128 128)) draws
a 45 degree, greyish line.
;;------------------------------------------------------------------------
Function: draw_predator
Usage: (draw_predator)
Returns: dunno
dunno
;;------------------------------------------------------------------------
Function: draw_tint
Usage: (draw_tint tint)
Returns: dunno
Draws the object with some sort of spiffy palette stuff happening,
I guess. Haven't messed with it (dunno).
;;------------------------------------------------------------------------
Function: draw_transparent
Usage: (draw_transparent count max)
Returns: dunno
Draws the object as some sort of a semi-solid filter. I have no
idea what the two parameters do as I haven't messed with it at all
(dunno). I haven't had a chance to play around with what [count]
and [max] do yet. :(
;;------------------------------------------------------------------------
Object Function: direction
Usage: (direction)
Returns: -1 or +1 (the value of direction)
The game engine uses an objects direction to determine whether or
not it's image should be flipped horizontally when drawn (that's
a guess). 1 means facing right (the default), -1 means facing
left. You can change the direction of this object with the
(set_direction) function.
;;------------------------------------------------------------------------
Object Function: facing
Usage: (facing)
Returns T or nil
Returns whether or not the current object is facing the (bg).
;;------------------------------------------------------------------------
Object Function: fade_count
Usage: (fade_count)
Returns: The value of fade_count
I'm not sure. Seems to be used as a counter in a lot of code,
but I don't know if different values of fade count cause the
image to be drawn in a different way or not. You can set the
value of fade_count with the (set_fade_count) function. Should
always be between 0 and 15 to determine the amount of transparency.
;;------------------------------------------------------------------------
Function: find_object_in_angle
Usage: (find_object_in_angle start end list)
Returns: object or nil
Looks for an object inside the angle [start] [end]. If it finds
an (active?) object who's class matches one of those in list, then
it will return that object. Otherwise, returns nil. For example,
(find_object_in_angle 0 180 (list ANT_ROOF))
;;------------------------------------------------------------------------
Function: find_object_in_area
Usage: (find_object_in_area x1 y1 x2 y2 list)
Returns: object or nil
Same as find_object_in_angle, except searches a rectangular area
The only built-in cheat is God Mode.
* Start Abuse with -edit
* Make sure the cursor is in the window
* Press SHIFT and Z at the same time.
* Press TAB to start playing
------------------------------------------------------------------------
Abuse - Demo
Secret levels
The two secrets in the first level are pretty cool, they include a warp
section that lets you jump to any level in the demo.
Here's how you get to them (spoiler):
First Secret (get some good weapons)
Kill the two flyers, go down the hole that opens up. Flip the switch and grab
the ammo. Run right and use the teleporter. Then, go right, stop before you
fall down the pit. Jump across the pit to the little ledge. There's an
invisible teleporter there, but the instructions to press down to teleport
will appear. Press down, you're in the secret area. Grab the ammo and you now
have the grenade launcher and the rocket launcher.
Second Secret (you wanna go where?!)
After you drop down from the bonus weapons, to the left you'll find a save
station. Just to the left of that are some ceiling tiles with cracks. Blow
away the ceiling to reveal a jump-booster. Jump up and to the left. Run along
the upper corridor until a tube opening appears. Go through it and you'll be
in a room with four end-level thingies (those multi-armed numbers that look
like robo-surgeon gone bad). Each one will take you to a different level...
Hey, who's actually maintaining a FAQ around here? Looks like it's too late to
start my own. :^)
Nick
--
+------------------------------------+
| Nick Vargish, BBN Planet (SURAnet) | In the words of the immortal
| vargish@sura.net 301/489-8134 | Socrates, "I drank _what_?"
| http://www.sura.net/~vargish | [Real Genius]
MegaCheat:
Start the game with abuse -edit and press [Shift][Z]. All you have
to be aware of is that the cursor has to be in the window during
this action. Now start the game with [Tab]...
To get direct to a certain level start the game with
abuse -f levels\levelxx.spe, where xx can be a number from 00 (first
level) to 21 (last level).
A nice thning also is the firing without ammo! If you do not have
enough ammo for a certain weapon, but you have enough for another
gun, you could use it nevertheless. Press the right mouse button
while you fire with the left one. If you run out of ammo for the
afterburner, you could use it and the ammo for the grenates will
decrease for one. This does not work with the laser unfortunately.