Фиксированный логический кадр по лучу + режимы FASTEST/FAST/NORMAL
Период стал max(n, ceil(W)) вместо ceil(W)+2: три gfx_wait_vsync после работы отсчитывались от её КОНЦА, поэтому бюджет кадра был один растр. Теперь ждём от якоря начала кадра, и при n=3 бюджет 1 290 240 тактов. Счёт кадров — программный, по биту 5 порта 0xFE (положение луча), а не по кадровым прерываниям: те теряются в DI-окнах акселератора фазозависимо (замер: 0..2,8 %, на полной перерисовке три подряд). Условие точности одно — зазор между выборками меньше 64 512 тактов; точки выборки расставлены по замеру, а не на глаз. Режимы (pop_pace.h), клавиша P по кругу, дефолт FASTEST. Условие боя взято у оригинала буквально (SDLPoP seg003.c:363): Kid.sword == SWORD_2_DRAWN, а не «идёт бой». Проверено в MAME на 11/15: счётчик без недосчёта на 270 кадров, период ровно 3 растра на 302 логических кадрах (ни длиннее 3,1, ни короче 2,9), NORMAL даёт ровно 4, с вынутым мечом — ровно 5.
This commit is contained in:
@@ -18,12 +18,15 @@
|
||||
#include <stdint.h>
|
||||
#include <gfx.h>
|
||||
#include "_pop_draw.h"
|
||||
#include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */
|
||||
|
||||
void pop_heal_fast(int x, int y, int w, int h)
|
||||
{
|
||||
pop_beam_sample(); /* ТЕМП КАДРА: выборка луча, см. pop_pace.h */
|
||||
if (w <= 0 || h <= 0) return;
|
||||
if (pop_onscreen_cols(x, y, (uint16_t)w, (uint16_t)h))
|
||||
gfx_heal_noclip(x, y, (uint8_t)w, (uint8_t)h);
|
||||
else
|
||||
gfx_heal(x, y, w, h);
|
||||
pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ /* и ПОСЛЕ: широкий heal сам по себе ~70 000 тактов */
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user