int cl_init(void) { unsigned int i; gfs = gfs_open("data/game.gfs"); if ( gfs == NULL ) return 0; client_frame = 0; /* Bind keys */ cl_cmd_bind("backquote", "console"); cl_cmd_bind("q", "quit"); cl_cmd_bind("w", "+forwards"); cl_cmd_bind("s", "+backwards"); cl_cmd_bind("a", "+strafe_left"); cl_cmd_bind("d", "+strafe_right"); cl_cmd_bind("space", "+jump"); cl_cmd_bind("c", "+crouch"); //if ( !gl_init(1920, 1080, 24, 1) ) if ( !gl_init(1280, 720, 24, 0) ) return 0; if ( !hud_init() ) return 0; #if 0 for(i = 0; i < sizeof(soldier)/sizeof(*soldier); i++) { soldier[i] = md2_new("md2_mdl/monsters/soldier/tris.md2"); if ( soldier[i] ) { vector_t v; v[X] = 50 + 30 * i; v[Y] = 0; v[Z] = 0; md2_skin(soldier[i], i); md2_animate(soldier[i], 146, 214); md2_spawn(soldier[i], v); } } #endif for(i = 0; i < sizeof(marine)/sizeof(*marine); i++) { marine[i] = md5_new("models/md5/chars/marine.md5mesh"); if ( marine[i] ) { vector_t v; v[Z] = 0; v[Y] = 0; v[Z] = 50 + 50 * i; md5_animate(marine[i], anims[i]); md5_spawn(marine[i], v); } } return 1; }
int32 func__loadimage(qbs *f,int32 bpp,int32 passed){ if (new_error) return 0; static int32 isHardware; isHardware=0; if (bpp==33){bpp=32; isHardware=1;} //validate bpp if (passed){ if ((bpp!=32)&&(bpp!=256)){error(5); return 0;} }else{ if (write_page->text){error(5); return 0;} bpp=-1; } if (!f->len) return -1;//return invalid handle if null length string //load the file static int32 fh,result; static int64 lof; fh=gfs_open(f,1,0,0); if (fh<0) return -1; lof=gfs_lof(fh); static uint8* content; content=(uint8*)malloc(lof); if (!content){gfs_close(fh); return -1;} result=gfs_read(fh,-1,content,lof); gfs_close(fh); if (result<0){free(content); return -1;} //Identify format: static int32 format; format=0; //'.png' if (lof>=8){ if ((content[0]==0x89)&&(content[1]==0x50)&&(content[2]==0x4E)&&(content[3]==0x47)&& (content[4]==0x0D)&&(content[5]==0x0A)&&(content[6]==0x1A)&&(content[7]==0x0A)) {format=2; goto got_format;}//PNG }//8 //'.bmp' if (lof>=6){ if ((content[0]==0x42)&&(content[1]==0x4D)){ if ( (*((int32*)(&content[2]))) == lof ){//length of file format=3; goto got_format; } }//BMP }//6 //'.jpg' The first two bytes of every JPEG stream are the Start Of Image (SOI) marker values FFh D8h if (lof>=2){ if ((content[0]==0xFF)&&(content[1]==0xD8)){format=1; goto got_format;}//JP[E]G }//2 //GIF is handled by our "other" library //'.gif' "GIF" //if (lof>=3){ //if ((content[0]==71)&&(content[1]==73)&&(content[2]==70)){format=4; goto got_format;}//GIF //}//3 got_format: static uint8 *pixels; static int32 x,y; if (format==0) pixels=image_decode_other(content,lof,&result,&x,&y); if (format==1) pixels=image_decode_jpg(content,lof,&result,&x,&y); if (format==2) pixels=image_decode_png(content,lof,&result,&x,&y); if (format==3) pixels=image_decode_bmp(content,lof,&result,&x,&y); free(content); if (!(result&1)) return -1; //... static int32 i; i=func__newimage(x,y,32,1); if (i==-1){free(pixels); return -1;} memcpy(img[-i].offset,pixels,x*y*4); free(pixels); if (isHardware){ static int32 iHardware; iHardware=func__copyimage(i,33,1); sub__freeimage(i,1); i=iHardware; } return i; #ifndef NO_S_D_L static qbs *tqbs=NULL,*nullt=NULL; static int32 i; if (new_error) return 0; //validate bpp if (passed){ if ((bpp!=32)&&(bpp!=256)){error(5); return 0;} }else{ if (write_page->text){error(5); return 0;} bpp=-1; } if (!f->len) return -1;//return invalid handle if null length string if (!tqbs) tqbs=qbs_new(0,0); if (!nullt){nullt=qbs_new(1,0); nullt->chr[0]=0;} qbs_set(tqbs,qbs_add(f,nullt)); i=imgload(fixdir(tqbs),bpp); if (!i) return -1;//failed return -i; return -1; #endif //NO_S_D_L }
int32 func__sndopen(qbs* filename,qbs* requirements,int32 passed){ sndsetup(); if (new_error) return 0; static qbs *s1=NULL; if (!s1) s1=qbs_new(0,0); static qbs *req=NULL; if (!req) req=qbs_new(0,0); static qbs *s3=NULL; if (!s3) s3=qbs_new(0,0); static uint8 r[32]; static int32 i,i2,i3; //check requirements memset(r,0,32); if (passed){ if (requirements->len){ i=1; qbs_set(req,qbs_ucase(requirements));//convert tmp str to perm str nextrequirement: i2=func_instr(i,req,qbs_new_txt(","),1); if (i2){ qbs_set(s1,func_mid(req,i,i2-i,1)); }else{ qbs_set(s1,func_mid(req,i,req->len-i+1,1)); } qbs_set(s1,qbs_rtrim(qbs_ltrim(s1))); if (qbs_equal(s1,qbs_new_txt("SYNC"))){r[0]++; goto valid;} if (qbs_equal(s1,qbs_new_txt("VOL"))){r[1]++; goto valid;} if (qbs_equal(s1,qbs_new_txt("PAUSE"))){r[2]++; goto valid;} if (qbs_equal(s1,qbs_new_txt("LEN"))){r[3]++; goto valid;} if (qbs_equal(s1,qbs_new_txt("SETPOS"))){r[4]++; goto valid;} error(5); return 0;//invalid requirements valid: if (i2){i=i2+1; goto nextrequirement;} for (i=0;i<32;i++) if (r[i]>1){error(5); return 0;}//cannot define requirements twice }//->len }//passed qbs_set(s1,qbs_add(filename,qbs_new_txt_len("\0",1)));//s1=filename+CHR$(0) if (!r[0]){//NOT SYNC if (snd_stream_handle){error(5); return 0;}//stream in use } //load file if (s1->len==1) return 0;//return invalid handle if null length string static int32 fh,result; static int64 lof; fh=gfs_open(s1,1,0,0); if (fh<0) return 0; lof=gfs_lof(fh); static uint8* content; content=(uint8*)malloc(lof); if (!content){gfs_close(fh); return 0;} result=gfs_read(fh,-1,content,lof); gfs_close(fh); if (result<0){free(content); return 0;} //identify file format static snd_sequence_struct *seq; //OGG? #ifdef DEPENDENCY_AUDIO_DECODE_OGG if (lof>=3){ if (content[0]==79){ if (content[1]==103){ if (content[2]==103){//"Ogg" seq=snd_decode_ogg(content,lof); goto got_seq; }}} }//3 #endif //WAV? #ifdef DEPENDENCY_AUDIO_DECODE_WAV if (lof>=12){ if ((*(uint32*)&content[8])==0x45564157){//WAVE seq=snd_decode_wav(content,lof); goto got_seq; }//WAVE } #endif //assume mp3! //MP3? #ifdef DEPENDENCY_AUDIO_DECODE_MP3 seq=snd_decode_mp3(content,lof); #endif got_seq: free(content); if (seq==NULL) return 0; //convert sequence (includes sample rate conversion etc etc) //just perform sample_rate fix for now... //1. 8->16bit conversion and/or edian conversion static int32 incorrect_format; incorrect_format=0; if (seq->bits_per_sample!=16) incorrect_format=1; if (seq->is_unsigned) incorrect_format=1; //todo... if (seq->endian==???) //this section does not fix the frequency, only the bits per sample //and signed-ness of the data if (incorrect_format){ static int32 bps; bps=seq->bits_per_sample/8; static int32 samples; samples=seq->data_size/bps; static uint8 *new_data; if (bps!=2){ new_data=(uint8*)malloc(samples*2); }else{ new_data=seq->data; } static int32 i,v; for (i=0;i<samples;i++){ //read original value v=0; if (bps==1){ if (seq->is_unsigned){ v=*(uint8*)(seq->data+i*1); v=(v-128)*256; }else{ v=*(int8*)(seq->data+i*1); v=v*128; } } if (bps==2){ if (seq->is_unsigned){ v=*(uint16*)(seq->data+i*2); v=v-32768; }else{ v=*(int16*)(seq->data+i*2); } } //place new value into array ((int16*)new_data)[i]=v; }//i if (bps!=2){free(seq->data); seq->data=new_data; seq->data_size=samples*2;} //update seq info seq->bits_per_sample=16; seq->is_unsigned=0; }//incorrect format //2. samplerate conversion if (seq->sample_rate != snd_frequency) { //need to resample seq->data //create new resampler SpeexResamplerState *state; state = speex_resampler_init(seq->channels, seq->sample_rate, snd_frequency, SPEEX_RESAMPLER_QUALITY_MIN, NULL); if (!state) { //NULL means failure free(seq->data); return 0; } //allocate new memory for output int32 out_samples_max = ((double)seq->data_size / seq->channels / 2) * ((((double)snd_frequency) / ((double)seq->sample_rate)) + 0.1) + 100;//10%+100 extra samples as a buffer-zone int16 *resampled = (int16 *)malloc(out_samples_max * seq->channels * sizeof(int16)); if (!resampled) { free(seq->data); return 0; } //establish data sizes //in_len will be set by the resampler to number of samples processed spx_uint32_t in_len = seq->data_size / seq->channels / 2; // divide by 2 because 2byte samples, divive by #channels because function wants it per-channel //out_len will be set to the number of samples written spx_uint32_t out_len; //resample! if (speex_resampler_process_interleaved_int(state, (spx_int16_t *)seq->data, &in_len, (spx_int16_t *)resampled, &out_len) != RESAMPLER_ERR_SUCCESS) { //Error free(resampled); free(seq->data); speex_resampler_destroy(state); return 0; } //destroy the resampler anyway speex_resampler_destroy(state); //establish real size of new data and update seq free(seq->data); //That was the old data seq->data_size = out_len * seq->channels * 2; //remember out_len is perchannel, and each sample is 2 bytes seq->data = (uint8_t *)realloc(resampled, seq->data_size); //we overestimated the array size before, so make it the correct size now if (!seq->data) { //realloc could fail free(resampled); return 0; } seq->sample_rate = snd_frequency; } if (seq->channels==1){ seq->data_mono=seq->data; seq->data_mono_size=seq->data_size; } if (seq->channels==2){ seq->data_stereo=seq->data; seq->data_stereo_size=seq->data_size; } if (seq->channels>2) return 0; //attach sequence to handle (& inc. refs) //create snd handle static int32 handle; handle=list_add(snd_handles); static snd_struct *snd; snd=(snd_struct*)list_get(snd_handles,handle); snd->internal=0; snd->type=2; snd->seq=seq; snd->volume=1.0; snd->capability=r[0]*SND_CAPABILITY_SYNC+r[1]*SND_CAPABILITY_VOL+r[2]*SND_CAPABILITY_PAUSE+r[3]*SND_CAPABILITY_LEN+r[4]*SND_CAPABILITY_SETPOS; if (!r[0]){ snd->streamed=1;//NOT SYNC snd_stream_handle=handle; } return handle; }