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