Added autorunning initcustom.lua (for place to put private scripts) autorunning save files, and friendship_civ (still buggy)
parent
9b48d4946e
commit
e84841e94f
@ -0,0 +1 @@
|
|||||||
|
as -anl --32 -o friendship_c.o friendship_c.asm
|
@ -0,0 +1,41 @@
|
|||||||
|
.intel_syntax
|
||||||
|
eaxpart:
|
||||||
|
push eax
|
||||||
|
push ecx
|
||||||
|
jmp compare
|
||||||
|
ecxpart:
|
||||||
|
push eax
|
||||||
|
push ecx
|
||||||
|
mov eax,ecx
|
||||||
|
|
||||||
|
compare:
|
||||||
|
push ebx
|
||||||
|
mov ebx,0xDEADBEEF #write a pointer to the list of allowed civs
|
||||||
|
mov ecx,2000 #write a number of allowed civs
|
||||||
|
loop1:
|
||||||
|
cmp [ebx+ecx*4],eax
|
||||||
|
jnz endok
|
||||||
|
dec ecx
|
||||||
|
cmp ecx ,-1
|
||||||
|
jnz loop1
|
||||||
|
|
||||||
|
pop ebx
|
||||||
|
|
||||||
|
jmp fail
|
||||||
|
|
||||||
|
endok:
|
||||||
|
pop ebx
|
||||||
|
|
||||||
|
cmp eax,eax
|
||||||
|
jmp endfinal
|
||||||
|
fail:
|
||||||
|
|
||||||
|
xor ecx,ecx
|
||||||
|
xor eax,eax
|
||||||
|
inc eax
|
||||||
|
cmp eax,ebx
|
||||||
|
endfinal:
|
||||||
|
|
||||||
|
pop ecx
|
||||||
|
pop eax
|
||||||
|
ret
|
Binary file not shown.
@ -0,0 +1,89 @@
|
|||||||
|
friendship_civ={}
|
||||||
|
function friendship_civ.init()
|
||||||
|
friendship_civ.count=0x0f
|
||||||
|
friendship_civ.firsttime=true
|
||||||
|
local mypos=engine.getmod("Friendship_civ")
|
||||||
|
local modpos=0
|
||||||
|
if mypos then
|
||||||
|
modpos=mypos
|
||||||
|
_,modsize=engine.loadobj("dfusion/friendship_civ/friendship_c.o")
|
||||||
|
_=nil
|
||||||
|
friendship_civ.firsttime=false
|
||||||
|
else
|
||||||
|
modpos,modsize=engine.loadmod("dfusion/friendship_civ/friendship_c.o","Friendship_civ",1024)
|
||||||
|
print(string.format("Loaded module @:%x",modpos))
|
||||||
|
end
|
||||||
|
friendship_civ.modpos=modpos
|
||||||
|
friendship_civ.modsize=modsize
|
||||||
|
end
|
||||||
|
function friendship_civ.install(civs)
|
||||||
|
friendship_civ.init()
|
||||||
|
local count=0
|
||||||
|
for _,v in pairs(civs) do
|
||||||
|
engine.poked(friendship_civ.modpos+friendship_civ.modsize+count*4,v) -- for some reason it compiled strangely
|
||||||
|
-- cmp word[ebx+ecx*2],ax -> cmp word[ebx+ecx*2+2],ax
|
||||||
|
count = count + 1
|
||||||
|
end
|
||||||
|
engine.poked(friendship_civ.modpos+0x0a,friendship_civ.modpos+friendship_civ.modsize) -- set ptr to civ ids
|
||||||
|
engine.poked(friendship_civ.modpos+friendship_civ.count,count-1) -- set count of civs
|
||||||
|
SetExecute(friendship_civ.modpos)
|
||||||
|
|
||||||
|
if(friendship_civ.firsttime) then
|
||||||
|
friendship_civ.patch()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function friendship_civ.getcivs()
|
||||||
|
if(friendship_civ.firsttime==nil)then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
friendship_civ.init()
|
||||||
|
local count=engine.peekd(friendship_civ.modpos+friendship_civ.count)+1
|
||||||
|
local ret={}
|
||||||
|
for i=0, count-1 do
|
||||||
|
table.insert(ret,engine.peekd(friendship_civ.modpos+friendship_civ.modsize+i*4))
|
||||||
|
end
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
function friendship_civ.addciv(civ) --if called with nil add current civ :)
|
||||||
|
if civ==nil then
|
||||||
|
local cciv=engine.peekd(VersionInfo.getGroup("Creatures"):getAddress("current_civ"))
|
||||||
|
friendship_civ.install({cciv})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local oldcivs=friendship_civ.getcivs()
|
||||||
|
oldcivs=oldcivs or {}
|
||||||
|
if type(civ)=="table" then
|
||||||
|
for k,v in ipairs(civ) do
|
||||||
|
table.insert(oldcivs,v)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
table.insert(oldcivs,civ)
|
||||||
|
end
|
||||||
|
friendship_civ.install(oldcivs)
|
||||||
|
end
|
||||||
|
function friendship_civ.patch_call(off,iseax)
|
||||||
|
local calltrg=friendship_civ.modpos
|
||||||
|
if not iseax then
|
||||||
|
calltrg=calltrg+4
|
||||||
|
end
|
||||||
|
engine.pokeb(off,0xe8) --this is a call
|
||||||
|
engine.poked(off+1,calltrg-off-5) --offset to call to (relative)
|
||||||
|
engine.pokeb(off+5,0x90) --nop
|
||||||
|
end
|
||||||
|
function friendship_civ.patch()
|
||||||
|
--UpdateRanges()
|
||||||
|
local civloc= VersionInfo.getGroup("Creatures"):getAddress("current_civ")
|
||||||
|
local pos1=offsets.findall(0,0x3B,0x05,DWORD_,civloc) --eax
|
||||||
|
for k,v in pairs(pos1) do print(string.format("%d %x",k,v)) end
|
||||||
|
local pos2=offsets.findall(0,0x3B,0x0D,DWORD_,civloc) --ecx
|
||||||
|
for k,v in pairs(pos2) do print(string.format("%d %x",k,v)) end
|
||||||
|
|
||||||
|
for k,v in pairs(pos1) do
|
||||||
|
print(string.format("Patching eax compare %d: %x",k,v))
|
||||||
|
friendship_civ.patch_call(v,true)
|
||||||
|
end
|
||||||
|
for k,v in pairs(pos2) do
|
||||||
|
print(string.format("Patching ecx compare %d: %x",k,v))
|
||||||
|
friendship_civ.patch_call(v,false)
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,57 @@
|
|||||||
|
fc_ui={}
|
||||||
|
fc_ui.menu=MakeMenu()
|
||||||
|
function fc_ui.get()
|
||||||
|
local mycivs=friendship_civ.getcivs()
|
||||||
|
if mycivs~= nil then
|
||||||
|
print(" Currently friendly civs:")
|
||||||
|
for k,v in pairs(mycivs) do
|
||||||
|
print(string.format("%d. %d",k,v))
|
||||||
|
end
|
||||||
|
else
|
||||||
|
print(" Plugin no yet activated.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function fc_ui.add()
|
||||||
|
print("Type in civ id to add (leave empty to add current, q cancels):")
|
||||||
|
local r
|
||||||
|
while r==nil and r~='q' do
|
||||||
|
r=io.stdin:read()
|
||||||
|
if r=="" then
|
||||||
|
r=nil
|
||||||
|
break
|
||||||
|
end
|
||||||
|
if r~='q' then r=tonumber(r) else
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
friendship_civ.addciv(r)
|
||||||
|
end
|
||||||
|
function fc_ui.remove()
|
||||||
|
local mycivs=friendship_civ.getcivs()
|
||||||
|
if mycivs~= nil then
|
||||||
|
print(" Currently friendly civs:")
|
||||||
|
for k,v in pairs(mycivs) do
|
||||||
|
print(string.format("%d. %d",k,v))
|
||||||
|
end
|
||||||
|
else
|
||||||
|
print(" Plugin no yet activated, nothing to remove.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
print("Type in civ id to remove( q cancels):")
|
||||||
|
local r
|
||||||
|
while r==nil and r~='q' do
|
||||||
|
r=io.stdin:read()
|
||||||
|
if r~='q' then
|
||||||
|
r=tonumber(r)
|
||||||
|
if r>#mycivs then r=nil end
|
||||||
|
else
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
table.remove(mycivs,r)
|
||||||
|
friendship_civ.install(mycivs)
|
||||||
|
end
|
||||||
|
fc_ui.menu:add("Add civ",fc_ui.add)
|
||||||
|
fc_ui.menu:add("Get civs",fc_ui.get)
|
||||||
|
fc_ui.menu:add("Remove civ",fc_ui.remove)
|
||||||
|
fc_ui.menu:display()
|
Loading…
Reference in New Issue