So you're trying to use the object-oriented language to do something that isn't object-oriented, but still actually is object-oriented? You have a particle engine datum (object) that manages every projectile (data stored in a list) and sets the appearance of screen objects.
Or, you use an object.
It has its own data.
It has its own functions.
It was designed to work with the engine.
Instead of this:
every tick:
for every projectile:
move projectile by its velocity
You want to do something like this:
every tick:
for every set of data in the list that represents projectiles:
particle_data[relevant_projectile_data_set][position_x] += particle_data[relevant_projectile_data_set][velocity_x]
particle_data[relevant_projectile_data_set][position_y] += particle_data[relevant_projectile_data_set][velocity_y]
// check collisions
for every nearby atom
if relevant projectile's position intersects the atom
projectile hits atom and dies
for every client
for every screen cell
if there is a projectile at this cell
set appearance to particle_data[relevant_projectile_data_set][icon_state]
else clear the cell
An object is a predefined collection of data and functions that gets instanced within a list, thereby locating it somewhere. Its data is often updated automatically by its built-in functions, or user defined ones. It may also interact with other objects by updating their vars as well.
A list is simply a variable that contains a list of data. It doesn't do anything special (unless built-in), except accepts changes to its content whenever a proc alters it.