/*
 * sprite_anim_stop — остановить кадровую анимацию.  frame ≥ 0 — какой
 * кадр останется на экране (индекс вдоль оси ленты, ≤127); -1 —
 * замереть на текущем.
 *
 * Пиксельный шаг оси берётся из размера кадра (w — горизонтальная
 * лента, h — вертикальная; an_step НЕ годится — он в БАЙТАХ src),
 * смещение кадра — циклом сложений (стоп — редкий вызов).  Установка
 * кадра — через sprite_frame (единственная точка пересчёта кэша src;
 * важно и при frame == an_frame: src мог уехать тикером, а sx/sy —
 * нет, sprite_frame сверяет именно src).  Валидна после sprite_anim;
 * SPR_ANIM_DONE не трогает.
 */
#include "../_bgi.h"
#include <sprite.h>

void sprite_anim_stop(sprite_t *s, int8_t frame)
{
    s->an_flags &= (uint8_t)~(SPR_ANIM_ON | _SPR_PP_BACK);

    if (frame >= 0) {
        uint8_t step_px = (s->an_flags & _SPR_STRIP_HORZ) ? s->w : s->h;
        int off = 0;
        uint8_t i;

        for (i = 0; i < (uint8_t)frame; i++)
            off += step_px;
        s->an_frame = (uint8_t)frame;
        if (s->an_flags & _SPR_STRIP_HORZ)
            sprite_frame(s, off, s->sy);
        else
            sprite_frame(s, s->sx, off);
    }
}
