Page 1 of 1
Colobot - Minetest Mod -

Posted:
Mon Jun 17, 2013 15:16
by issa
Hello,
idon't know if u know colobot, is a game, how learn programming robots, it's very cool, now the source code is free.
so my question can we imagine, on minetes we can craft robot and program ther in the game with some easy function, like move(+10), found(), turn(90), and make some real robots to make easier the survival mod.
so what do u think of this ?
thanks to you.

Posted:
Mon Jun 17, 2013 15:20
by Nore
I have programmed some mod where a robot can move, place blocks, dig them, etc. It uses fuel to move, and it can craft items. I have been able to make a program that makes the robot replicate. However, it is not finished yet, so I will release it later. You can still try it
http://github.com/Novatux/turtle

Posted:
Mon Jun 17, 2013 15:33
by issa
Nore wrote:I have programmed some mod where a robot can move, place blocks, dig them, etc. It uses fuel to move, and it can craft items. I have been able to make a program that makes the robot replicate. However, it is not finished yet, so I will release it later. You can still try it
http://github.com/Novatux/turtle
hello,
thansk i have try, but i don't understand how that's work, now i have this :


Posted:
Mon Jun 17, 2013 15:39
by Nore
You should have an item which is named turtle, and which has no iventory image, so it should be an uniform color. Place it, and you will get a robot, which can be programmed in lua. However, it is difficult to explain how you can program it, but see the luacontroller documentation of mesecons to know what the idea is, and the following code to learn the api:
Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
- Code: Select all
DOWN=-300
function v3add(v1,v2)
return {x=v1.x+v2.x, y=v1.y+v2.y, z=v1.z+v2.z}
end
function v3sub(v1,v2)
return {x=v1.x-v2.x, y=v1.y-v2.y, z=v1.z-v2.z}
end
function forward(iid)
mem.pos = v3add(mem.pos, mem.dir)
turtle.forward(iid)
end
function back(iid)
mem.pos = v3sub(mem.pos, mem.dir)
turtle.back(iid)
end
function up(iid)
mem.pos.y=mem.pos.y+1
turtle.up(iid)
end
function down(iid)
mem.pos.y=mem.pos.y-1
turtle.down(iid)
end
function turnleft(iid)
mem.dir={x=mem.dir.z, y=mem.dir.y, z=-mem.dir.x}
turtle.turnleft(iid)
end
function turnright(iid)
mem.dir={x=-mem.dir.z, y=mem.dir.y, z=mem.dir.x}
turtle.turnright(iid)
end
function gotoface(iid, dir)
if dir.x==0 then
if mem.dir.x==-dir.z then
turnleft(iid)
elseif mem.dir.x==dir.z then
turnright(iid)
elseif mem.dir.z==dir.z then
interrupt(0, iid)
else
mem.gotofaceiid=iid
turnleft("gotoface")
end
else
if mem.dir.z==dir.x then
turnleft(iid)
elseif mem.dir.z==-dir.x then
turnright(iid)
elseif mem.dir.x==dir.x then
interrupt(0, iid)
else
mem.gotofaceiid=iid
turnleft("gotoface")
end
end
end
function nface(iid)
gotoface(iid, {x=0,y=0,z=1})
end
function put_all_except(name)
if turtle.getstack(1).name~=name then
turtle.drop(1)
end
if turtle.getstack(2).name~=name then
turtle.drop(2)
end
if turtle.getstack(3).name~=name then
turtle.drop(3)
end
if turtle.getstack(4).name~=name then
turtle.drop(4)
end
if turtle.getstack(5).name~=name then
turtle.drop(5)
end
if turtle.getstack(6).name~=name then
turtle.drop(6)
end
if turtle.getstack(7).name~=name then
turtle.drop(7)
end
if turtle.getstack(8).name~=name then
turtle.drop(8)
end
if turtle.getstack(9).name~=name then
turtle.drop(9)
end
if turtle.getstack(10).name~=name then
turtle.drop(10)
end
if turtle.getstack(11).name~=name then
turtle.drop(11)
end
if turtle.getstack(12).name~=name then
turtle.drop(12)
end
if turtle.getstack(13).name~=name then
turtle.drop(13)
end
if turtle.getstack(14).name~=name then
turtle.drop(14)
end
if turtle.getstack(15).name~=name then
turtle.drop(15)
end
if turtle.getstack(16).name~=name then
turtle.drop(16)
end
end
function put_all(name)
if turtle.getstack(1).name==name then
turtle.drop(1)
end
if turtle.getstack(2).name==name then
turtle.drop(2)
end
if turtle.getstack(3).name==name then
turtle.drop(3)
end
if turtle.getstack(4).name==name then
turtle.drop(4)
end
if turtle.getstack(5).name==name then
turtle.drop(5)
end
if turtle.getstack(6).name==name then
turtle.drop(6)
end
if turtle.getstack(7).name==name then
turtle.drop(7)
end
if turtle.getstack(8).name==name then
turtle.drop(8)
end
if turtle.getstack(9).name==name then
turtle.drop(9)
end
if turtle.getstack(10).name==name then
turtle.drop(10)
end
if turtle.getstack(11).name==name then
turtle.drop(11)
end
if turtle.getstack(12).name==name then
turtle.drop(12)
end
if turtle.getstack(13).name==name then
turtle.drop(13)
end
if turtle.getstack(14).name==name then
turtle.drop(14)
end
if turtle.getstack(15).name==name then
turtle.drop(15)
end
if turtle.getstack(16).name==name then
turtle.drop(16)
end
end
function find_stack(name)
if turtle.getstack(1).name==name then
return 1
elseif turtle.getstack(2).name==name then
return 2
elseif turtle.getstack(3).name==name then
return 3
elseif turtle.getstack(4).name==name then
return 4
elseif turtle.getstack(5).name==name then
return 5
elseif turtle.getstack(6).name==name then
return 6
elseif turtle.getstack(7).name==name then
return 7
elseif turtle.getstack(8).name==name then
return 8
elseif turtle.getstack(9).name==name then
return 9
elseif turtle.getstack(10).name==name then
return 10
elseif turtle.getstack(11).name==name then
return 11
elseif turtle.getstack(12).name==name then
return 12
elseif turtle.getstack(13).name==name then
return 13
elseif turtle.getstack(14).name==name then
return 14
elseif turtle.getstack(15).name==name then
return 15
elseif turtle.getstack(16).name==name then
return 16
end
return nil
end
--print(event)
if event.type=="program" then
mem.spx=1
mem.spy=1
mem.pos = {x=0,y=0,z=0}
mem.dir = {x=0,y=0,z=1}
turtle.dig()
turtle.refuel(1)
forward("cuttree")
mem.return_to="firsttree"
elseif event.type=="endmove" or event.type=="interrupt" then
if event.iid=="gotoface" then
turnleft(mem.gotofaceiid)
elseif event.iid=="cuttree" then
turtle.dig()
mem.origface={x=mem.dir.x,y=mem.dir.y,z=mem.dir.z}
name = turtle.detectup()
if name=="air" then
down("endcuttree")
else
turtle.digup()
up("cuttree2")
end
elseif event.iid=="cuttree2" then
turtle.dig()
turnleft("cuttree3")
elseif event.iid=="cuttree3" then
turtle.dig()
turnleft("cuttree4")
elseif event.iid=="cuttree4" then
turtle.dig()
turnleft("cuttree5")
elseif event.iid=="cuttree5" then
turtle.dig()
name = turtle.detectup()
if name=="air" then
down("endcuttree")
else
turtle.digup()
up("cuttree2")
end
elseif event.iid=="endcuttree" then
name = turtle.detectdown()
turtle.suckdown()
if name=="air" then
down("endcuttree")
else
gotoface(mem.return_to, mem.origface)
end
elseif event.iid=="firsttree" then
nface("firsttree1")
elseif event.iid=="firsttree1" then
turtle.dropup(2)
turtle.dropup(3)
turtle.craft(3)
turtle.dropup(1)
turtle.moveto(2,1,1)
turtle.moveto(2,3,5)
turtle.moveto(2,5,1)
turtle.moveto(2,7,1)
turtle.moveto(2,9,1)
turtle.moveto(2,10,1)
turtle.moveto(2,11,1)
turtle.craft(1)
turtle.place(1)
turtle.craft(4)
turtle.drop(1)
interrupt(5,"firsttree2")
elseif event.iid=="firsttree2" then
turtle.suckup()
turtle.suckup()
turtle.suckup()
turtle.suckup() -- Excess suckups are whenever saplings fell
turtle.suckup()
turtle.suckup()
turtle.suckup()
turtle.suckup()
turnleft("firsttree3")
elseif event.iid=="firsttree3" then
local s=nil
s=find_stack("default:leaves")
if s==nil then --we don't have leaves, only spalings
interrupt(0.1,"plant_sapling")
else
mem.leaves_stack=s
turtle.place(s)
mem.return_to="plant_sapling"
interrupt(0.1,"leaves_dig")
end
elseif event.iid=="leaves_dig" then
turtle.dig()
interrupt(0.1, "leaves_place")
elseif event.iid=="leaves_place" then
if turtle.getstack(mem.leaves_stack).name=="default:leaves" then
turtle.place(mem.leaves_stack)
interrupt(0.1,"leaves_dig")
else --no more leaves
interrupt(0.1,mem.return_to)
end
elseif event.iid=="plant_sapling" then
local s
local w
s=find_stack("default:sapling")
w=find_stack("default:tree")
mem.sapstack=s
turtle.place(s)
turtle.refuel(w, 1)
mem.ddown = math.floor(turtle.get_fuel_time()/2)-10
turnleft("plant_sapling2")
elseif event.iid=="plant_sapling2" then
turtle.place(mem.sapstack)
turnleft("plant_sapling3")
elseif event.iid=="plant_sapling3" then
turtle.place(mem.sapstack)
turnright("dig1")
elseif event.iid=="dig" then
m=find_stack("default:mese_crystal")
d=find_stack("default:diamond")
if m~=nil and d~=nil and turtle.getstack(m).count>=30 and turtle.getstack(d).count>=7 then
nface("craft")
else
w=find_stack("default:tree")
if w~=nil then
turtle.refuel(w)
end
c=find_stack("default:coal_lump")
if c~=nil then
turtle.refuel(c)
end
ddown = math.floor(turtle.get_fuel_time()/2)-30
if ddown>mem.ddown+30 then
mem.ddown=ddown
interrupt(0,"dig1")
else
turnright("checktree")
end
end
elseif event.iid=="dig1" then
if mem.pos.y==-mem.ddown then
turtle.dig()
forward("dig2")
elseif mem.pos.y==DOWN then
mem.mmove=(mem.ddown+DOWN)*2
mem.spx=mem.spx-1
mem.spy=mem.spy-1
interrupt(0,"dig5")
mem.sx=0
mem.sy=0
else
turtle.digdown()
down("dig1")
end
elseif event.iid=="dig2" then
if mem.pos.y==-2 then
back("dig3")
else
turtle.digup()
up("dig2")
end
elseif event.iid=="dig3" then
up("dig4")
elseif event.iid=="dig4" then
if mem.pos.y==0 then
turnright("checktree")
else
turtle.digup()
up("dig4")
end
elseif event.iid=="dig5" then
mem.mmove=mem.mmove-1
turtle.digup()
turtle.digdown()
if mem.mmove%100==0 then put_all("default:cobble") end
if mem.sx==mem.spx then
mem.spx=mem.spx+1
turnleft("dig6")
elseif mem.mmove<=0 and mem.sx==0 then
if mem.sy==0 then
gotoface("dig4",{x=0,y=0,z=-1})
else
turnleft("dig6")
end
else
turtle.dig()
mem.sx=mem.sx+1
forward("dig5")
end
elseif event.iid=="dig6" then
mem.mmove=mem.mmove-1
turtle.digup()
turtle.digdown()
if mem.mmove%100==0 then put_all("default:cobble") end
if mem.sy==mem.spy then
mem.spy=mem.spy+1
turnleft("dig7")
elseif mem.mmove<=0 and mem.sy==0 then
if mem.sx==0 then
gotoface("dig4",{x=0,y=0,z=-1})
else
turnleft("dig7")
end
else
turtle.dig()
mem.sy=mem.sy+1
forward("dig6")
end
elseif event.iid=="dig7" then
mem.mmove=mem.mmove-1
turtle.digup()
turtle.digdown()
if mem.mmove%100==0 then put_all("default:cobble") end
if mem.sx==-mem.spx then
turnleft("dig8")
elseif mem.mmove<=0 and mem.sx==0 then
if mem.sy==0 then
gotoface("dig4",{x=0,y=0,z=-1})
else
turnleft("dig8")
end
else
turtle.dig()
mem.sx=mem.sx-1
forward("dig7")
end
elseif event.iid=="dig8" then
mem.mmove=mem.mmove-1
turtle.digup()
turtle.digdown()
if mem.mmove%100==0 then put_all("default:cobble") end
if mem.sy==-mem.spy then
turnleft("dig5")
elseif mem.mmove<=0 and mem.sy==0 then
if mem.sx==0 then
gotoface("dig4",{x=0,y=0,z=-1})
else
turnleft("dig5")
end
else
turtle.dig()
mem.sy=mem.sy-1
forward("dig8")
end
elseif event.iid=="checktree" then
put_all("default:cobble")
local name=turtle.detect()
if name=="default:tree" then
mem.return_to="endchecktree"
turtle.dig()
forward("cuttree")
elseif name=="air" then
sapstack = find_stack("default:sapling")
if sapstack==nil then
s=find_stack("default:leaves")
mem.leaves_stack=s
turtle.place(s)
mem.return_to="checktree"
interrupt(0.1,"leaves_dig")
else
turtle.place(sapstack)
interrupt(0, "checktree")
end
else
turnleft("checktree2")
end
elseif event.iid=="endchecktree" then
back("checktree")
elseif event.iid=="checktree2" then
local name=turtle.detect()
if name=="default:tree" then
mem.return_to="endchecktree2"
turtle.dig()
forward("cuttree")
elseif name=="air" then
sapstack = find_stack("default:sapling")
if sapstack==nil then
s=find_stack("default:leaves")
mem.leaves_stack=s
turtle.place(s)
mem.return_to="checktree2"
interrupt(0.1,"leaves_dig")
else
turtle.place(sapstack)
interrupt(0, "checktree2")
end
else
turnleft("checktree3")
end
elseif event.iid=="endchecktree2" then
back("checktree2")
elseif event.iid=="checktree3" then
local name=turtle.detect()
if name=="default:tree" then
mem.return_to="endchecktree3"
turtle.dig()
forward("cuttree")
elseif name=="air" then
sapstack = find_stack("default:sapling")
if sapstack==nil then
s=find_stack("default:leaves")
mem.leaves_stack=s
turtle.place(s)
mem.return_to="checktree3"
interrupt(0.1,"leaves_dig")
else
turtle.place(sapstack)
interrupt(0, "checktree3")
end
else
turnright("dig")
end
elseif event.iid=="endchecktree3" then
back("checktree3")
elseif event.iid=="craft" then
d=find_stack("default:diamond")
turtle.drop(d)
interrupt(5,"craft2")
elseif event.iid=="craft2" then
put_all_except("default:mese_crystal")
m=find_stack("default:mese_crystal")
turtle.moveto(m,16,99)
turtle.moveto(16,1,4)
turtle.moveto(16,2,4)
turtle.moveto(16,3,4)
turtle.moveto(16,5,3)
turtle.moveto(16,6,3)
turtle.moveto(16,7,3)
turtle.moveto(16,9,3)
turtle.moveto(16,10,3)
turtle.moveto(16,11,3)
turtle.dropup(16)
turtle.craft(3)
turtle.suck()
turtle.drop(4)
turtle.moveto(5,6,1)
turtle.moveto(5,10,15)
turtle.craft(1)
turtle.dropup(10)
turtle.moveto(1,2,1)
interrupt(5,"craft3")
elseif event.iid=="craft3" then
turtle.suck()
turtle.moveto(1,6,1)
turtle.moveto(1,9,1)
turtle.moveto(1,11,1)
turtle.suck()
turtle.moveto(1,3,1)
turtle.moveto(1,5,1)
turtle.moveto(1,7,1)
turtle.moveto(1,10,1)
turtle.craft(1)
turtle.suckup()
turtle.suckup()
turtle.suckup()
turtle.suckup()
turtle.suckup()
put_all_except()
end
end

Posted:
Mon Jun 17, 2013 15:59
by issa
is exatly what i want :)
but how lunch the code :
So the turtle icon :

and where to write the code :

So now how play the code, to move the cube ?

Posted:
Mon Jun 17, 2013 16:38
by Nore
Code is in the left upper rectangle. The top right inventory is for items the turtle will have (you might need to put some fuel in the first slot and to call turtle.refuel(1)) The line is to write a filename the turtle will save to (it will be in mods/turtle/progs/<name>.lua ) Use the open and save buttons for that. You can also use your favourite text editor and save the file there, then use the open button. To run the code, this is the big button just below the code text area.

Posted:
Mon Jun 17, 2013 19:21
by issa
i have successfull make move block turtle :
with this code :
turtle.refuel(1)
turtle.back(34);
turtle.up(25);
and only with lava for fuel :/
so know please continue this mod is very exelent :)
need to add a real good model for turtle and add some features for the code :=

Posted:
Mon Jun 17, 2013 19:36
by Nore
If you use turtle.refuel(1), you need to put the fuel in the first inventory slot. Moreover, turtle.back(), turtle.forward(), ... do not work the way you use them: the code will continue to run while the turtle is moving, and it will generate an event when the turtle will have finished:
move successful: {type="endmove",iid=iid}
move unsuccessful (no fuel, blocked, already moving): {type="failmove",iid=iid}
See the documentaton of luacontrollers to understand how events work: this is the same idea, only events are different. The function interrupt() works like the luacontroller one.