/* // // Copyright (C) 2006-2026 Jean-François DEL NERO // // This file is part of HxCFloppyEmulator. // // HxCFloppyEmulator may be used and distributed without restriction provided // that this copyright statement is not removed from the file and that any // derivative work contains the original copyright notice and the associated // disclaimer. // // HxCFloppyEmulator is free software; you can redistribute it // and/or modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // HxCFloppyEmulator is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with HxCFloppyEmulator; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // */ /////////////////////////////////////////////////////////////////////////////////// //-------------------------------------------------------------------------------// //-------------------------------------------------------------------------------// //-----------H----H--X----X-----CCCCC----22222----0000-----0000------11----------// //----------H----H----X-X-----C--------------2---0----0---0----0--1--1-----------// //---------HHHHHH-----X------C----------22222---0----0---0----0-----1------------// //--------H----H----X--X----C----------2-------0----0---0----0-----1-------------// //-------H----H---X-----X---CCCCC-----222222----0000-----0000----1111------------// //-------------------------------------------------------------------------------// //----------------------------------------------------- http://hxc2001.free.fr --// /////////////////////////////////////////////////////////////////////////////////// // File : microintro.c // Contains: About dialog animation // // Written by: Jean-François DEL NERO // // Change History (most recent first): /////////////////////////////////////////////////////////////////////////////////// #include #include #include #include #ifdef WIN32 #include #endif #include #include "hxcmod.h" #include "microintro.h" #include "packer/pack.h" #include "data/data_bmp_sob_bmp.h" #include "data/data_bmp_hxc2001_bmp.h" #include "data/data_jozz_cognition_mod.h" #include "data/data_maktone_class_cracktro15_mod.h" #include "data/data_vim_not_again_mod.h" #include "data/data_zandax_supplydas_booze_mod.h" #include "data/data_meo_sleeping_waste_mod.h" #include "data/data_nao_gabber_astro_mod.h" #include "data/data_jason_shortness_mod.h" #include "data/data_physical_presence_mod.h" #if defined(M_PI) #define PI M_PI #else #define PI ((double)(3.1415926535897932384626433832795)) #endif typedef struct scrolltab_ { int ysrc; int ydst; int len; int speed; int offset; }scrolltab; scrolltab scroll[]= { {240,5,52,1,0}, // ciel {0,80,74,48,0}, // montagnes {74,154,2,60,0}, // pelouse... {76,156,4,80,0}, {80,160,8,100,0}, {88,168,8,120,0}, {96,176,12,140,0}, {142,76,6,20,0}, {148,66,10,40,0}, {158,46,20,80,0}, {178,15,40,120,0}, {-2,0,22, 160,0}, {218,0,22, 160,0}, {108,166,34,160,0}, // barrieres {-1,0,0,0,0} }; static int modcnt=0; void putsprite(uintro_context * democontext,unsigned int x,unsigned int y,unsigned int * buffer,unsigned int sx,unsigned int sy,unsigned int * sprite) { int f4; unsigned int start,i,j,t2,adr; unsigned char ty; t2=0; start = y*democontext->xsize+x; j=0; democontext->sprt_f1 += 83443; democontext->sprt_f2 += 1669; f4 = democontext->sprt_f1 >> 10; if(democontext->xsize<=(111+x)) t2=(111+x)-democontext->xsize; for(j=0;jsincos_table[ ((democontext->sprt_f2 >> 10) + 256) & (SINCOS_TABLE_SIZE - 1)] ) >> 3 ); ty = (unsigned char)((( democontext->sincos_table[ f4 & (SINCOS_TABLE_SIZE - 1)] * 2 ) >> 10) + 4 ); if(democontext->xsize<=(111+x+ty)) t2=(111+x+ty)-democontext->xsize; else t2=0; for(i=0;i<(sx-t2);i++) { adr=(j*democontext->xsize+i+start+ty); if(adr<(unsigned int)(democontext->xsize*democontext->ysize)) { buffer[adr]=sprite[j*sx+i]; } } } } void convert8b16b(bmaptype * img,unsigned short transcolor) { int i,j; unsigned int * newbuffer; unsigned char palletteindex; unsigned char r,v,b; switch(img->type) { case 9: newbuffer = malloc(img->Ysize*img->Xsize*sizeof(unsigned int )); if(!newbuffer) return; for(i=0;iYsize;i++) { for(j=0;jXsize;j++) { // 11111 000000 11111 palletteindex = img->unpacked_data[3*256+((i*img->Xsize)+j)]; b = img->unpacked_data[palletteindex*3]; v = img->unpacked_data[palletteindex*3+1]; r = img->unpacked_data[palletteindex*3+2]; newbuffer[(i*img->Xsize)+j]=b | (v<<8) | (r<<16);// /*0x1F |*/ /*(0x7E<<4) */(0x1F <<11);//img->data[palletteindex+1]>>3; } } free(img->unpacked_data); img->unpacked_data=(unsigned char*)newbuffer; break; case 1: newbuffer=malloc(img->Ysize*img->Xsize*sizeof(unsigned int )); if(!newbuffer) return; for(i=0;i<((img->Ysize*img->Xsize)/8);i++) { for(j=0;j<8;j++) { if(img->unpacked_data[i]&(0x80>>j)) newbuffer[i*8+j]=0xFFFF; else newbuffer[i*8+j]=0; } } free(img->unpacked_data); img->unpacked_data=(unsigned char*)newbuffer; break; } } void convert8b24b(bmaptype * img,unsigned short transcolor) { int i,j; unsigned char * newbuffer; unsigned char palletteindex; unsigned char r,v,b; switch(img->type) { case 9: newbuffer=malloc(img->Ysize*img->Xsize*3); if(!newbuffer) return; for(i=0;iYsize;i++) { for(j=0;jXsize;j++) { // 11111 000000 11111 palletteindex=img->unpacked_data[3*256+((i*img->Xsize)+j)]; b = img->unpacked_data[palletteindex*3]; v = img->unpacked_data[palletteindex*3+1]; r = img->unpacked_data[palletteindex*3+2]; newbuffer[((i*img->Xsize)*3)+j*3+0] = r; newbuffer[((i*img->Xsize)*3)+j*3+1] = v; newbuffer[((i*img->Xsize)*3)+j*3+2] = b; } } free(img->unpacked_data); img->unpacked_data=(unsigned char*)newbuffer; break; case 1: newbuffer=malloc(img->Ysize*img->Xsize*3); if(!newbuffer) return; for(i=0;i<((img->Ysize*img->Xsize)/8);i++) { for(j=0;j<8;j++) { if(img->unpacked_data[i]&(0x80>>j)) { newbuffer[(i*8)*3+(j*3)+0]=0xFF; newbuffer[(i*8)*3+(j*3)+1]=0xFF; newbuffer[(i*8)*3+(j*3)+2]=0xFF; } else { newbuffer[(i*8)*3+(j*3)+0]=0x00; newbuffer[(i*8)*3+(j*3)+1]=0x00; newbuffer[(i*8)*3+(j*3)+2]=0x00; } } } free(img->unpacked_data); img->unpacked_data=(unsigned char*)newbuffer; break; } } uintro_context * uintro_init(unsigned short xsize,unsigned short ysize) { uintro_context * ui_context; int i; ui_context=(uintro_context *)calloc( 1, sizeof(uintro_context)); if(!ui_context) return NULL; ui_context->xsize=xsize; ui_context->ysize=ysize; ui_context->tick=0; ui_context->framebuffer = (unsigned int *)calloc( 1, ui_context->xsize*ui_context->ysize*sizeof(unsigned int)); ui_context->blurbuffer = (unsigned int *)calloc( 1, ui_context->xsize*ui_context->ysize*sizeof(unsigned int)); if( !ui_context->framebuffer || !ui_context->blurbuffer ) { free(ui_context->blurbuffer); free(ui_context->framebuffer); free(ui_context); return NULL; } // Precalc sin / cos table. for(i=0;isincos_table[i] = cos( ( (double)i / (double)SINCOS_TABLE_SIZE) * 2.0 * PI ) * SINCOS_TABLE_MAX; } bitmap_sob_bmp->unpacked_data = data_unpack(bitmap_sob_bmp->data,bitmap_sob_bmp->csize ,bitmap_sob_bmp->data, bitmap_sob_bmp->size); convert8b16b(bitmap_sob_bmp,(unsigned short)0xFFFF); bitmap_hxc2001_bmp->unpacked_data = data_unpack(bitmap_hxc2001_bmp->data,bitmap_hxc2001_bmp->csize ,bitmap_hxc2001_bmp->data, bitmap_hxc2001_bmp->size); convert8b16b(bitmap_hxc2001_bmp,(unsigned short)0xFFFF); ui_context->modctx = malloc( sizeof(modcontext) ); if(ui_context->modctx) { memset( ui_context->modctx, 0, sizeof(modcontext)); hxcmod_init( (modcontext*)ui_context->modctx ); hxcmod_setcfg( (modcontext*)ui_context->modctx, 44100, 1, 1); switch(modcnt&7) { case 0: data_nao_gabber_astro_mod->unpacked_data=data_unpack(data_nao_gabber_astro_mod->data,data_nao_gabber_astro_mod->csize ,data_nao_gabber_astro_mod->data, data_nao_gabber_astro_mod->size); hxcmod_load((modcontext*)ui_context->modctx, (void*)data_nao_gabber_astro_mod->unpacked_data, data_nao_gabber_astro_mod->size); break; case 1: data_physical_presence_mod->unpacked_data=data_unpack(data_physical_presence_mod->data,data_physical_presence_mod->csize ,data_physical_presence_mod->data, data_physical_presence_mod->size); hxcmod_load((modcontext*)ui_context->modctx, (void*)data_physical_presence_mod->unpacked_data, data_physical_presence_mod->size); break; case 2: data_zandax_supplydas_booze_mod->unpacked_data=data_unpack(data_zandax_supplydas_booze_mod->data,data_zandax_supplydas_booze_mod->csize ,data_zandax_supplydas_booze_mod->data, data_zandax_supplydas_booze_mod->size); hxcmod_load((modcontext*)ui_context->modctx, (void*)data_zandax_supplydas_booze_mod->unpacked_data, data_zandax_supplydas_booze_mod->size); break; case 3: data_jason_shortness_mod->unpacked_data=data_unpack(data_jason_shortness_mod->data,data_jason_shortness_mod->csize ,data_jason_shortness_mod->data, data_jason_shortness_mod->size); hxcmod_load((modcontext*)ui_context->modctx, (void*)data_jason_shortness_mod->unpacked_data, data_jason_shortness_mod->size); break; case 4: data_meo_sleeping_waste_mod->unpacked_data=data_unpack(data_meo_sleeping_waste_mod->data,data_meo_sleeping_waste_mod->csize ,data_meo_sleeping_waste_mod->data, data_meo_sleeping_waste_mod->size); hxcmod_load((modcontext*)ui_context->modctx, (void*)data_meo_sleeping_waste_mod->unpacked_data, data_meo_sleeping_waste_mod->size); break; case 5: data_maktone_class_cracktro15_mod->unpacked_data=data_unpack(data_maktone_class_cracktro15_mod->data,data_maktone_class_cracktro15_mod->csize ,data_maktone_class_cracktro15_mod->data, data_maktone_class_cracktro15_mod->size); hxcmod_load((modcontext*)ui_context->modctx, (void*)data_maktone_class_cracktro15_mod->unpacked_data, data_maktone_class_cracktro15_mod->size); break; case 6: data_jozz_cognition_mod->unpacked_data=data_unpack(data_jozz_cognition_mod->data,data_jozz_cognition_mod->csize ,data_jozz_cognition_mod->data, data_jozz_cognition_mod->size); hxcmod_load((modcontext*)ui_context->modctx, (void*)data_jozz_cognition_mod->unpacked_data, data_jozz_cognition_mod->size); break; case 7: data_vim_not_again_mod->unpacked_data=data_unpack(data_vim_not_again_mod->data,data_vim_not_again_mod->csize ,data_vim_not_again_mod->data, data_vim_not_again_mod->size); hxcmod_load((modcontext*)ui_context->modctx, (void*)data_vim_not_again_mod->unpacked_data, data_vim_not_again_mod->size); break; } modcnt++; } return ui_context; } void uintro_reset(uintro_context * ui_context) { if(!ui_context) return; ui_context->col_f1 = 0; ui_context->col_f2 = 0; ui_context->col_f3 = 0; ui_context->col_f1s = 0; ui_context->col_f2s = 0; ui_context->col_f3s = 0; ui_context->f1=0; ui_context->f2=0; ui_context->sprt_f1=0; ui_context->sprt_f2=0; ui_context->tick = 0; memset(ui_context->framebuffer,0,ui_context->xsize*ui_context->ysize*sizeof(unsigned int)); memset(ui_context->blurbuffer,0,ui_context->xsize*ui_context->ysize*sizeof(unsigned int)); hxcmod_init( (modcontext*)ui_context->modctx ); hxcmod_setcfg( (modcontext*)ui_context->modctx, 44100, 1, 1); switch(modcnt&7) { case 0: if(!data_nao_gabber_astro_mod->unpacked_data) data_nao_gabber_astro_mod->unpacked_data=data_unpack(data_nao_gabber_astro_mod->data,data_nao_gabber_astro_mod->csize ,data_nao_gabber_astro_mod->data, data_nao_gabber_astro_mod->size); hxcmod_load((modcontext*)ui_context->modctx, (void*)data_nao_gabber_astro_mod->unpacked_data, data_nao_gabber_astro_mod->size); break; case 1: if(!data_physical_presence_mod->unpacked_data) data_physical_presence_mod->unpacked_data=data_unpack(data_physical_presence_mod->data,data_physical_presence_mod->csize ,data_physical_presence_mod->data, data_physical_presence_mod->size); hxcmod_load((modcontext*)ui_context->modctx, (void*)data_physical_presence_mod->unpacked_data, data_physical_presence_mod->size); break; case 2: if(!data_zandax_supplydas_booze_mod->unpacked_data) data_zandax_supplydas_booze_mod->unpacked_data=data_unpack(data_zandax_supplydas_booze_mod->data,data_zandax_supplydas_booze_mod->csize ,data_zandax_supplydas_booze_mod->data, data_zandax_supplydas_booze_mod->size); hxcmod_load((modcontext*)ui_context->modctx,(void*)data_zandax_supplydas_booze_mod->unpacked_data,data_zandax_supplydas_booze_mod->size); break; case 3: if(!data_jason_shortness_mod->unpacked_data) data_jason_shortness_mod->unpacked_data=data_unpack(data_jason_shortness_mod->data,data_jason_shortness_mod->csize ,data_jason_shortness_mod->data, data_jason_shortness_mod->size); hxcmod_load((modcontext*)ui_context->modctx, (void*)data_jason_shortness_mod->unpacked_data, data_jason_shortness_mod->size); break; case 4: if(!data_meo_sleeping_waste_mod->unpacked_data) data_meo_sleeping_waste_mod->unpacked_data=data_unpack(data_meo_sleeping_waste_mod->data,data_meo_sleeping_waste_mod->csize ,data_meo_sleeping_waste_mod->data, data_meo_sleeping_waste_mod->size); hxcmod_load((modcontext*)ui_context->modctx, (void*)data_meo_sleeping_waste_mod->unpacked_data, data_meo_sleeping_waste_mod->size); break; case 5: if(!data_maktone_class_cracktro15_mod->unpacked_data) data_maktone_class_cracktro15_mod->unpacked_data=data_unpack(data_maktone_class_cracktro15_mod->data,data_maktone_class_cracktro15_mod->csize ,data_maktone_class_cracktro15_mod->data, data_maktone_class_cracktro15_mod->size); hxcmod_load((modcontext*)ui_context->modctx,(void*)data_maktone_class_cracktro15_mod->unpacked_data,data_maktone_class_cracktro15_mod->size); break; case 6: if(!data_jozz_cognition_mod->unpacked_data) data_jozz_cognition_mod->unpacked_data=data_unpack(data_jozz_cognition_mod->data,data_jozz_cognition_mod->csize ,data_jozz_cognition_mod->data, data_jozz_cognition_mod->size); hxcmod_load((modcontext*)ui_context->modctx,(void*)data_jozz_cognition_mod->unpacked_data,data_jozz_cognition_mod->size); break; case 7: if(!data_vim_not_again_mod->unpacked_data) data_vim_not_again_mod->unpacked_data=data_unpack(data_vim_not_again_mod->data,data_vim_not_again_mod->csize ,data_vim_not_again_mod->data, data_vim_not_again_mod->size); hxcmod_load((modcontext*)ui_context->modctx,(void*)(data_vim_not_again_mod->unpacked_data),data_vim_not_again_mod->size); break; } modcnt++; } void uintro_getnext_soundsample(uintro_context * democontext,short* buffer,int size) { if(!democontext) return; hxcmod_fillbuffer( (modcontext*)democontext->modctx, buffer, size/2,0); } void colorize(uintro_context * democontext,bmaptype * bitmaptype) { int i,j; unsigned int * ptr; unsigned char r,v,b; ptr=(unsigned int *)bitmaptype->unpacked_data; democontext->col_f1 = democontext->col_f1s; democontext->col_f2 = democontext->col_f2s; democontext->col_f3 = democontext->col_f3s; for(i=0;iYsize;i++) { for(j=0;jXsize;j++) { if(ptr[i*bitmaptype->Xsize + j]) { r = (( democontext->sincos_table[ (democontext->col_f1>> 10) & (SINCOS_TABLE_SIZE - 1)] * 120 ) >> 10) + 129; v = (( democontext->sincos_table[ ((democontext->col_f2>> 10) + 256 /*+90° : sin*/) & (SINCOS_TABLE_SIZE - 1)] * 120 ) >> 10) + 129; b = (( democontext->sincos_table[ (democontext->col_f3>> 10) & (SINCOS_TABLE_SIZE - 1)] * 120 ) >> 10) + 129; ptr[i*bitmaptype->Xsize + j]=(r<<16)|(v<<8)|b; } democontext->col_f1 += 16; democontext->col_f2 += 17; democontext->col_f3 += 18; } } democontext->col_f1s += 5007; //(((0.03 / (2.0 * PI))*SINCOS_TABLE_SIZE) * 1024); democontext->col_f2s += 5507; //(((0.033 / (2.0 * PI))*SINCOS_TABLE_SIZE) * 1024); democontext->col_f3s += 5557; //(((0.0333 / (2.0 * PI))*SINCOS_TABLE_SIZE) * 1024); } void uintro_getnextframe(uintro_context * democontext) { int i,j,k,l,totalpix; int x_coef_motion,y_coef_motion; unsigned int * src_ptr; unsigned int * dst_ptr; unsigned int * framebuffer; unsigned int * blurbuffer; int xsize,ysize,baroffset; unsigned int pix; if(!democontext) return; xsize = democontext->xsize; ysize = democontext->ysize; totalpix = xsize * ysize; framebuffer = democontext->framebuffer; blurbuffer = democontext->blurbuffer; democontext->tick++; if(democontext->tick>=50) { democontext->tick=0; } k=0; for(i=0;ixsize-(bitmap_hxc2001_bmp->Xsize+5))/4; y_coef_motion=(democontext->ysize-bitmap_hxc2001_bmp->Ysize)/4; memset(democontext->blurbuffer,0,democontext->xsize*democontext->ysize*4); putsprite(democontext, (( democontext->sincos_table[ (democontext->f1>> 10) & (SINCOS_TABLE_SIZE - 1)] * x_coef_motion ) >> 10) + (x_coef_motion*2), (( democontext->sincos_table[ (democontext->f2>> 10) & (SINCOS_TABLE_SIZE - 1)] * y_coef_motion ) >> 10) + (y_coef_motion*2), democontext->blurbuffer, bitmap_hxc2001_bmp->Xsize, bitmap_hxc2001_bmp->Ysize, (unsigned int*)bitmap_hxc2001_bmp->unpacked_data); democontext->f1 += 18357; //(((0.11 / (2.0 * PI))*SINCOS_TABLE_SIZE) * 1024); democontext->f2 += 15020; //(((0.09 / (2.0 * PI))*SINCOS_TABLE_SIZE) * 1024); //////////////////////// while(scroll[k].ysrc!=-1) { if(scroll[k].ysrc!=-2) { l=(((scroll[k].ysrc)*4)*bitmap_sob_bmp->Xsize); baroffset = scroll[k].offset/32; for(i=scroll[k].ydst;i<(scroll[k].ydst+scroll[k].len);i++) { src_ptr = (unsigned int*)&bitmap_sob_bmp->unpacked_data[l]; dst_ptr = (unsigned int*)&framebuffer[i*xsize]; for(j=baroffset;j<(xsize);j++) { pix = *(src_ptr++); if(pix != 0x00FF00) { dst_ptr[j] = pix; } } for(j=0;junpacked_data); free(data_jozz_cognition_mod->unpacked_data); free(data_zandax_supplydas_booze_mod->unpacked_data); free(data_vim_not_again_mod->unpacked_data); if(democontext->modctx) { hxcmod_unload( (modcontext*)democontext->modctx ); free(democontext->modctx); democontext->modctx = NULL; } data_jozz_cognition_mod->unpacked_data=0; data_maktone_class_cracktro15_mod->unpacked_data=0; data_zandax_supplydas_booze_mod->unpacked_data=0; data_vim_not_again_mod->unpacked_data=0; free(bitmap_hxc2001_bmp->unpacked_data); free(bitmap_sob_bmp->unpacked_data); free(democontext->framebuffer); free(democontext->blurbuffer); free(democontext); }