Colobot - Minetest Mod -

issa
Member
 
Posts: 119
Joined: Wed Apr 03, 2013 19:01

Colobot - Minetest Mod -

by issa » Mon Jun 17, 2013 15:16

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.
 

Nore
Member
 
Posts: 468
Joined: Wed Nov 28, 2012 11:35
GitHub: Ekdohibs

by Nore » Mon Jun 17, 2013 15:20

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
Last edited by Nore on Mon Jun 17, 2013 15:21, edited 1 time in total.
 

issa
Member
 
Posts: 119
Joined: Wed Apr 03, 2013 19:01

by issa » Mon Jun 17, 2013 15:33

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 :

Image
 

Nore
Member
 
Posts: 468
Joined: Wed Nov 28, 2012 11:35
GitHub: Ekdohibs

by Nore » Mon Jun 17, 2013 15:39

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
 

issa
Member
 
Posts: 119
Joined: Wed Apr 03, 2013 19:01

by issa » Mon Jun 17, 2013 15:59

is exatly what i want :)


but how lunch the code :

So the turtle icon :

Image



and where to write the code :

Image

So now how play the code, to move the cube ?
Last edited by issa on Mon Jun 17, 2013 15:59, edited 1 time in total.
 

Nore
Member
 
Posts: 468
Joined: Wed Nov 28, 2012 11:35
GitHub: Ekdohibs

by Nore » Mon Jun 17, 2013 16:38

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.
 

issa
Member
 
Posts: 119
Joined: Wed Apr 03, 2013 19:01

by issa » Mon Jun 17, 2013 19:21

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 :=
 

Nore
Member
 
Posts: 468
Joined: Wed Nov 28, 2012 11:35
GitHub: Ekdohibs

by Nore » Mon Jun 17, 2013 19:36

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.
 


Return to Minetest Features

Who is online

Users browsing this forum: No registered users and 7 guests

cron