19/03/05 18:37:05.51 iiWfkRR5.net
プログラム初心者なんでよくわからないけど、言語は多分C++だと思う
plg作成するメリットは上のようなコードでの対応が難しい場合や
こんな感じのエディット機能作る場合くらいしかなさそう
#define ONPRESS(flag) ((ctrl.buttons == (flag)) && !(ctrl_old.buttons == (flag)))
uint32_t get_base_addr(const char *module_name, int segment_index)
{ //モジュール名とセグメント番号を指定して開始アドレスを取得する
tai_module_info_t module_info;
module_info.size = sizeof(tai_module_info_t);
int ret = taiGetModuleInfo(module_name, &module_info);
if (ret != 0) return 0;
SceKernelModuleInfo kernel_module_info = {0};
ret = sceKernelGetModuleInfo(module_info.modid, &kernel_module_info);
if (ret != 0) return 0;
SceKernelSegmentInfo* segmentInfo = &(kernel_module_info.segments[segment_index]);
return (uint32_t)segmentInfo->vaddr;
}
int get_selected_kamisama_id()
{ //神様一覧で選択中の神様のIDを返す
const uint32_t search_value = get_base_addr("main", 0) + 0x470468;
const uint32_t base_addr = get_base_addr("main", 1);
uint32_t addr = base_addr + 0x947BC;
addr = READU32(addr);
if (addr != 0)
if (READU32(addr + 0x7E4C) == search_value)
if (READU32(addr + 0x7E50)>=0 && READU32(addr + 0x7E50)<0xB4)
return READU32(addr + 0x7E50);
return -1;
}
static SceCtrlData ctrl,ctrl_old={};
static void kamisama_status_set(int lock)
{ //R+□押下で一覧選択中の神様の状態を循環で変更される
if (lock)
{
ctrl_old = ctrl;
sceCtrlReadBufferPositive(0, &ctrl, 1);
if(ONPRESS(SCE_CTRL_RTRIGGER | SCE_CTRL_SQUARE))
{
uint32_t base_addr, addr1, addr2;
base_addr = get_base_addr("main", 1);
if (base_addr == 0) return;
addr1 = READU32(base_addr + 0x1995C);
if (addr1 == 0) return;
int selected_kamisama_id = get_selected_kamisama_id();
if(selected_kamisama_id < 0) return;
addr2 = READU32(addr1 + selected_kamisama_id * 0x1C + 0x8);
if (addr2 == 0) return;
WRITEU8(addr2 + 0x1,
((READU8(addr2 + 0x1) & 0xF0) |
(((READU8(addr2 + 0x1) & 0xF) + 1) % 0xC))
);
}
}
}