Skip to content

Instantly share code, notes, and snippets.

@bakueikozo
Last active March 12, 2024 17:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bakueikozo/9f3ec88476989ba5d9cb37b5c2647e82 to your computer and use it in GitHub Desktop.
Save bakueikozo/9f3ec88476989ba5d9cb37b5c2647e82 to your computer and use it in GitHub Desktop.
char decidedFilename[1024];
int songNumTray;
int songNumChapter;
int movieFirst=1;
// 曲番号を取得するために、OKD(オケデータ??)を開くときの関数をオーバーライドして番号を保存しておく
int (*okdplayeropen)(void *okdPlayer,int sn,void *songdata,int mode,void *lpInfo);
int _ZN10COkdPlayer4OpenEmP17YMH_OKDP_SONGDATA17YMH_OKDP_OPENMODEPv(
void *okdPlayer,int sn,void *songdata,int mode,void *lpInfo
){
puts("_ZN10COkdPlayer4OpenEmP17YMH_OKDP_SONGDATA17YMH_OKDP_OPENMODEPv");
okdplayeropen=dlsym(RTLD_NEXT, "_ZN10COkdPlayer4OpenEmP17YMH_OKDP_SONGDATA17YMH_OKDP_OPENMODEPv");
printf("%p,%d,%d-%d,%d,%p\n",okdPlayer,(sn>>8)&0xffff,sn&0xff,songdata,mode,lpInfo);
songNumTray=(sn>>8) &0xffff;
songNumChapter=sn&0xff;
decidedFilename[0]=0;
return okdplayeropen(okdPlayer,sn,songdata,mode,lpInfo);
}
// ファイル存在チェック
int check_file(char *name){
int ret;
printf("check exist %s ",name);
FILE *fp=fopen(name,"rb");
if(fp!=NULL){
printf("exist.\n");
fclose(fp);
return 1;
}
printf("not exist.\n");
return 0;
}
int (*pCheckPresent)(int pIndex,WORD *folder,DWORD file,int *type);
// 要求された動画ファイルを探す代わりに、自分で準備した動画ファイルをそのファイル名で配置して、フォルダ番号を返す
bool _ZN9CMDVIndex15CheckPresentBGVEPtmP15tagVSTREAM_TYPE(int pIndex,WORD *folder,DWORD file,int *type){
if(pCheckPresent==NULL){
// 本来呼び出される関数
pCheckPresent=dlsym(RTLD_NEXT, "_ZN9CMDVIndex15CheckPresentBGVEPtmP15tagVSTREAM_TYPE");
}
// 引数確認
printf("before CheckPresent(%p,%d-%d,%d)\n",pIndex,*folder,file,*type);
int maxnum=-1;
// 一つの曲内で複数のBGVファイルを探すため何回も呼び出されるので、最初の一回だけファイル名を決める
if( strlen(decidedFilename) == 0 ){
char buf[255];
// check custom pv
int x;
for(x=0;x<10;x++){
sprintf(buf,"/XG/B/movie/%d/%d",songNumTray,songNumChapter);
if( x > 0 ){
sprintf(buf,"%s.%d",buf,x);
}
if( check_file(buf) ){
maxnum=x;
}
}
// nn , nn.1 , nn.2 ... みたいな連番ファイルを想定する。一番大きいやつを見つけて、randをmodる
if( maxnum != -1 ){
printf("maxnum=%d \n",maxnum);
int decide=0;
decide= rand()%(maxnum+1);
sprintf(buf,"/XG/B/movie/%d/%d",songNumTray,songNumChapter);
if(decide > 0 ){
sprintf(buf,"%s.%d",buf,decide);
}
strcpy(decidedFilename,buf);
printf("decide filename=%s\n",decidedFilename);
}
}
// 曲名でファイルを準備しておかなかった場合、通常通りの動作をする
if( strlen(decidedFilename) == 0 ){
return pCheckPresent(pIndex,folder,file,type);
}else{
// 曲名での動画があったので、フォルダに配置する
*folder = 666;
*type = 27;
char target[255];
sprintf(target,"/XG/B/Data/666/666.%d",file);
printf("make symlink source=%s target %s\n",decidedFilename,target);
unlink(target);
symlink(decidedFilename,target);
return pCheckPresent(pIndex,folder,file,type);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment