diff --git a/plugins/Dfusion/luafiles/common.lua b/plugins/Dfusion/luafiles/common.lua index 857581024..9a8004676 100644 --- a/plugins/Dfusion/luafiles/common.lua +++ b/plugins/Dfusion/luafiles/common.lua @@ -467,7 +467,14 @@ function ParseNames(path) end return ret end - +function getSelectedUnit() + local unit_indx=df.ui_selected_unit + if unit_indx%d",off,n2)) engine.poke(off,ptr_site.type,n2) end +function tools.empregnate(unit) + if unit==nil then + unit=getSelectedUnit() + end + if unit==nil then + error("Failed to empregnate. Unit not selected/valide") + end + local arr1=unit.appearance.unk_51c + local arr2=unit.appearance.unk_51c + local created=false + if unit.relations.pregnancy_ptr:tonumber()==0 then + print("creating preg ptr.") + unit.relations.pregnancy_ptr:newref() + created=true + end + local tarr1=unit.relations.pregnancy_ptr:deref().anon_1 + local tarr2=unit.relations.pregnancy_ptr:deref().anon_2 + if created or tarr1.size~= arr1.size then + print("Setting up arr1") + initType(tarr1,arr1.size) + end + if created or tarr2.size~= arr2.size then + print("Setting up arr1") + initType(tarr2,arr2.size) + end + print("Setting preg timer.") + unit.relations.pregnancy_timer=10 + unit.relations.pregnancy_mystery=1 +end +tools.menu:add("Empregnate",tools.empregnate) function tools.changeflags(names) myflag_pattern=ptt_dfflag.new(3*8) off=tools.getsite(names) diff --git a/plugins/Dfusion/luafiles/xml_types.lua b/plugins/Dfusion/luafiles/xml_types.lua index b3fa67239..eff9b20a1 100644 --- a/plugins/Dfusion/luafiles/xml_types.lua +++ b/plugins/Dfusion/luafiles/xml_types.lua @@ -418,6 +418,13 @@ function type_pointer.wrap:tonumber() local myptr=rawget(self,"ptr") return engine.peekd(myptr)--type_read(DWORD,myptr) end +function type_pointer.wrap:__setup(trg) + if trg~= nil then + self:fromnumber(trg) + else + self:fromnumber(0) + end +end function type_pointer.wrap:fromnumber(num) local myptr=rawget(self,"ptr") return engine.poked(myptr,num)--type_write(DWORD,myptr,num) @@ -432,6 +439,13 @@ function type_pointer.wrap:setref(val) local mytype=rawget(self,"mtype") return type_write(mytype.ptype,engine.peekd(myptr),val) end +function type_pointer.wrap:newref(val) + local myptr=rawget(self,"ptr") + local mytype=rawget(self,"mtype") + local ptr=engine.alloc(mytype.ptype.size) + self:fromnumber(ptr) + return ptr +end function type_pointer:makewrap(ptr) local o={} o.ptr=ptr @@ -451,6 +465,7 @@ function dfarr.new(node,obj) setmetatable(o,dfarr) o.size=8 o.__align=4 + o.item_type=makeType(first_of_type(node,"ld:item")) return o end function dfarr:makewrap(address) @@ -461,24 +476,34 @@ function dfarr:makewrap(address) return o end dfarr.wrap={} +function dfarr.wrap:__setup(size) + local mtype=rawget(self,"mtype") + engine.pokew(rawget(self,"ptr")+4,size) + local newptr=engine.alloc(size*mtype.item_type.size) + engine.poked(rawget(self,"ptr"),newptr) +end function dfarr.wrap:__index(key) local num=tonumber(key) local mtype=rawget(self,"mtype") - local size=type_read(rawget(self,"ptr")+4,DWORD) - error("TODO make __index for dfarray") + local size=engine.peekw(rawget(self,"ptr")+4) + if key=="size" then + return size + end + local item_start=engine.peekd(rawget(self,"ptr")) if num~=nil and num(1); + size_t pos=reinterpret_cast(malloc(size)); + st.push(pos); + return 1; +} +static int lua_malloc_free(lua_State *L) +{ + lua::state st(L); + size_t ptr=st.as(1); + free(reinterpret_cast(ptr)); + return 0; +} #ifdef LINUX_BUILD static size_t __attribute__((stdcall)) PushValue(size_t ret,uint32_t eax,uint32_t ebx,uint32_t ecx,uint32_t edx,uint32_t edi,uint32_t esi,uint32_t esp,uint32_t ebp) #else @@ -197,6 +212,8 @@ static int Resume_Df(lua_State *L) } const luaL_Reg lua_misc_func[]= { + {"alloc",lua_malloc}, + {"free",lua_malloc_free}, {"loadmod",LoadMod}, {"getmod",GetMod}, {"loadobj",LoadObj},