function f_dwarves()
	--mov DWORD PTR [ESP+14],7
	--jmp +0x08
	pos_=offsets.findall(0,0x24,0x14,0x07,0,0,0) --search pattern 
	for _,v in pairs(pos_) do
		print(string.format("Possible hit:%x",v))
	end
	pos=offsets.find(0,0x24,0x14,0x07,0,0,0,0xeb,0x08,0x8d) --search pattern
	print(string.format("Start dwarf position:%x",pos))
	if pos~=0 then
		return pos+2-offsets.base();
	else
		return 0;
	end
end
offsets.new("StartDwarfs",f_dwarves) -- finds the starting dwarf count
function f_creatures()
	--01C48034-base=0x1258034
	local val=0
	--print("Enter creature count:");
	--local r=io.stdin:read()
	for k,v in pairs(offsets.getvectors()) do
		if (v>60) and (v<100) then --used count changed some time ago... two hits second one is the right one. Maybe some smarter way could be better?
		--new version first one is right?? needs more testing thou...
			val= k-offsets.base()
			print(string.format("%x",val))
			break;
		end
		--vec=engine.peek(k,ptr_vector);
		
		--[[if(vec:size()==tonumber(r)) then
			val=k-offsets.base()
			print(string.format("off:%x",k))
		end--]]
	end
	offsets.new("AdvCreatureVec",val)
	return val
end
offsets.new("CreatureVec",f_creatures)
function f_words()
	local val=0
	for k,v in pairs(offsets.getvectors()) do
		local toff=engine.peekd(engine.peekd(k))
		if(engine.peekstr(toff)=="ABBEY") then
			val=k-offsets.base()
		end
	end
	return val
end
offsets.newlazy("WordVec",f_words)
function f_creatureptr() --a creature number under the pointer
	pos=offsets.find(0,0xa1,ANYDWORD,0x83,0xf8,0xff,0x75)
	print("Offset="..pos)
	if pos~=0 then
		pos=engine.peekd(pos+1)
		return pos-offsets.base()
	else
		return 0
	end
end
offsets.new("CreaturePtr",f_creatureptr)

function f_creaturegloss() --creature race vector
	for k,v in pairs(offsets.getvectors()) do
		local reg
		reg=GetRegionIn(k)
		if reg ~=nil then
			print(string.format("looking into %x wich is in %s",k,reg.name or ""))
		else
			print(string.format("looking into %x in nil region",k))
		end
		if ValidOffset(k) then
			print("Looking into:"..string.format("%x",k).." used:"..v)
				
			local vec=engine.peek(k,ptr_vector)
			if vec:size()>0 and vec:size()<100000 and vec:getval(0)~=0 then
				local toff=vec:getval(0)
				if ValidOffset(toff) then 
					print("\tval:"..string.format("%x",vec:getval(0)))
					local token=engine.peek(toff,ptt_dfstring)
					--print("\t\tval:".. token:getval())
					if token:getval()=="TOAD" then -- more offsets could be found this way
						return k-offsets.base()
					end
				end
			end
		end
	end
	return 0
end
offsets.new("CreatureGloss",f_creaturegloss)
--reaction vec: search for TAN_A_HIDE
function f_racevec() --current race
	--find all movsx anyreg,address
	local den={}
	local pos=offsets.findall(0,0x0f,0xbf,ANYBYTE,ADDRESS)
	for k,v in pairs(pos) do
		local add
		if v~=0 then
			add=engine.peekd(v+3)			
			if den[add]~=nil then
				den[add]= den[add]+1
			else
				den[add]=1
			end
		end

	end

	for k,v in pairs(den) do
		if v <60 then
			den[k]=nil
		end
		
	end
	for k,v in pairs(den) do
		print("Looking into:"..string.format("%x",k).." used:"..v.." Race:"..engine.peekw(k))
		if engine.peekw(k) >0 and engine.peekw(k)<1000 then
			
			return k-offsets.base()
		end
	end
	
	
	return 0
end
offsets.new("CurrentRace",f_racevec)
function f_pointer() --adventure (not only?) pointer x,y,z
	print("\n")
	local den={}
	local pos=0
	repeat
		pos=offsets.find(pos+3,0x0f,0xb7,ANYBYTE,ADDRESS)
		local add=engine.peekd(pos+3)
		local add2=engine.peekd(pos+13)
		local add3=engine.peekd(pos+23)
		if( math.abs(add-add2)==4 or math.abs(add-add3)==4) then

		if den[add]~=nil then
			den[add]= den[add]+1
		else
			den[add]=1
		end
		end
	until pos==0
	for k,v in pairs(den) do
		print("Looking into:"..string.format("%x",k).." used:"..v)
		return k-offsets.base()-4
	end
	return 0
end
offsets.new("Xpointer",f_pointer)
function f_adventure()
	RaceTable=RaceTable or BuildNameTable() -- this gets all the races' numbers
	--[[print("input chars race:")
	repeat
		r=io.stdin:read()
		if RaceTable[r]==nil then print("Incorrect race...") end
	until RaceTable[r]~=nil -- query till correct race is inputed
	rnum=RaceTable[r] --get its num
	print("Race:"..rnum)]]--
	myoff=0
	print("input player's creature's name (lowercaps):")
	r=io.stdin:read()
	
	for k,v in pairs(offsets.getvectors()) do -- now lets look through all vector offsets
		off=engine.peekd(k) --get vector start
		off=engine.peekd(off) --get 0 element (or first) in adventurer mode its our hero
		name=engine.peekstr(off)
		if(name==r) then
		--if engine.peek(off+140)==rnum then -- creature start+140 is the place where race is kept
			print(string.format("%x race:%x",k,engine.peekw(off+140)))
			myoff=k -- ok found it
			break
		end
	end
	if myoff~=0 then
		crvec=engine.peek(myoff,ptr_vector)
		print(string.format("player offset:%x",crvec:getval(0)))
		local legidVec=engine.peek(crvec:getval(0),ptr_Creature.legends)
		print(string.format("legends offset:%x",legidVec:getval(0)))
		local vtable=engine.peekd(legidVec:getval(0))
		print(string.format("vtable offset:%x",vtable))
		offsets.new("vtableLegends",vtable-offsets.base())
		return myoff-offsets.base() --save the offset for laters
	else
		return 0 --indicate failure
	end
end
offsets.newlazy("AdvCreatureVec",f_adventure) -- register a way to find this offset
--7127F0
function f_legends()
	pos=1
	T={}
	repeat
	pos=offsets.find(pos+1,0x50,0xb8,ANYDWORD,0xe8,ANYDWORD,0x8b,0xf0)
	off=engine.peekd(pos+2)
	vec=engine.peek(off,ptr_vector)
	if vec:size()~=0 then
		if T[off]~=nil then
			T[off].c=T[off].c+1
		else
			T[off]={c=1,vsize=vec:size()}
		end
		
	end

	until pos==0
	for k,v in pairs(T) do
		vec=engine.peek(k,ptr_vector)
		print(string.format("off:%x used:%i size:%d",k,v.c,v.vsize))
		print(string.format("fith elements id:%d",engine.peekd(vec:getval(5))))
		if engine.peekd(vec:getval(5))==5 then
		--if v.c==2 and v.vsize>1000 then
			return k-offsets.base()
		end
	end
	return 0
end
offsets.newlazy("Legends",f_legends)
function f_playerlegendid()
	local off=offsets.getEx("Legends")
	local pos=1
	repeat
		pos=offsets.find(pos+1,0xa1,DWORD_,off+4,0x2b,0x05,DWORD_,off)
		val=engine.peekd(pos+16)
		if engine.peekd(val)~=0 then
		--if val >offsets.base() then
			return val-offsets.base()
		end
		--print(string.format("%x",val))
	until pos==0
	return 0
end
offsets.newlazy("PlayerLegend",f_playerlegendid)

function f_world()
	local pos=offsets.base()
	T={}
	while pos~=0 do
		--pos=offsets.find(pos+6,0xa1,DWORD_,mapoffset,0x8b,0x4c,0x88,0xFC)
		pos=offsets.find(pos+6,0x8b,0x35,ANYDWORD,0x85,0xf6)--,0x8b,0x4c,0x88,0xFC)
		--pos2=offsets.find(pos,0x8b,0x34,0x88)
		
		if pos~=0 then
			add=engine.peekd(pos+2);
			--if pos2 ~=0 and pos2-pos<25 then
			--	print(string.format("Address:%x dist:%d Map:%x",pos2,pos2-pos,add))
			--	
			--end
			if add~=0 then
				if T[add]~=nil then
					T[add]=T[add]+1
				else
					T[add]=1
				end
			end
		end
		
	end
	local kk,vv
	vv=0
	for k,v in pairs(T) do
		if v>vv then
			vv=v
			kk=k
		end
		--print(string.format("Address:%x, times used:%d",k,v))
	end
	return kk-offsets.base()
end
offsets.new("WorldData",f_world)

function f_sites()
	local pos=offsets.base()
	T={}
	while pos~=0 do
		
		pos=offsets.find(pos+17,0xA1,ANYDWORD, --mov eax, ptr to some biger thing
						0x8B,0x90,0x24,0x01,0x00,0x00, --mov edx [eax+0x124]
						0x2b,0x90,0x20,0x01,0x00,0x00, --sub edx [eax+0x120]
						EOL)
		if pos~=0 then
			add=engine.peekd(pos+1)
			return add-offsets.base()
			
		end
		
	end
	return 0
end
offsets.newlazy("SiteData",f_sites) --actually has a lot more data... 
function f_items()
	local pos=offsets.base()
	while pos~= 0 do
		pos=offsets.find(pos+17,0x8b,0x0d,ANYDWORD, --mov eax, ptr to some biger thing
							0x8B,0x54,0x24,0x34)
		if pos~=0 then
			--print(string.format("%x",engine.peekd(pos+2)))
			local ret=engine.peekd(pos+2)-offsets.base()
			return ret
		end
	end
	return 0
end
offsets.new("Items",f_items)
function f_materials()
	for k,v in pairs(offsets.getvectors()) do
		--print("Looking into:"..string.format("%x",k).." used:"..v)
		local vec=engine.peek(k,ptr_vector)
		if vec:getval(0)~=0 then
			--print("\tval:"..string.format("%x",vec:getval(0)))
			local token=engine.peek(vec:getval(0),ptt_dfstring)
			if token:getval()~=""then
			--print("\t\tval:".. token:getval())
				if token:getval()=="IRON" then 
					--print("Found:"..string.format("%x",k).." used:"..v)
					return k-offsets.base()
				end
			end
		end
	end
	return 0
end
offsets.new("Materials",f_materials)