diff --git a/plugins/Dfusion/luafiles/embark/init.lua b/plugins/Dfusion/luafiles/embark/init.lua new file mode 100644 index 000000000..477e0255a --- /dev/null +++ b/plugins/Dfusion/luafiles/embark/init.lua @@ -0,0 +1,71 @@ +function MakeTable(modpos,modsize,names) + count=0 + castes={} + --print("Making table") + for _,line in pairs(names) do + --print("Line:"..line) + tpos=string.find(line,":") + if tpos~=nil then + --print("Was line:"..line) + table.insert(castes,tonumber(string.sub(line,tpos+1))) + line=string.sub(line,1,tpos-1) + --print("IS line:"..line) + else + table.insert(castes,-1) + end + if RaceTable[line] == nil then + error("Failure, "..line.." not found!") + end + engine.pokew(modpos+modsize+count*2,RaceTable[line]) -- add race + count = count + 1 + end + i=0 + for _,caste in pairs(castes) do + + engine.pokew(modpos+modsize+count*2+i*2,caste) -- add caste + i= i+1 + end + + engine.poked(stoff,count) + return count +end +function embark(names) + RaceTable=RaceTable or BuildNameTable() + mypos=engine.getmod('Embark') + stoff=offsets.getEx('StartDwarfs') + if mypos then --if mod already loaded + print("Mod already loaded @:"..mypos.." just updating") + modpos=mypos + _,modsize=engine.loadobj('dfusion/embark/embark.o') + + count=MakeTable(modpos,modsize,names) --just remake tables + else + + tofind=VersionInfo.getGroup("Creatures"):getAddress("current_race")--offsets.getEx('CurrentRace') + + loc=offsets.find(stoff,0xa1,DWORD_,tofind) + + print("found:"..loc) + + if((loc~=0)and(loc-stoff<1000)) then + modpos,modsize=engine.loadmod('dfusion/embark/embark.o','Embark',256) + count=MakeTable(modpos,modsize,names) + engine.poked(modpos+0x18,modpos+modsize) --fix array start for race + engine.poked(modpos+0x08,modpos+modsize+count*2) --fix array start for caste + print("sucess loading mod @:"..modpos) + -- build race vector after module. + + + --finaly poke in the call! + engine.pokeb(loc,0x6a) + engine.pokeb(loc+1,0xFF) + engine.pokeb(loc+2,0xe8) + engine.poked(loc+3,modpos-loc-7) + --engine.pokeb(loc+5,0x90) + SetExecute(modpos) + else + error("did not find patch location, failing...") + end + + end +end \ No newline at end of file diff --git a/plugins/Dfusion/luafiles/embark/plugin.lua b/plugins/Dfusion/luafiles/embark/plugin.lua index db65da78c..039000656 100644 --- a/plugins/Dfusion/luafiles/embark/plugin.lua +++ b/plugins/Dfusion/luafiles/embark/plugin.lua @@ -1,74 +1,4 @@ -function MakeTable(modpos,modsize,names) - count=0 - castes={} - --print("Making table") - for _,line in pairs(names) do - --print("Line:"..line) - tpos=string.find(line,":") - if tpos~=nil then - --print("Was line:"..line) - table.insert(castes,tonumber(string.sub(line,tpos+1))) - line=string.sub(line,1,tpos-1) - --print("IS line:"..line) - else - table.insert(castes,-1) - end - if RaceTable[line] == nil then - error("Failure, "..line.." not found!") - end - engine.pokew(modpos+modsize+count*2,RaceTable[line]) -- add race - count = count + 1 - end - i=0 - for _,caste in pairs(castes) do - - engine.pokew(modpos+modsize+count*2+i*2,caste) -- add caste - i= i+1 - end - - engine.poked(stoff,count) - return count -end -function embark(names) - RaceTable=RaceTable or BuildNameTable() - mypos=engine.getmod('Embark') - stoff=offsets.getEx('StartDwarfs') - if mypos then --if mod already loaded - print("Mod already loaded @:"..mypos.." just updating") - modpos=mypos - _,modsize=engine.loadobj('dfusion/embark/embark.o') - - count=MakeTable(modpos,modsize,names) --just remake tables - else - - tofind=VersionInfo.getGroup("Creatures"):getAddress("current_race")--offsets.getEx('CurrentRace') - loc=offsets.find(stoff,0xa1,DWORD_,tofind) - - print("found:"..loc) - - if((loc~=0)and(loc-stoff<1000)) then - modpos,modsize=engine.loadmod('dfusion/embark/embark.o','Embark',256) - count=MakeTable(modpos,modsize,names) - engine.poked(modpos+0x18,modpos+modsize) --fix array start for race - engine.poked(modpos+0x08,modpos+modsize+count*2) --fix array start for caste - print("sucess loading mod @:"..modpos) - -- build race vector after module. - - - --finaly poke in the call! - engine.pokeb(loc,0x6a) - engine.pokeb(loc+1,0xFF) - engine.pokeb(loc+2,0xe8) - engine.poked(loc+3,modpos-loc-7) - --engine.pokeb(loc+5,0x90) - SetExecute(modpos) - else - error("did not find patch location, failing...") - end - - end -end if not(FILE)then names=ParseNames("dfusion/embark/races.txt")--io.open("plugins/embark/races.txt"):lines() embark(names) diff --git a/plugins/Dfusion/luafiles/migrants/init.lua b/plugins/Dfusion/luafiles/migrants/init.lua new file mode 100644 index 000000000..85463fe7e --- /dev/null +++ b/plugins/Dfusion/luafiles/migrants/init.lua @@ -0,0 +1,61 @@ +--install part +function migrants(names) +RaceTable=RaceTable or BuildNameTable() +mypos=engine.getmod("Migrants") +if mypos then + print("Migrant mod is running already @:"..mypos) + modpos=mypos + _,modsize=engine.loadobj("dfusion/migrants/migrants.o") + count=0 + for _,v in pairs(names) do + if RaceTable[v] == nil then + print("Failure, "..v.." not found!") + break --maybe some indication of failure? and cleanup? + end + engine.pokew(modpos+modsize+count*2+4,RaceTable[v]) + count = count + 1 + end + seedpos=modpos+modsize + engine.poked(seedpos,math.random(1234567)) -- seed the generator :) + engine.poked(modpos+0x1c,count) --max size for div + +else + modpos,modsize=engine.loadmod("dfusion/migrants/migrants.o","Migrants") + print(string.format("Loaded module @:%x",modpos)) + count=0 + for _,v in pairs(names) do + if RaceTable[v] == nil then + print("Failure, "..v.." not found!") + break --maybe some indication of failure? and cleanup? + end + engine.pokew(modpos+modsize+count*2+4,RaceTable[v]) + + count = count + 1 + end + + seedpos=modpos+modsize + engine.poked(modpos+0x04,seedpos) + engine.poked(modpos+0x15,seedpos) + + engine.poked(seedpos,math.random(1234567)) -- seed the generator :) + engine.poked(modpos+0x1c,count) --max size for div + + engine.poked(modpos+0x26,seedpos+4) --start of array + + --patch part + --pos=62873C+DF + -- pattern: A1,DWORD_,"CURRENTRACE",56,89,ANYBYTE,ANYBYTE,34,e8 + pos=offsets.find(offsets.base(),0xa1,DWORD_,offsets.getEx("CurrentRace"),0x56,0x89,ANYBYTE,ANYBYTE,0x34,0xe8) + function pokeCall(off) + engine.pokeb(off,0xe8) + engine.poked(off+1,modpos-off-5) + end + if pos~=0 then + print(string.format("Found @:%x",pos)) + pokeCall(pos) + else + print("Not found patch location!!!") + end + end + +end \ No newline at end of file diff --git a/plugins/Dfusion/luafiles/migrants/plugin.lua b/plugins/Dfusion/luafiles/migrants/plugin.lua index 0e1e46160..651e4900c 100644 --- a/plugins/Dfusion/luafiles/migrants/plugin.lua +++ b/plugins/Dfusion/luafiles/migrants/plugin.lua @@ -1,64 +1,4 @@ ---install part -function migrants(names) -RaceTable=RaceTable or BuildNameTable() -mypos=engine.getmod("Migrants") -if mypos then - print("Migrant mod is running already @:"..mypos) - modpos=mypos - _,modsize=engine.loadobj("dfusion/migrants/migrants.o") - count=0 - for _,v in pairs(names) do - if RaceTable[v] == nil then - print("Failure, "..v.." not found!") - break --maybe some indication of failure? and cleanup? - end - engine.pokew(modpos+modsize+count*2+4,RaceTable[v]) - count = count + 1 - end - seedpos=modpos+modsize - engine.poked(seedpos,math.random(1234567)) -- seed the generator :) - engine.poked(modpos+0x1c,count) --max size for div - -else - modpos,modsize=engine.loadmod("dfusion/migrants/migrants.o","Migrants") - print(string.format("Loaded module @:%x",modpos)) - count=0 - for _,v in pairs(names) do - if RaceTable[v] == nil then - print("Failure, "..v.." not found!") - break --maybe some indication of failure? and cleanup? - end - engine.pokew(modpos+modsize+count*2+4,RaceTable[v]) - - count = count + 1 - end - seedpos=modpos+modsize - engine.poked(modpos+0x04,seedpos) - engine.poked(modpos+0x15,seedpos) - - engine.poked(seedpos,math.random(1234567)) -- seed the generator :) - engine.poked(modpos+0x1c,count) --max size for div - - engine.poked(modpos+0x26,seedpos+4) --start of array - - --patch part - --pos=62873C+DF - -- pattern: A1,DWORD_,"CURRENTRACE",56,89,ANYBYTE,ANYBYTE,34,e8 - pos=offsets.find(offsets.base(),0xa1,DWORD_,offsets.getEx("CurrentRace"),0x56,0x89,ANYBYTE,ANYBYTE,0x34,0xe8) - function pokeCall(off) - engine.pokeb(off,0xe8) - engine.poked(off+1,modpos-off-5) - end - if pos~=0 then - print(string.format("Found @:%x",pos)) - pokeCall(pos) - else - print("Not found patch location!!!") - end - end - -end if not(FILE) then names=ParseNames("dfusion/migrants/races.txt")--io.open("plugins/migrants/races.txt"):lines() migrants(names) diff --git a/plugins/Dfusion/luafiles/tools/init.lua b/plugins/Dfusion/luafiles/tools/init.lua new file mode 100644 index 000000000..b6720d2b7 --- /dev/null +++ b/plugins/Dfusion/luafiles/tools/init.lua @@ -0,0 +1,497 @@ +tools={} +tools.menu=MakeMenu() +function tools.setrace() + RaceTable=RaceTable or BuildNameTable() --slow.If loaded don't load again + print("Your current race is:"..GetRaceToken(engine.peekw(offsets.getEx('CurrentRace')))) + print("Type new race's token name in full caps:") + repeat + entry=io.stdin:read() + id=RaceTable[entry] + until id~=nil + engine.pokew(offsets.getEx('CurrentRace'),id) +end +tools.menu:add("Set current race",tools.setrace) +function tools.GiveSentience(names) --TODO make pattern... + RaceTable=RaceTable or BuildNameTable() --slow.If loaded don't load again + if names ==nil then + ids={} + print("Type race's token name in full caps to give sentience to:") + repeat + entry=io.stdin:read() + id=RaceTable[entry] + until id~=nil + table.insert(ids,id) + else + ids={} + for _,name in pairs(names) do + id=RaceTable[name] + table.insert(ids,id) + end + end + for _,id in pairs(ids) do + local off=offsets.getEx('CreatureGloss') + local races=engine.peek(off,ptr_vector) + --print("Vector start:"..off) + + off=races:getval(id) + print(string.format("race location:%x",off)) + local castes=engine.peek(off,ptr_CrGloss.castes) + print(string.format("Caste count:%i",castes:size())) + local flagPattern=ptt_dfflag.new(17) + for i =0,castes:size()-1 do + local offCaste=castes:getval(i) + print("Caste name:"..engine.peek(offCaste,ptr_CrCaste.name):getval().."...") + local flagoffset=engine.peek(offCaste,ptr_CrCaste.flags_ptr) + local flags=engine.peek(flagoffset,flagPattern) + --print(string.format("%x",flagoffset)) + if flags:get(57) then + print("\tis sentient.") + else + print("\tnon sentient. Allocating IQ...") + flags:set(57,1) + engine.poke(flagoffset,flagPattern,flags) + end + end + end +end +tools.menu:add("Give Sentience",tools.GiveSentience) +function tools.embark() + off=offsets.find(0,0x66, 0x83, 0x7F ,0x1A ,0xFF,0x74,0x04) + if off~=0 then + engine.pokeb(off+5,0x90) + engine.pokeb(off+6,0x90) + print("Found and patched") + else + print("not found") + end +end +tools.menu:add("Embark anywhere",tools.embark) +function tools.getlegendsid(croff) + local vec=engine.peek(croff,ptr_Creature.legends) + if vec:size()==0 then + return 0 + end + for i =0,vector:size()-1 do + --if engine.peekd(vec:getval(i))~=0 then + -- print(string.format("%x",engine.peekd(vec:getval(i))-offsets.base())) + --end + if(engine.peekd(vec:getval(i))==offsets.getEx("vtableLegends")) then --easy to get.. just copy from player's-base + return engine.peekd(vec:getval(i)+4) + end + end + return 0 +end +function tools.getCreatureId(vector) + + tnames={} + rnames={} + --[[print("vector1 size:"..vector:size()) + print("vector2 size:"..vector2:size())]]-- + for i=0,vector:size()-1 do + --print(string.format("%x",vector:getval(i))) + + local name=engine.peek(vector:getval(i),ptt_dfstring):getval() + local lid= tools.getlegendsid(vector:getval(i)) + if lid ~=0 then + print(i..")*Creature Name:"..name.." race="..engine.peekw(vector:getval(i)+ptr_Creature.race.off).." legendid="..lid) + else + print(i..") Creature Name:"..name.." race="..engine.peekw(vector:getval(i)+ptr_Creature.race.off)) + end + if name ~="" and name~=nil then + tnames[i]=name + rnames[name]=i + end + end + print("=====================================") + print("type in name or number:") + r=io.stdin:read() + if tonumber(r) ==nil then + indx=rnames[r] + if indx==nil then return end + else + r=tonumber(r) + if rLOVE), q to quit:") + names={} + repeat + w=io.stdin:read(); + + if rwords[w]~=nil then + table.insert(names,w) + print("--added--") + end + + until w=='q' + end + + tnames={} + for _,v in pairs(names) do + if rwords[v] ~=nil then + table.insert(tnames,rwords[v]) --get word numbers + end + end + + local offsites=engine.peekd(offsets.getEx("SiteData"))+0x120 + snames={" pfort"," dfort"," cave","mohall","forest","hamlet","imploc"," lair"," fort"," camp"} + vector=engine.peek(offsites,ptr_vector) + print("Number of sites:"..vector:size()) + print("List of hits:") + for i =0,vector:size()-1 do + off=vector:getval(i) + + good=true + r="" + hits=0 + sname=engine.peek(off,ptr_site.name) + for k=0,6 do + vnum=sname[k]--engine.peekd(off+0x38+k*4) + tgood=false + + if vnum~=0xFFFFFFFF then + --print(string.format("%x",vnum)) + if names[vnum]~=nil then + r=r..names[vnum].." " + end + for _,v in pairs(tnames) do + if vnum==v then + tgood=true + --print("Match") + hits=hits+1 + break + end + end + if not tgood then + good=false + end + end + end + + if(good) and (hits>0)then + --if true then + --print("=====================") + typ=engine.peek(off,ptr_site.type)--engine.peekw(off+0x78) + flg=engine.peekd(engine.peek(off,ptr_site.flagptr)) + --flg=engine.peekd(off+224) + --flg2=engine.peekw(off) + --tv=engine.peek(off+0x84,ptr_vector) + --tv2=engine.peek(off+0xA4,ptr_vector) + + print(string.format("%d)%s off=%x type=%s\t flags=%x",i,r,off,snames[typ+1],flg)) + + if i%100==99 then + r=io.stdin:read() + end + + end + end + print("Type which to change (q cancels):") + repeat + r=io.stdin:read() + n=tonumber(r) + if(r=='q') then return end + until n~=nil + return vector:getval(n) +end +function tools.changesite(names) + off=tools.getsite(names) + snames={"Mountain halls (yours)","Dark fort","Cave","Mountain hall (NPC)","Forest retreat","Hamlet","Important location","Lair","Fort","Camp"} + + print("Type in the site type (q cancels):") + for k,v in pairs(snames) do + print((k-1).."->"..v) + end + repeat + r=io.stdin:read() + n2=tonumber(r) + if(r=='q') then return end + until n2~=nil + --off=vector:getval(n) + print(string.format("%x->%d",off,n2)) + engine.poke(off,ptr_site.type,n2) +end +function tools.changeflags(names) + myflag_pattern=ptt_dfflag.new(3*8) + off=tools.getsite(names) + offflgs=engine.peek(off,ptr_site.flagptr) + q='' + print(string.format("Site offset %x flags offset %x",off,offflgs)) + repeat + print("flags:") + + --off=vector:getval(n) + flg=engine.peek(offflgs,myflag_pattern) + r="" + for i=0,3*8-1 do + if flg:get(i)==1 then + r=r.."x" + else + r=r.."o" + end + if i%8==7 then + print(i-7 .."->"..r) + r="" + end + end + print("Type number to flip, or 'q' to quit.") + q=io.stdin:read() + n2=tonumber(q) + if n2~=nil then + + flg:flip(n2) + engine.poke(offflgs,myflag_pattern,flg) + end + until q=='q' +end +function tools.hostilate() + vector=engine.peek(offsets.getEx("CreatureVec"),ptr_vector) + id=engine.peekd(offsets.getEx("CreaturePtr")) + print(string.format("Vec:%d cr:%d",vector:size(),id)) + off=vector:getval(id) + crciv=engine.peek(off,ptr_Creature.civ) + print("Creatures civ:"..crciv) + curciv=engine.peekd(offsets.getEx("CurrentRace")-12) + print("My civ:"..curciv) + if curciv==crciv then + print("Friendly-making enemy") + engine.poke(off,ptr_Creature.civ,-1) + flg=engine.peek(off,ptr_Creature.flags) + flg:set(17,0) + print("flag 51:"..tostring(flg:get(51))) + engine.poke(off,ptr_Creature.flags,flg) + else + print("Enemy- making friendly") + engine.poke(off,ptr_Creature.civ,curciv) + flg=engine.peek(off,ptr_Creature.flags) + flg:set(17,1) + flg:set(19,0) + engine.poke(off,ptr_Creature.flags,flg) + end +end +function tools.mouseBlock() + local xs,ys,zs + xs,ys,zs=getxyz() + xs=math.floor(xs/16) + ys=math.floor(ys/16) + print("Mouse block is:"..xs.." "..ys.." "..zs) +end +function tools.protectsite() + local mapoffset=offsets.getEx("WorldData")--0x131C128+offsets.base() + local x=engine.peek(mapoffset+24,DWORD) + local y=engine.peek(mapoffset+28,DWORD) + local z=engine.peek(mapoffset+32,DWORD) + --vec=engine.peek(mapoffset,ptr_vector) + + print("Blocks loaded:"..x.." "..y.." "..z) + print("Select type:") + print("1. All (SLOW)") + print("2. range (x0 x1 y0 y1 z0 z1)") + print("3. One block around pointer") + print("anything else- quit") + q=io.stdin:read() + n2=tonumber(q) + if n2==nil then return end + if n2>3 or n2<1 then return end + local xs,xe,ys,ye,zs,ze + if n2==1 then + xs=0 + xe=x-1 + ys=0 + ye=y-1 + zs=0 + ze=z-1 + elseif n2==2 then + print("enter x0:") + xs=tonumber(io.stdin:read()) + print("enter x1:") + xe=tonumber(io.stdin:read()) + print("enter y0:") + ys=tonumber(io.stdin:read()) + print("enter y1:") + ye=tonumber(io.stdin:read()) + print("enter z0:") + zs=tonumber(io.stdin:read()) + print("enter z1:") + ze=tonumber(io.stdin:read()) + function clamp(t,vmin,vmax) + if t> vmax then return vmax end + if t< vmin then return vmin end + return t + end + xs=clamp(xs,0,x-1) + ys=clamp(ys,0,y-1) + zs=clamp(zs,0,z-1) + xe=clamp(xe,xs,x-1) + ye=clamp(ye,ys,y-1) + ze=clamp(ze,zs,z-1) + else + xs,ys,zs=getxyz() + xs=math.floor(xs/16) + ys=math.floor(ys/16) + xe=xs + ye=ys + ze=zs + end + local xblocks=engine.peek(mapoffset,DWORD) + local flg=bit.lshift(1,14) + for xx=xs,xe do + local yblocks=engine.peek(xblocks+xx*4,DWORD) + for yy=ys,ye do + local zblocks=engine.peek(yblocks+yy*4,DWORD) + for zz=zs,ze do + + + + local myblock=engine.peek(zblocks+zz*4,DWORD) + if myblock~=0 then + for i=0,255 do + local ff=engine.peek(myblock+0x67c+i*4,DWORD) + ff=bit.bor(ff,flg) --set 14 flag to 1 + engine.poke(myblock+0x67c+i*4,DWORD,ff) + end + end + end + print("Blocks done:"..xx.." "..yy) + end + end +end +function tools.fixwarp() + local mapoffset=offsets.getEx("WorldData")--0x131C128+offsets.base() + local x=engine.peek(mapoffset+24,DWORD) + local y=engine.peek(mapoffset+28,DWORD) + local z=engine.peek(mapoffset+32,DWORD) + --vec=engine.peek(mapoffset,ptr_vector) + + print("Blocks loaded:"..x.." "..y.." "..z) + print("Select type:") + print("1. All (SLOW)") + print("2. range (x0 x1 y0 y1 z0 z1)") + print("3. One block around pointer") + print("anything else- quit") + q=io.stdin:read() + n2=tonumber(q) + if n2==nil then return end + if n2>3 or n2<1 then return end + local xs,xe,ys,ye,zs,ze + if n2==1 then + xs=0 + xe=x-1 + ys=0 + ye=y-1 + zs=0 + ze=z-1 + elseif n2==2 then + print("enter x0:") + xs=tonumber(io.stdin:read()) + print("enter x1:") + xe=tonumber(io.stdin:read()) + print("enter y0:") + ys=tonumber(io.stdin:read()) + print("enter y1:") + ye=tonumber(io.stdin:read()) + print("enter z0:") + zs=tonumber(io.stdin:read()) + print("enter z1:") + ze=tonumber(io.stdin:read()) + function clamp(t,vmin,vmax) + if t> vmax then return vmax end + if t< vmin then return vmin end + return t + end + xs=clamp(xs,0,x-1) + ys=clamp(ys,0,y-1) + zs=clamp(zs,0,z-1) + xe=clamp(xe,xs,x-1) + ye=clamp(ye,ys,y-1) + ze=clamp(ze,zs,z-1) + else + xs,ys,zs=getxyz() + xs=math.floor(xs/16) + ys=math.floor(ys/16) + xe=xs + ye=ys + ze=zs + end + local xblocks=engine.peek(mapoffset,DWORD) + local flg=bit.bnot(bit.lshift(1,3)) + for xx=xs,xe do + local yblocks=engine.peek(xblocks+xx*4,DWORD) + for yy=ys,ye do + local zblocks=engine.peek(yblocks+yy*4,DWORD) + for zz=zs,ze do + local myblock=engine.peek(zblocks+zz*4,DWORD) + if myblock~=0 then + for i=0,255 do + local ff=engine.peek(myblock+0x67c+i*4,DWORD) + ff=bit.band(ff,flg) --set 14 flag to 1 + engine.poke(myblock+0x67c+i*4,DWORD,ff) + end + end + end + print("Blocks done:"..xx.." "..yy) + end + end +end \ No newline at end of file diff --git a/plugins/Dfusion/luafiles/tools/plugin.lua b/plugins/Dfusion/luafiles/tools/plugin.lua index 0a7bbc872..511b73205 100644 --- a/plugins/Dfusion/luafiles/tools/plugin.lua +++ b/plugins/Dfusion/luafiles/tools/plugin.lua @@ -1,501 +1,5 @@ --local bit = require("bit") -tools={} -tools.menu=MakeMenu() -function tools.setrace() - RaceTable=RaceTable or BuildNameTable() --slow.If loaded don't load again - print("Your current race is:"..GetRaceToken(engine.peekw(offsets.getEx('CurrentRace')))) - print("Type new race's token name in full caps:") - repeat - entry=io.stdin:read() - id=RaceTable[entry] - until id~=nil - engine.pokew(offsets.getEx('CurrentRace'),id) -end -tools.menu:add("Set current race",tools.setrace) -function tools.GiveSentience(names) --TODO make pattern... - RaceTable=RaceTable or BuildNameTable() --slow.If loaded don't load again - if names ==nil then - ids={} - print("Type race's token name in full caps to give sentience to:") - repeat - entry=io.stdin:read() - id=RaceTable[entry] - until id~=nil - table.insert(ids,id) - else - ids={} - for _,name in pairs(names) do - id=RaceTable[name] - table.insert(ids,id) - end - end - for _,id in pairs(ids) do - local off=offsets.getEx('CreatureGloss') - local races=engine.peek(off,ptr_vector) - --print("Vector start:"..off) - - off=races:getval(id) - print(string.format("race location:%x",off)) - local castes=engine.peek(off,ptr_CrGloss.castes) - print(string.format("Caste count:%i",castes:size())) - local flagPattern=ptt_dfflag.new(17) - for i =0,castes:size()-1 do - local offCaste=castes:getval(i) - print("Caste name:"..engine.peek(offCaste,ptr_CrCaste.name):getval().."...") - local flagoffset=engine.peek(offCaste,ptr_CrCaste.flags_ptr) - local flags=engine.peek(flagoffset,flagPattern) - --print(string.format("%x",flagoffset)) - if flags:get(57) then - print("\tis sentient.") - else - print("\tnon sentient. Allocating IQ...") - flags:set(57,1) - engine.poke(flagoffset,flagPattern,flags) - end - end - end -end -tools.menu:add("Give Sentience",tools.GiveSentience) -function tools.embark() - off=offsets.find(0,0x66, 0x83, 0x7F ,0x1A ,0xFF,0x74,0x04) - if off~=0 then - engine.pokeb(off+5,0x90) - engine.pokeb(off+6,0x90) - print("Found and patched") - else - print("not found") - end -end -tools.menu:add("Embark anywhere",tools.embark) -function tools.getlegendsid(croff) - local vec=engine.peek(croff,ptr_Creature.legends) - if vec:size()==0 then - return 0 - end - for i =0,vector:size()-1 do - --if engine.peekd(vec:getval(i))~=0 then - -- print(string.format("%x",engine.peekd(vec:getval(i))-offsets.base())) - --end - if(engine.peekd(vec:getval(i))==offsets.getEx("vtableLegends")) then --easy to get.. just copy from player's-base - return engine.peekd(vec:getval(i)+4) - end - end - return 0 -end -function tools.getCreatureId(vector) - tnames={} - rnames={} - --[[print("vector1 size:"..vector:size()) - print("vector2 size:"..vector2:size())]]-- - for i=0,vector:size()-1 do - --print(string.format("%x",vector:getval(i))) - - local name=engine.peek(vector:getval(i),ptt_dfstring):getval() - local lid= tools.getlegendsid(vector:getval(i)) - if lid ~=0 then - print(i..")*Creature Name:"..name.." race="..engine.peekw(vector:getval(i)+ptr_Creature.race.off).." legendid="..lid) - else - print(i..") Creature Name:"..name.." race="..engine.peekw(vector:getval(i)+ptr_Creature.race.off)) - end - if name ~="" and name~=nil then - tnames[i]=name - rnames[name]=i - end - end - print("=====================================") - print("type in name or number:") - r=io.stdin:read() - if tonumber(r) ==nil then - indx=rnames[r] - if indx==nil then return end - else - r=tonumber(r) - if rLOVE), q to quit:") - names={} - repeat - w=io.stdin:read(); - - if rwords[w]~=nil then - table.insert(names,w) - print("--added--") - end - - until w=='q' - end - - tnames={} - for _,v in pairs(names) do - if rwords[v] ~=nil then - table.insert(tnames,rwords[v]) --get word numbers - end - end - - local offsites=engine.peekd(offsets.getEx("SiteData"))+0x120 - snames={" pfort"," dfort"," cave","mohall","forest","hamlet","imploc"," lair"," fort"," camp"} - vector=engine.peek(offsites,ptr_vector) - print("Number of sites:"..vector:size()) - print("List of hits:") - for i =0,vector:size()-1 do - off=vector:getval(i) - - good=true - r="" - hits=0 - sname=engine.peek(off,ptr_site.name) - for k=0,6 do - vnum=sname[k]--engine.peekd(off+0x38+k*4) - tgood=false - - if vnum~=0xFFFFFFFF then - --print(string.format("%x",vnum)) - if names[vnum]~=nil then - r=r..names[vnum].." " - end - for _,v in pairs(tnames) do - if vnum==v then - tgood=true - --print("Match") - hits=hits+1 - break - end - end - if not tgood then - good=false - end - end - end - - if(good) and (hits>0)then - --if true then - --print("=====================") - typ=engine.peek(off,ptr_site.type)--engine.peekw(off+0x78) - flg=engine.peekd(engine.peek(off,ptr_site.flagptr)) - --flg=engine.peekd(off+224) - --flg2=engine.peekw(off) - --tv=engine.peek(off+0x84,ptr_vector) - --tv2=engine.peek(off+0xA4,ptr_vector) - - print(string.format("%d)%s off=%x type=%s\t flags=%x",i,r,off,snames[typ+1],flg)) - - if i%100==99 then - r=io.stdin:read() - end - - end - end - print("Type which to change (q cancels):") - repeat - r=io.stdin:read() - n=tonumber(r) - if(r=='q') then return end - until n~=nil - return vector:getval(n) -end -function tools.changesite(names) - off=tools.getsite(names) - snames={"Mountain halls (yours)","Dark fort","Cave","Mountain hall (NPC)","Forest retreat","Hamlet","Important location","Lair","Fort","Camp"} - - print("Type in the site type (q cancels):") - for k,v in pairs(snames) do - print((k-1).."->"..v) - end - repeat - r=io.stdin:read() - n2=tonumber(r) - if(r=='q') then return end - until n2~=nil - --off=vector:getval(n) - print(string.format("%x->%d",off,n2)) - engine.poke(off,ptr_site.type,n2) -end -function tools.changeflags(names) - myflag_pattern=ptt_dfflag.new(3*8) - off=tools.getsite(names) - offflgs=engine.peek(off,ptr_site.flagptr) - q='' - print(string.format("Site offset %x flags offset %x",off,offflgs)) - repeat - print("flags:") - - --off=vector:getval(n) - flg=engine.peek(offflgs,myflag_pattern) - r="" - for i=0,3*8-1 do - if flg:get(i)==1 then - r=r.."x" - else - r=r.."o" - end - if i%8==7 then - print(i-7 .."->"..r) - r="" - end - end - print("Type number to flip, or 'q' to quit.") - q=io.stdin:read() - n2=tonumber(q) - if n2~=nil then - - flg:flip(n2) - engine.poke(offflgs,myflag_pattern,flg) - end - until q=='q' -end -function tools.hostilate() - vector=engine.peek(offsets.getEx("CreatureVec"),ptr_vector) - id=engine.peekd(offsets.getEx("CreaturePtr")) - print(string.format("Vec:%d cr:%d",vector:size(),id)) - off=vector:getval(id) - crciv=engine.peek(off,ptr_Creature.civ) - print("Creatures civ:"..crciv) - curciv=engine.peekd(offsets.getEx("CurrentRace")-12) - print("My civ:"..curciv) - if curciv==crciv then - print("Friendly-making enemy") - engine.poke(off,ptr_Creature.civ,-1) - flg=engine.peek(off,ptr_Creature.flags) - flg:set(17,0) - print("flag 51:"..tostring(flg:get(51))) - engine.poke(off,ptr_Creature.flags,flg) - else - print("Enemy- making friendly") - engine.poke(off,ptr_Creature.civ,curciv) - flg=engine.peek(off,ptr_Creature.flags) - flg:set(17,1) - flg:set(19,0) - engine.poke(off,ptr_Creature.flags,flg) - end -end -function tools.mouseBlock() - local xs,ys,zs - xs,ys,zs=getxyz() - xs=math.floor(xs/16) - ys=math.floor(ys/16) - print("Mouse block is:"..xs.." "..ys.." "..zs) -end -function tools.protectsite() - local mapoffset=offsets.getEx("WorldData")--0x131C128+offsets.base() - local x=engine.peek(mapoffset+24,DWORD) - local y=engine.peek(mapoffset+28,DWORD) - local z=engine.peek(mapoffset+32,DWORD) - --vec=engine.peek(mapoffset,ptr_vector) - - print("Blocks loaded:"..x.." "..y.." "..z) - print("Select type:") - print("1. All (SLOW)") - print("2. range (x0 x1 y0 y1 z0 z1)") - print("3. One block around pointer") - print("anything else- quit") - q=io.stdin:read() - n2=tonumber(q) - if n2==nil then return end - if n2>3 or n2<1 then return end - local xs,xe,ys,ye,zs,ze - if n2==1 then - xs=0 - xe=x-1 - ys=0 - ye=y-1 - zs=0 - ze=z-1 - elseif n2==2 then - print("enter x0:") - xs=tonumber(io.stdin:read()) - print("enter x1:") - xe=tonumber(io.stdin:read()) - print("enter y0:") - ys=tonumber(io.stdin:read()) - print("enter y1:") - ye=tonumber(io.stdin:read()) - print("enter z0:") - zs=tonumber(io.stdin:read()) - print("enter z1:") - ze=tonumber(io.stdin:read()) - function clamp(t,vmin,vmax) - if t> vmax then return vmax end - if t< vmin then return vmin end - return t - end - xs=clamp(xs,0,x-1) - ys=clamp(ys,0,y-1) - zs=clamp(zs,0,z-1) - xe=clamp(xe,xs,x-1) - ye=clamp(ye,ys,y-1) - ze=clamp(ze,zs,z-1) - else - xs,ys,zs=getxyz() - xs=math.floor(xs/16) - ys=math.floor(ys/16) - xe=xs - ye=ys - ze=zs - end - local xblocks=engine.peek(mapoffset,DWORD) - local flg=bit.lshift(1,14) - for xx=xs,xe do - local yblocks=engine.peek(xblocks+xx*4,DWORD) - for yy=ys,ye do - local zblocks=engine.peek(yblocks+yy*4,DWORD) - for zz=zs,ze do - - - - local myblock=engine.peek(zblocks+zz*4,DWORD) - if myblock~=0 then - for i=0,255 do - local ff=engine.peek(myblock+0x67c+i*4,DWORD) - ff=bit.bor(ff,flg) --set 14 flag to 1 - engine.poke(myblock+0x67c+i*4,DWORD,ff) - end - end - end - print("Blocks done:"..xx.." "..yy) - end - end -end -function tools.fixwarp() - local mapoffset=offsets.getEx("WorldData")--0x131C128+offsets.base() - local x=engine.peek(mapoffset+24,DWORD) - local y=engine.peek(mapoffset+28,DWORD) - local z=engine.peek(mapoffset+32,DWORD) - --vec=engine.peek(mapoffset,ptr_vector) - - print("Blocks loaded:"..x.." "..y.." "..z) - print("Select type:") - print("1. All (SLOW)") - print("2. range (x0 x1 y0 y1 z0 z1)") - print("3. One block around pointer") - print("anything else- quit") - q=io.stdin:read() - n2=tonumber(q) - if n2==nil then return end - if n2>3 or n2<1 then return end - local xs,xe,ys,ye,zs,ze - if n2==1 then - xs=0 - xe=x-1 - ys=0 - ye=y-1 - zs=0 - ze=z-1 - elseif n2==2 then - print("enter x0:") - xs=tonumber(io.stdin:read()) - print("enter x1:") - xe=tonumber(io.stdin:read()) - print("enter y0:") - ys=tonumber(io.stdin:read()) - print("enter y1:") - ye=tonumber(io.stdin:read()) - print("enter z0:") - zs=tonumber(io.stdin:read()) - print("enter z1:") - ze=tonumber(io.stdin:read()) - function clamp(t,vmin,vmax) - if t> vmax then return vmax end - if t< vmin then return vmin end - return t - end - xs=clamp(xs,0,x-1) - ys=clamp(ys,0,y-1) - zs=clamp(zs,0,z-1) - xe=clamp(xe,xs,x-1) - ye=clamp(ye,ys,y-1) - ze=clamp(ze,zs,z-1) - else - xs,ys,zs=getxyz() - xs=math.floor(xs/16) - ys=math.floor(ys/16) - xe=xs - ye=ys - ze=zs - end - local xblocks=engine.peek(mapoffset,DWORD) - local flg=bit.bnot(bit.lshift(1,3)) - for xx=xs,xe do - local yblocks=engine.peek(xblocks+xx*4,DWORD) - for yy=ys,ye do - local zblocks=engine.peek(yblocks+yy*4,DWORD) - for zz=zs,ze do - local myblock=engine.peek(zblocks+zz*4,DWORD) - if myblock~=0 then - for i=0,255 do - local ff=engine.peek(myblock+0x67c+i*4,DWORD) - ff=bit.band(ff,flg) --set 14 flag to 1 - engine.poke(myblock+0x67c+i*4,DWORD,ff) - end - end - end - print("Blocks done:"..xx.." "..yy) - end - end -end if not(FILE) then tools.menu:add("Change site type",tools.changesite) tools.menu:add("Change site flags",tools.changeflags)