I think the problem is the first line:
onClipEvent(enterFrame) {
That means whatever is in that block will be executed every frame, which means that it checks which way the bullet should be pointing and moving every frame. You want it to only check when it is first fired, but still do the rest of the script every frame. You need the checking action in (i think) a 'load' event, and the rest in an 'enter frame' event. Try this:
onClipEvent(load) {
speed = 20
if (_root.char._currentFrame == 1) {
this._x += speed;
this.gotoAndStop(1)
} else {
this._x -= speed;
this.gotoAndStop(2)
}
}
onClipEvent(enterFrame) {
if (this._x >= 800) {
removeMovieClip(this);
duplicateMovieClip(this,"bullet",3);
this._x = _root.char._x;
this._y = _root.char._y;
} else if (this._x <= -800) {
removeMovieClip(this);
duplicateMovieClip(this,"bullet",3);
this._x = _root.char._x;
this._y = _root.char._y;
} else {
this.play();
}
}