Code:
/*
CPU Disasm
Address Hex dump Command Comments
006394EB /> \FF75 0C PUSH DWORD PTR SS:[EBP+0C] ; /Arg2
006394EE |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |Arg1
006394F1 |. E8 A629DDFF CALL 0040BE9C ; |
006394F6 |. 8BC8 MOV ECX,EAX ; |
006394F8 |. E8 3726FBFF CALL 005EBB34 ; \Conquer.005EBB34
006394FD |. 8985 D0FEFFFF MOV DWORD PTR SS:[EBP-130],EAX
(Returns CELL STRUCT)
CPU Disasm
Address Hex dump Command Comments
0063952C |. FFB5 D0FEFFFF PUSH DWORD PTR SS:[EBP-130] ; /Arg1
00639532 |. E8 6529DDFF CALL 0040BE9C ; |
00639537 |. 8BC8 MOV ECX,EAX ; |
00639539 |. E8 E329FBFF CALL 005EBF21 ; \Conquer.005EBF21
(Returns 1 if you can not go there, 0 if you can go there)
*/
public byte[] asmForGetDMapCell() {
return (new AsmBuilder())
.CALL(0x0040BE9C)
.MOV_ECX_EAX()
.CALL(0x005EBB34)
.getCode();
}
public byte[] asmForIsDMapCellNonstandable() {
return (new AsmBuilder())
.CALL(0x0040BE9C)
.MOV_ECX_EAX()
.CALL(0x005EBF21)
.getCode();
}
@Override
public void readMap(BitSet bitSet, int minX, int minY, int width, int height) {
if (width == 0 || height == 0) { return; }
AsmBuilder asm = new AsmBuilder();
asm.reset()
.JMP_NEXT_EIP_PLUS(8 + width * height)
.ZEROS(8 + width * height)
// Set yIdx to 0
.MOV_EAX_ASM_START()
.ADD_EAX(5+4)
.PUSH(0)
.POP_DWORD_PTR_EAX()
// Y-Loop
.label("loopY")
// Set xIdx to 0
.MOV_EAX_ASM_START()
.ADD_EAX(5)
.PUSH(0)
.POP_DWORD_PTR_EAX()
// X-Loop
.label("loopX")
// Param 2: Y + minY
.MOV_EAX_ASM_START()
.ADD_EAX(5+4)
.MOV_EAX_DWORD_PTR_EAX()
.ADD_EAX(minY)
.PUSH_EAX()
// Param 1: X + minX
.MOV_EAX_ASM_START()
.ADD_EAX(5)
.MOV_EAX_DWORD_PTR_EAX()
.ADD_EAX(minX)
.PUSH_EAX()
// GetDMapCell(Param1, Param 2)
.CODE(asmForGetDMapCell())
// Param 1: Result
.PUSH_EAX()
// IsDemapCellNonstandable(Param1)
.CODE(asmForIsDMapCellNonstandable())
// Save Result
.PUSH_EAX()
// index = y * width + x
.MOV_ECX(width)
.MOV_EAX_ASM_START()
.ADD_EAX(5+4)
.MOV_EAX_DWORD_PTR_EAX()
.MUL_ECX()
.MOV_ECX_EAX()
.MOV_EAX_ASM_START()
.ADD_EAX(5)
.MOV_EAX_DWORD_PTR_EAX()
.ADD_ECX_EAX()
// map[index] = {Restore Result}
.MOV_EAX_ASM_START()
.ADD_EAX(8)
.ADD_EAX_ECX()
.POP_ECX()
.MOV_BYTE_PTR_EAX_CL()
// End Of X-Loop
.MOV_EAX_ASM_START()
.ADD_EAX(5)
.INC_DWORD_PTR_EAX()
.MOV_EAX_DWORD_PTR_EAX()
.CMP_EAX(width)
.JGE_SHORT_NEXT_EIP_PLUS((byte)5)
.JMP_label("loopX")
// End Of Y-Loop
.MOV_EAX_ASM_START()
.ADD_EAX(5+4)
.INC_DWORD_PTR_EAX()
.MOV_EAX_DWORD_PTR_EAX()
.CMP_EAX(height)
.JGE_SHORT_NEXT_EIP_PLUS((byte)5)
.JMP_label("loopY")
.RETN();
byte[] code = asm.getCode();
int codeMem = alloc(code.length);
write(codeMem, code);
execute(codeMem);
byte[] cells = readBytes(codeMem + 5 + 8, width * height);
free(codeMem);
for (int i = 0; i < cells.length; ++i) {
if (cells[i] == 0) {
bitSet.clear(i);
} else {
bitSet.set(i);
}
}
}
Only 1 call per entire map pull, only need to call it when your player changed maps.






I mean for GUI and C# :P