animations MGF works

This commit is contained in:
Ondřej Novák 2025-01-29 19:57:25 +01:00
parent 4f9f985918
commit 2be84e406c
10 changed files with 224 additions and 293 deletions

View file

@ -631,6 +631,7 @@ void pcx_8bit_nopal(void **p,int32_t *s);
void set_background(void **p,int32_t *s);
void wav_load(void **p,int32_t *s);
void load_mob_legacy_format(void **p, int32_t *s);
void load_spells_legacy_format(void **p, int32_t *s);
void wire_main_functs(void);
void ukaz_kompas(char mode);
void *timming(EVENT_MSG *msg,void **data);

View file

@ -106,7 +106,7 @@
static inline word _impl_get_word(unsigned char **c) {
word r = (*c)[0] + 256* (*c)[1];
c+=2;
(*c)+=2;
return r;
}
#define GET_WORD(c) _impl_get_word(&c)
@ -135,15 +135,16 @@ static TTELEPLOCATION TelepLocation;
typedef struct tkouzlo
{
word num,um,mge;
word pc;
short owner,accnum; //accnum = akumulacni cislo, owner = kdo kouzlo seslal
int start;
short cil; //kladna cisla jsou postavy zaporna potvory (0 je bez urceni postavy)
word pc; //8
short owner,accnum; //accnum = akumulacni cislo, owner = kdo kouzlo seslal //4
int start; //4
short cil; //2 //kladna cisla jsou postavy zaporna potvory (0 je bez urceni postavy)
char povaha;
char traceon; //jinak noanim - neprehravaji se animace a zvuky
//paddding 1 byte
word backfire; //backfire / 1 = demon , 0 = bez demona
word wait; //wait - cekani pocet animaci
word delay; //delay - cekani pocet kol
char traceon; //jinak noanim - neprehravaji se animace a zvuky
char spellname[28];
word teleport_target;
}TKOUZLO;
@ -184,6 +185,30 @@ static void animace_kouzla(int act,void *data, int ssize)
}
void load_spells_legacy_format(void **p, int32_t *s) {
TKOUZLO *k = (*p);
TKOUZLO *end = (TKOUZLO *)((char *)(*p) + k->start);
++k;
int count = 1;
while (k < end) {
++count;
TKOUZLO *end2 = (TKOUZLO *)((char *)(*p) + k->start);
if (end2 < end) end = end2;
++k;
}
SEND_LOG("(SPELL) Loading spell table: count %d", count);
k = (*p);
for (int i = 0; i < count; ++i) {
char *b = (char *)k;
char traceon = k->spellname[-1]; //traceon was there;
size_t bofs = offsetof(TKOUZLO, traceon);
size_t eofs = offsetof(TKOUZLO, spellname)-1;
memmove(b+bofs+1, b+bofs, eofs-bofs);\
k->traceon = traceon;
++k;
}
}
static void play_anim(va_list args) //tasked animation
//#pragma aux play_anim parm []

View file

@ -177,7 +177,7 @@ TDREGISTERS registred[]=
{H_PZASAH,"pzasah.pcx",pcx_8bit_decomp,SR_BGRAFIKA},
{H_BATTLE_CLICK,"souboje2.pcx",pcx_8bit_decomp,SR_BGRAFIKA},
{H_SIPKY_END,"sipky.pcx",pcx_8bit_decomp,SR_BGRAFIKA},
{H_KOUZLA,"kouzla.dat",NULL,SR_MAP},
{H_KOUZLA,"kouzla.dat",load_spells_legacy_format,SR_MAP},
{H_LEBKA,"death.pcx",pcx_8bit_decomp,SR_BGRAFIKA},
{H_KOSTRA,"bones.pcx",pcx_fade_decomp,SR_BGRAFIKA},
{H_RUNEHOLE,"runehole.pcx",pcx_8bit_decomp,SR_BGRAFIKA},
@ -474,6 +474,7 @@ void load_mob_legacy_format(void **p, int32_t *s) {
*s = count * sizeof(TMOB);
}
void set_background(void **p,int32_t *s)
{
word *data;

View file

@ -39,8 +39,6 @@
char exit_wait=0;
T_EVENT_ROOT *ev_tree=NULL;
char freeze_on_exit=0;
int32_t ev_buff_msg[EVENT_BUFF_SIZE]={0};
void *ev_buff_dta[EVENT_BUFF_SIZE]={NULL};
int ev_poz=0;
char *otevri_zavoru;
@ -188,22 +186,7 @@ void force_delete_curr (T_EVENT_ROOT **tree,T_EVENT_ROOT *r, T_EVENT_POINT *p)
}
}
/*
static void unsuspend_task(EVENT_MSG *msg)
{
int i;
int nt;
nt=nexttask;
for(i=1;i<taskcount;i++) if (tasklist_sp[i]!=NULL && task_info[i] & TASK_EVENT_WAITING && tasklist_events[i]==msg->msg)
{
nexttask=i;
task_info[nexttask]&=~TASK_EVENT_WAITING;
task_sleep(msg->data);
}
nexttask=nt;
}
*/
void enter_event(T_EVENT_ROOT **tree,EVENT_MSG *msg)
{
T_EVENT_ROOT *r;
@ -282,14 +265,14 @@ static int call_proc(EVENT_MSG *msg, void *ctx) {
return 0;
}
T_EVENT_POINT *install_event(T_EVENT_ROOT **tree,int32_t ev_num,EV_PROC proc,void *procdata,char end)
T_EVENT_POINT *install_event(T_EVENT_ROOT **tree, EVENT_MSG *msg, EV_PROC proc,char end)
//instaluje novou udalost;
{
void *user=NULL;
T_EVENT_POINT *p;
call_proc_context ctx = {proc, &user};
send_message_to(call_proc,&ctx, E_INIT, procdata);
int ev_num = msg->msg;
msg->msg = E_INIT;
proc(msg, &user);
p=add_event(tree,ev_num,proc,end);
p->user_data=user;
return p;
@ -322,11 +305,10 @@ void tree_basics(T_EVENT_ROOT **ev_tree,EVENT_MSG *msg)
T_EVENT_POINT *r;
shift_message(msg);
EV_PROC proc = va_arg(msg->data, EV_PROC);
void *procdata = va_arg(msg->data, void *);
find_event_msg_proc(*ev_tree,msg->msg,proc,r);
assert(r==NULL);
if (r==NULL)
install_event(ev_tree,msg->msg,proc,procdata,msg->msg==E_ADDEND);
install_event(ev_tree,msg,proc,msg->msg==E_ADDEND);
return;
}
if (msg->msg==E_INIT)
@ -542,122 +524,3 @@ T_EVENT_ROOT *gate_basics(EVENT_MSG *msg, void **user_data)
tree_basics((T_EVENT_ROOT **)user_data,msg);
return p;
}
/*
int create_task()
{
int i;
for(i=1;i<taskcount;i++)
if (tasklist_sp[i]==NULL) break;
if (i>=taskcount)
{
taskcount++;
tasklist_sp=grealloc(tasklist_sp,taskcount*4);
tasklist_low=grealloc(tasklist_low,taskcount*4);
tasklist_top=grealloc(tasklist_top,taskcount*4);
task_info=grealloc(task_info,taskcount);
tasklist_events=grealloc(tasklist_events,taskcount*sizeof(int));
}
return i;
}
*/
void task_terminating();
/*
int32_t getflags();
#pragma aux getflags = \
"pushfd"\
"pop eax"\
;*/
/*
int add_task(int stack,void *name,...)
{
int task,i;
int32_t *sp,*spp;
task=create_task();
if (task==-1)
{
send_message(E_MEMERROR);
return -1;
}
sp=malloc(stack);
if (sp==NULL)
{
send_message(E_MEMERROR);
return -1;
}
spp=(int32_t *)((char *)sp+stack-17*4);
memset(sp,0,stack);
memcpy(spp,&name,17*4);
*spp=(int32_t )task_terminating;
spp--;*spp=(int32_t)name;
for(i=0;i<9;i++)
{
spp--;
*spp=0;
if (i==5) *spp=(int32_t)((char *)sp+stack);
}
tasklist_low[task]=(void *)sp;
tasklist_top[task]=(void *)((char *)sp+stack);
tasklist_sp[task]=(void *)spp;
task_info[task]=TASK_RUNNING;
return task;
}
void term_task(int id_num)
{
task_info[id_num]=TASK_TERMINATING;
return;
}
char is_running(int id_num)
{
return tasklist_sp[id_num]!=NULL;
}
static void suspend_task(int id_num,int msg)
{
task_info[id_num]|=TASK_EVENT_WAITING;
tasklist_events[id_num]=msg;
}
void shut_down_task(int id_num)
{
free(tasklist_low[id_num]);
tasklist_sp[id_num]=0;
if (nexttask==id_num) nexttask=0;
}
*/
/*void raise_error(int error_number)
{
longjmp(jmpenv,error_number);
}
*/
/*static void unsuspend_task_by_event(EVENT_MSG *msg,int **idnum)
{
if (msg->msg==E_INIT)
{
*idnum=New(int);
**idnum=*(int *)msg->data;
}
else
{
int nt=nexttask;
nexttask=**idnum;
free(*idnum);
*idnum=NULL;
task_info[nexttask]&=~TASK_EVENT_WAITING;
task_sleep(msg->data);
msg->msg=-2;
nexttask=nt;
}
}
*/
/*void *task_wait_event(int32_t event_number)
{
if (!curtask) return NULL;
suspend_task(curtask,event_number);
return task_sleep();
}
*/

View file

@ -35,26 +35,29 @@
#define TASK_RUNNING 0
#define TASK_TERMINATING 1
#define TASK_EVENT_WAITING 2
//#define shift_msg(msgg,tg) ((tg.msg=*(int32_t *)msgg->data),(tg.data=(void *)((int32_t *)msgg->data+1)))
#define EVENT_BUFF_SIZE 16
typedef void (*EV_PROC)(void *,void *) ;
#define PROC_GROUP (EV_PROC )1
//typedef struct event_list
// {
// int32_t *table; //tabulka udalosti
// EV_PROC *procs; //co se ma pri danne udalosti stat
// void *(*user_data); //ukazatel na uzivatelska data
// char *zavora; //1 znamena ze udalost je povolena
// int32_t max_events; // maximalni pocet udalosti, na ktere je system rezervova
// int32_t count; //aktualni pocet udalosti
// }EVENT_LIST;
typedef struct event_msg
{
///message ID
int32_t msg;
///message data
va_list data;
}EVENT_MSG;
typedef void (*EV_PROC)(const EVENT_MSG *,void **) ;
/* event procedura ma dva parametry
@ -87,12 +90,6 @@ typedef struct t_event_root
T_EVENT_POINT *list;
}T_EVENT_ROOT;
typedef struct event_msg
{
int32_t msg;
va_list data;
}EVENT_MSG;
extern char exit_wait; // 1 - opousti aktivni cekaci event;
extern char freeze_on_exit; //1 - po opusteni udalosti cela cesta uzamcena
extern char *otevri_zavoru;

View file

@ -74,17 +74,30 @@ void mgif_install_proc(MGIF_PROC proc)
show_proc=proc;
}
struct mgif_header load_mgif_header(char **mgif) {
struct mgif_header r;
char *iter = *mgif;
memcpy(r.sign, iter, 4); iter+=4;
memcpy(r.year, iter, 2); iter+=2;
r.eof = *iter++;
memcpy(&r.ver, iter, 2); iter+=2;
memcpy(&r.frames, iter, 4); iter+=4;
memcpy(&r.snd_chans, iter, 2); iter+=2;
memcpy(&r.snd_freq, iter, 4); iter+=4;
memcpy(r.ampl_table, iter, sizeof(r.ampl_table)); iter+=sizeof(r.ampl_table);
iter += 64;
*mgif = iter;
return r;
}
void *open_mgif(void *mgif) //vraci ukazatel na prvni frame
{
char *c;
struct mgif_header *mgh;
char *c = mgif;
struct mgif_header mgh = load_mgif_header(&c);
c=mgif;
if (strncmp(c,MGIF,4)) return NULL;
mgh=mgif;
mgif_frames=mgh->frames;
if (strncmp(mgh.sign,MGIF,4)) return NULL;
mgif_frames=mgh.frames;
cur_frame=0;
c+=sizeof(*mgh);
init_lzw_compressor(8);
if (lzw_buffer==NULL) lzw_buffer=getmem(LZW_BUFFER);
return c;
@ -100,34 +113,22 @@ void close_mgif(void) //dealokuje buffery pro prehravani
int input_code(void *source,int32_t *bitepos,int bitsize,int mask)
{
int32_t ofs = *bitepos >> 3;
int32_t shf = *bitepos & 0x7;
uint8_t *src = source;
uint8_t val1 = src[ofs];
uint8_t val2 = src[ofs+1];
uint16_t val = val1 + val2 * 256;
*bitepos+=bitsize;
return val >> shf;
/*
__asm
{
mov esi,source
mov edi,bitepos
mov ebx,bitsize
mov edx,mask
uint8_t *esi = source; // mov esi,source
int32_t *edi = bitepos; // mov edi,bitepos
int ebx = bitsize; // mov ebx,bitsize
int edx = mask; // mov edx,mask
mov ecx,[edi]
mov eax,ecx
shr eax,3
mov eax,[esi+eax]
and cl,7
shr eax,cl
and eax,edx
add [edi],ebx
}
*/
int ecx = *edi; // mov ecx,[edi]
int eax = ecx; // mov eax,ecx
eax >>=3; // shr eax,3
eax = esi[eax] | (esi[eax+1] << 8) | (esi[eax+2] << 16) | (esi[eax+3] << 24);
// mov eax,[esi+eax]
ecx &= 7; // and cl,7
eax >>= ecx; // shr eax,cl
eax &= edx; // and eax,edx
(*edi) += ebx; // add [edi],ebx
return eax;
}
//#pragma aux input_code parm [esi][edi][ebx][edx]=\ value[eax] modify [ecx];
int de_add_code(int group,int chr,int mask)
@ -144,10 +145,56 @@ int de_add_code(int group,int chr,int mask)
return mask;
}
int fast_expand_code(DOUBLE_S *compress_dic, int code,uint8_t **target, uint8_t *old_value)
int fast_expand_code(const DOUBLE_S *compress_dic, int code,uint8_t **target, uint8_t *old_value)
{
int eax = code; //mov eax,code
uint8_t ** edi = target; //mov edi,target
//cmp eax,256
if (eax < 256) { //jnc expand
uint8_t *esi = *edi; //mov esi,[edi]
++(*edi); //inc dword ptr [edi]
uint8_t bl = (uint8_t)eax; //mov bl,al
uint8_t al = bl + *old_value; //add al,old_value
*esi = al; // mov [esi],al
*old_value = al; // mov old_value,al
return bl; // jmp end
}
//expand:
const DOUBLE_S *ebx = compress_dic; // mov ebx,compress_dic
const DOUBLE_S *ecx = ebx+eax; // lea ecx,[eax*8+ebx]
eax = ecx->first; // movzx eax,short ptr [ecx+4] // first
*target += eax; // add [edi],eax
int save_eax = eax; // push eax
uint8_t *esi = *edi; // mov esi,[edi] //esi - target ptr
do { //eloop:
eax = ecx->chr; //movzx eax,short ptr [ecx+2] // chr
*esi = (uint8_t)(eax); //mov [esi],al
--esi; //dec esi
eax = ecx->group; //movzx eax,short ptr [ecx] //group
ecx = ebx+eax; //lea ecx,[eax*8+ebx]
//cmp eax,256
} while (eax >= 256 ); //jnc eloop
uint8_t bl = (uint8_t)eax; //mov bl,al
uint8_t al = bl + *old_value; //add al,old_value
*esi = al; //mov [esi],al
++(*edi); //inc dword ptr [edi]
int ecx2 = save_eax; //pop ecx
do { //elp2
++esi; //inc esi
al = al + *esi; //add al,[esi]
*esi = al; //mov [esi],al
--ecx2; //dec ecx
} while (ecx2 > 0); //jnz elp2
*old_value =al; //mov old_value,al
return bl; //movzx eax,bl
// }
#if 0
uint8_t out;
uint8_t w;
if (code >= 256) {
@ -178,10 +225,11 @@ int fast_expand_code(DOUBLE_S *compress_dic, int code,uint8_t **target, uint8_t
out = (uint8_t) code;
w = out + *old_value;
*old_value = w;
**target = out;
**target = w;
(*target)++;
}
return out;
#endif
/*
_asm
{
@ -228,25 +276,24 @@ end:
*/
}
void lzw_decode(void *source,char *target)
{
int32_t bitpos=0;
register int code;
int code;
int old,i;
//int group,chr;
int old_first;
register int mask=0xff;
uint8_t old_value;
for(i=0;i<LZW_MAX_CODES;i++) compress_dic[i].first=0;
uint8_t *t = (uint8_t *)target;
clear:
old_value=0;
int mask=0xff;
nextgroup=free_code;
bitsize=init_bitsize;
mask=(1<<bitsize)-1;
code=input_code(source,&bitpos,bitsize,mask);
uint8_t *t = (uint8_t *)target;
old_first=fast_expand_code(compress_dic,code,&t,&old_value);
old=code;
while ((code=input_code(source,&bitpos,bitsize,mask))!=end_code)
@ -274,14 +321,71 @@ void lzw_decode(void *source,char *target)
}
}
typedef struct frame_header_t {
uint32_t size;
uint8_t count;
} FRAME_HEADER_T;
typedef struct chunk_header_t {
uint32_t size;
uint8_t type;
} CHUNK_HEADER_T;
CHUNK_HEADER_T read_chunk_header(char **iter) {
CHUNK_HEADER_T ret;
ret.type = *(uint8_t *)(*iter)++;
ret.size = *(uint8_t *)(*iter)++;
ret.size |= *(uint8_t *)(*iter)++ << 8;
ret.size |= *(uint8_t *)(*iter)++ << 16;
return ret;
}
FRAME_HEADER_T read_frame_header(char **iter) {
FRAME_HEADER_T ret;
ret.count = *(uint8_t *)(*iter)++;
ret.size = *(uint8_t *)(*iter)++;
ret.size |= *(uint8_t *)(*iter)++ << 8;
ret.size |= *(uint8_t *)(*iter)++ << 16;
return ret;
}
void *mgif_play(void *mgif) //dekoduje a zobrazi frame
{
char *pf,*pc,*ff;
int acts,size,act,csize;
// int acts,size,act,csize;
void *scr_sav;
int scr_act=-1;
pf=mgif;
FRAME_HEADER_T frame_hdr = read_frame_header(&pf);
pc = pf;
pf += frame_hdr.size;
for (uint8_t i = 0; i < frame_hdr.count; ++i) {
CHUNK_HEADER_T chunk_hdr = read_chunk_header(&pc);
if (chunk_hdr.type == MGIF_LZW || chunk_hdr.type == MGIF_DELTA) {
ff=lzw_buffer;
lzw_decode(pc,ff);
scr_sav=ff;
scr_act=chunk_hdr.type;
} else if (chunk_hdr.type==MGIF_COPY) {
//scr_sav=ff;scr_act=act;
//strange code
scr_sav = pc;
scr_act = chunk_hdr.type;
} else {
show_proc(chunk_hdr.type,pc,chunk_hdr.size);
}
pc+=chunk_hdr.size;
}
if (scr_act!=-1) show_proc(scr_act,scr_sav,0);
cur_frame+=1;
if (cur_frame==mgif_frames) return NULL;
return pf;
}
/*
acts=*pf++;
size=(*(int *)pf) & 0xffffff;
pf+=3;pc=pf;pf+=size;
@ -316,7 +420,7 @@ void *mgif_play(void *mgif) //dekoduje a zobrazi frame
*/

View file

@ -27,7 +27,7 @@ typedef struct mgif_header
word ver;
int32_t frames;
word snd_chans;
int snd_freq;
int32_t snd_freq;
short ampl_table[256];
short reserved[32];
}MGIF_HEADER_T;

View file

@ -3,6 +3,7 @@
#include <mgfplay.h>
#include <bgraph.h>
#include <assert.h>
void show_full_lfb12e(void *target, void *buff, void *paleta) {
uint16_t *edi = (uint16_t *)target;
@ -20,77 +21,6 @@ void show_full_lfb12e(void *target, void *buff, void *paleta) {
dl--;
} while (dl != 0);
}
/*
void show_full_lfb12e(void *target,void *buff,void *paleta)
{
__asm
{
mov edi,target
mov esi,buff
mov ebx,paleta
;edi - target
;esi - source
;ebx - palette
push ebp
mov dl,180
shfl2: mov ecx,160
shfl1: lodsw
movzx ebp,al
movzx ebp,short ptr ds:[ebp*2+ebx]
movzx eax,ah
movzx eax,short ptr ds:[eax*2+ebx]
shl eax,16
or eax,ebp
stosd
dec ecx
jnz shfl1
dec dl
jnz shfl2
pop ebp
}
}
*/
/*
void show_delta_lfb12e(void *target, void *buff, void *paleta) {
uint8_t *edi = (uint8_t *)target;
uint8_t *esi = (uint8_t *)buff + 4; // skip pointer
uint8_t *ebx = (uint8_t *)paleta;
uint8_t cl = 180; // remaining lines
uint8_t ch, al;
uint16_t *edx = (uint16_t *)esi; // start of delta map
esi += *(uint32_t *)(esi - 4); // start of data
while (cl > 0) {
uint8_t *line_address = edi; // save line address
ch = *edx++; // read _skip_ value
al = ch;
al |= 0x3F; // test if the two highest bits are set
al++;
if (al == 0) { // if yes - skip lines
ch &= 0x3F; // mask the upper 2 bits
edi += (ch == 0) ? 640 : 0; // skip line if ch is 0
cl--; // decrement line counter
continue; // continue to next iteration
}
uint32_t eax = (uint32_t)ch; // expand _skip_ value to eax
edi += eax * 4; // calculate new position on screen
ch = *edx++; // read _copy_ value
for (uint8_t i = 0; i < ch; i++) {
uint16_t ebp = *(uint16_t *)(ebx + (al * 2)); // get color from palette
uint16_t color = *(uint16_t *)(ebx + (eax * 2)); // get color from palette
eax = (color << 16) | ebp; // combine colors
*(uint32_t *)edi = eax; // store the color
edi += 4; // move to the next pixel
}
edi += 640; // skip line
cl--; // decrement line counter
}
}
*/
static __inline uint32_t read_uint32(uint8_t *from) {
uint32_t a = from[0];
uint32_t b = from[1];
@ -117,6 +47,7 @@ void show_delta_lfb12e(void *target,void *buff,void *paleta)
uint8_t cl = 180;
// mov cl,180 ;cl pocet zbyvajicich radek
uint32_t offset = read_uint32(esi);
assert(offset != 0);
// add esi,4 ;preskoc ukazatel
esi += 4;
uint8_t *edx = esi;
@ -132,7 +63,7 @@ void show_delta_lfb12e(void *target,void *buff,void *paleta)
// inc edx
// or al,03fh ;test zda jsou 2 nejvyssi bity nastaveny
// inc al
if ((ch & 0xC0) == 0) {
if ((ch & 0xC0) != 0xC0) {
// jz shdl3 ;ano - preskakovani radku
edi += ((uint32_t)ch) << 1;
// movzx eax,ch ;expanduj _skip_ hodnotu do eax
@ -141,6 +72,7 @@ void show_delta_lfb12e(void *target,void *buff,void *paleta)
// mov ch,[edx] ;cti _copy_ hodnotu
// inc edx
assert(ch <= 160);
while (ch) {
uint8_t a = *data++;
*edi++ = ebx[a];
@ -162,10 +94,15 @@ void show_delta_lfb12e(void *target,void *buff,void *paleta)
// jmp shdl2 ;pokracuj _skip_ hodnotou
} else {
ch &= 0x3F;
++ch;
if (ch > cl) ch = cl;
line_beg += 320*ch;
cl -= ch;
if (ch == 0) {
line_beg += 320;
--cl;
} else {
++ch;
assert(ch <= cl);
cl-=ch;
line_beg += 320*(int)ch;
}
edi = line_beg;
}

View file

@ -80,7 +80,7 @@ void SDLContext::init_screen(DisplayMode mode, const char *title) {
}
_window.reset(window);
SDL_Renderer *renderer = SDL_CreateRenderer(_window.get(), -1, SDL_RENDERER_SOFTWARE);
SDL_Renderer *renderer = SDL_CreateRenderer(_window.get(), -1, 0);
if (!renderer) {
snprintf(buff,sizeof(buff), "Chyba při vytváření rendereru: %s\n", SDL_GetError());
throw std::runtime_error(buff);
@ -178,13 +178,14 @@ void SDLContext::event_loop(std::stop_token stp) {
int button = e.button.button;
int up = e.type == SDL_MOUSEBUTTONUP?1:0;
ms_event.event = 1;
ms_event.event_type = (1<<(2*button-1+up));
int shift = 0;
switch (button) {
default: break;
case 1: ms_event.tl1 = !up; break;
case 2: ms_event.tl3 = !up; break;
case 3: ms_event.tl2 = !up; break;
case 1: ms_event.tl1 = !up; shift = 1; break;
case 2: ms_event.tl3 = !up; shift = 5; break;
case 3: ms_event.tl2 = !up; shift = 3; break;
}
ms_event.event_type = (1<<(shift+up));
}
}

View file

@ -1,6 +1,7 @@
#include "../platform.h"
#include <zvuk.h>
#include <thread>
void set_mixing_device(int mix_dev,int mix_freq,...) {
}
@ -67,7 +68,8 @@ void *PrepareVideoSound(int mixfreq, int buffsize) {
return 0;
}
char LoadNextVideoFrame(void *buffer, char *data, int size, short *xlat, short *accnums, int32_t *writepos) {
return 0;
std::this_thread::sleep_for(std::chrono::milliseconds(50));
return 1;
}
void DoneVideoSound(void *buffer) {