0873名無しさん@お腹いっぱい。
2014/10/13(月) 06:01:13.30ID:EdfdlyeE逆アセンブルすることを前提として
Before、Mission、Afterで使えるsyscall関数のアドレスは0x001B2070から並んでます
(0x001B2070+((syscall1の値)&0x7F)*4)にそのsyscall関数のアドレスが入ってます
このsyscall関数はラッパー関数のようなもので、関数内でさらにsyscall1の値を比較し、実際の関数を呼び出しています
例えばAddEnemyの場合は(0x001B2070+(1500&0x7F)*4)=0x001B21E0
0x001B21E0には0x0899D470が格納されているので、それを0x08800000引いて0x0019D470
0x0019D470ではsyscall1の値比較が省略されているので、すぐ下のjalで呼び出している関数が実際のアドレスです
jalの上にあるlwやlwc1が引数です
// 敵を単体追加 アドレス0x000D62B8 $a1=pos $a2=dir $3=pathVob $f12=power $t0=active
int AddEnemy(char *pos,char *dir,char *pathVob,float power,bool active){
int objectIndex=clGameSystem::CreateSystemObject(pos,dir,pathVob);
clKksBaseObject *object=clGameSystem::GetObject(objectIndex);
if(object){
object->SetPower(power);
object->sub_121118(1);//オートコントロールフラグの設定?
object->AddToTeam(1);
short teamID=object->GetTeamID();
object->m_E8=sub_11E5F0(teamID);//不明
unsigned char *resource=object->resource;//ここからVobファイル先頭のClassIDを取得しているが使われていない。デバッグ用の残骸かも
char classID[9];
*(unsigned int *)&classID[0]=*(unsigned int *)&resource[0];
*(unsigned int *)&classID[4]=*(unsigned int *)&resource[4];
classID[8]=0;
if(active==1)sub_605F8(*(unsigned int *)0x1BDEB0,object);//アクティブ化
}
return objectIndex;
}
// 敵を円状に複数追加 アドレス0x000D63A8 $a1=pos $f12=range $a2=pathVob $f13=power $a3=count $t0=active
void AddEnemyCircle(char *pos,float range,char *pathVob,float power,int count,bool active){
//※長いので省略
//天井のないマップ用のアルゴリズムだと思う
}
// 敵を箱状に複数追加 アドレス0x000D6874 $a1=pos $f12=rangeX $f13=rangeY $f14=rangeZ $a2=pathVob $f15=power $a3=count $t0=active
void AddEnemyBox(char *pos,float rangeX,float rangeY,float rangeZ,char *pathVob,float power,int count,bool active){
//※長いので省略
}
// 敵を球状に複数追加 アドレス0x000D6CF8 $a1=pos $f12=range $a2=pathVob $f13=power $a3=count $t0=active
void AddEnemyCave(char *pos,float range,char *pathVob,float power,int count,bool active){
//※長いので省略
//洞窟などの天井のあるマップ用のアルゴリズムだと思う
}
// 敵を連結して複数追加 アドレス0x000D711C $a1=pos $a2=dir $3=pathVob $t0=count $f12=power $t1=active
int AddEnemyCentipede(char *pos,char *dir,char *pathVob,int count,float power,bool active){
//※長いので省略
//戻り値は先頭オブジェクトのobjectIndex
}