reuse icons and blbs to remove some content
This commit is contained in:
@ -32,7 +32,7 @@ datablock fxDTSBrickData(LogicGate_EventGate_Data : brick1x1fData)
|
||||
category = "Logic Bricks";
|
||||
subCategory = "Special";
|
||||
uiName = "Event Gate";
|
||||
iconName = $LuaLogic::Path @ "icons/EventGate";
|
||||
iconName = $LuaLogic::Path @ "bricks/icons/1x1f Diode";
|
||||
brickFile = $LuaLogic::Path @ "bricks/blb/1x1f_1i_1o.blb";
|
||||
hasPrint = 1;
|
||||
printAspectRatio = "Logic";
|
||||
|
Binary file not shown.
@ -1,12 +0,0 @@
|
||||
|
||||
return function(gate)
|
||||
gate.brickcolor = 0
|
||||
gate.brickcolorfx = 0
|
||||
gate.brickshapefx = 0
|
||||
gate.brickray = 0
|
||||
gate.brickcol = 0
|
||||
gate.brickren = 0
|
||||
gate.waiting = true
|
||||
gate.robotpos = {0, 0, 0}
|
||||
gate.robotdir = 0
|
||||
end
|
@ -1,33 +0,0 @@
|
||||
|
||||
local function intToPort(gate, port, len, v)
|
||||
for i = 1, len do
|
||||
local p = math.pow(2, i-1)
|
||||
Gate.setportstate(gate, port+i-1, math.floor(v/p)%2)
|
||||
end
|
||||
end
|
||||
|
||||
return function(gate, argv)
|
||||
local arg = argv[1]:gsub("^ +", ""):gsub(" +$", "")
|
||||
for word in arg:gmatch("[^\t]+") do
|
||||
local first, rest = word:sub(1, 1), word:sub(2, #word)
|
||||
local vec = {}
|
||||
for a in rest:gmatch("[^ ]+") do table.insert(vec, tonumber(a) or error("invalid number "..a)) end
|
||||
if first=="P" then -- set position
|
||||
assert(#vec==4, "invalid position given to robot: "..word)
|
||||
gate.robotpos = {vec[1], vec[2], vec[3]}
|
||||
gate.robotdir = vec[4]
|
||||
elseif first=="B" then -- detected brick info
|
||||
assert(#vec==7, "invalid brick info given to robot: "..word)
|
||||
gate.brickexists = vec[1]
|
||||
gate.brickcolor = vec[2]
|
||||
gate.brickcolorfx = vec[3]
|
||||
gate.brickshapefx = vec[4]
|
||||
gate.brickray = vec[5]
|
||||
gate.brickcol = vec[6]
|
||||
gate.brickren = vec[7]
|
||||
intToPort(gate, 15, 6, gate.brickcolor)
|
||||
Gate.setportstate(gate, 21, gate.brickexists)
|
||||
else error("invalid control word given to robot: \""..word.."\".. (first \""..first.."\")") end
|
||||
end
|
||||
gate.waiting = false
|
||||
end
|
@ -1,60 +0,0 @@
|
||||
|
||||
local function intFromPort(gate, port, len)
|
||||
local v = 0
|
||||
for i = 1, len do
|
||||
v = v + Gate.getportstate(gate, port+i-1)*math.pow(2, i-1)
|
||||
end
|
||||
return v
|
||||
end
|
||||
|
||||
local function rotateVector(vec, rot)
|
||||
if rot==0 then return { vec[1], vec[2], vec[3]}
|
||||
elseif rot==1 then return { vec[2], -vec[1], vec[3]}
|
||||
elseif rot==2 then return {-vec[1], -vec[2], vec[3]}
|
||||
elseif rot==3 then return {-vec[2], vec[1], vec[3]}
|
||||
else error("invalid rot "..rot) end
|
||||
end
|
||||
|
||||
return function(gate)
|
||||
if not gate.waiting then
|
||||
local action = ""
|
||||
if Gate.getportstate(gate, 7)~=0 then -- remove brick
|
||||
action = action.."R\t"
|
||||
end
|
||||
if Gate.getportstate(gate, 8)~=0 then -- plant brick
|
||||
local color = intFromPort(gate, 1, 6)
|
||||
local colorfx = 0
|
||||
local shapefx = 0
|
||||
local ray = 1
|
||||
local col = 1
|
||||
local ren = 1
|
||||
action = action.."P "..color.." "..colorfx.." "..shapefx.." "..ray.." "..col.." "..ren.."\t"
|
||||
end
|
||||
if Gate.getportstate(gate, 22)~=0 then -- detect brick
|
||||
action = action.."D\t"
|
||||
end
|
||||
|
||||
local movePos = {0, 0, 0}
|
||||
if Gate.getportstate(gate, 9)~=0 then movePos[3] = movePos[3]-0.2 end -- down
|
||||
if Gate.getportstate(gate, 10)~=0 then movePos[3] = movePos[3]+0.2 end -- up
|
||||
if Gate.getportstate(gate, 11)~=0 then movePos[1] = movePos[1]+0.5 end -- right
|
||||
if Gate.getportstate(gate, 12)~=0 then movePos[1] = movePos[1]-0.5 end -- left
|
||||
if Gate.getportstate(gate, 13)~=0 then movePos[2] = movePos[2]-0.5 end -- back
|
||||
if Gate.getportstate(gate, 14)~=0 then movePos[2] = movePos[2]+0.5 end -- forward
|
||||
local moveRotation = 0
|
||||
--if Gate.getportstate(gate, 13)~=0 then moveRotation = moveRotation+1 end -- right
|
||||
--if Gate.getportstate(gate, 14)~=0 then moveRotation = moveRotation-1 end -- left
|
||||
gate.robotdir = (gate.robotdir + moveRotation)%4
|
||||
|
||||
if movePos[1]~=0 or movePos[2]~=0 or movePos[3]~=0 or moveRotation~=0 then
|
||||
movePos = rotateVector(movePos, gate.robotdir)
|
||||
gate.robotpos = { gate.robotpos[1]+movePos[1], gate.robotpos[2]+movePos[2], gate.robotpos[3]+movePos[3] }
|
||||
action = action.."M "..gate.robotpos[1].." "..gate.robotpos[2].." "..gate.robotpos[3].." "..gate.robotdir.."\t"
|
||||
end
|
||||
|
||||
if action~="" then
|
||||
Gate.cb(gate, action:sub(1, #action-1))
|
||||
gate.waiting = true
|
||||
end
|
||||
end
|
||||
end
|
@ -1,283 +0,0 @@
|
||||
|
||||
datablock StaticShapeData(LuaLogic_RobotShapeData) {
|
||||
shapeFile = $LuaLogic::Path @ "bricks/special/cube.dts";
|
||||
};
|
||||
|
||||
datablock fxDTSBrickData(LogicGate_RobotController_Data) {
|
||||
brickFile = $LuaLogic::Path @ "bricks/blb/RobotController.blb";
|
||||
category = "Logic Bricks";
|
||||
subCategory = "Special";
|
||||
uiName = "Robot Controller";
|
||||
iconName = $LuaLogic::Path @ "icons/Robot Controller";
|
||||
hasPrint = 1;
|
||||
printAspectRatio = "Logic";
|
||||
orientationFix = 3;
|
||||
|
||||
isLogic = true;
|
||||
isLogicGate = true;
|
||||
//isLogicInput = true;
|
||||
|
||||
logicInit = lualogic_readfile($LuaLogic::Path @ "bricks/special/robot-init.lua" );
|
||||
logicUpdate = lualogic_readfile($LuaLogic::Path @ "bricks/special/robot-update.lua");
|
||||
logicInput = lualogic_readfile($LuaLogic::Path @ "bricks/special/robot-input.lua" );
|
||||
|
||||
logicUIName = "Robot Controller";
|
||||
logicUIDesc = "Creates and controls a mobile robot that can detect and place bricks";
|
||||
|
||||
numLogicPorts = 22;
|
||||
|
||||
logicPortType[0] = 1;
|
||||
logicPortPos[0] = "15 -3 0";
|
||||
logicPortDir[0] = 3;
|
||||
logicPortUIName[0] = "ColorIn0";
|
||||
|
||||
logicPortType[1] = 1;
|
||||
logicPortPos[1] = "13 -3 0";
|
||||
logicPortDir[1] = 3;
|
||||
logicPortUIName[1] = "ColorIn1";
|
||||
|
||||
logicPortType[2] = 1;
|
||||
logicPortPos[2] = "11 -3 0";
|
||||
logicPortDir[2] = 3;
|
||||
logicPortUIName[2] = "ColorIn2";
|
||||
|
||||
logicPortType[3] = 1;
|
||||
logicPortPos[3] = "9 -3 0";
|
||||
logicPortDir[3] = 3;
|
||||
logicPortUIName[3] = "ColorIn3";
|
||||
|
||||
logicPortType[4] = 1;
|
||||
logicPortPos[4] = "7 -3 0";
|
||||
logicPortDir[4] = 3;
|
||||
logicPortUIName[4] = "ColorIn4";
|
||||
|
||||
logicPortType[5] = 1;
|
||||
logicPortPos[5] = "5 -3 0";
|
||||
logicPortDir[5] = 3;
|
||||
logicPortUIName[5] = "ColorIn5";
|
||||
|
||||
logicPortType[6] = 1;
|
||||
logicPortPos[6] = "1 -3 0";
|
||||
logicPortDir[6] = 3;
|
||||
logicPortUIName[6] = "Destroy Brick";
|
||||
logicPortCauseUpdate[6] = true;
|
||||
|
||||
logicPortType[7] = 1;
|
||||
logicPortPos[7] = "-1 -3 0";
|
||||
logicPortDir[7] = 3;
|
||||
logicPortUIName[7] = "Plant Brick";
|
||||
logicPortCauseUpdate[7] = true;
|
||||
|
||||
logicPortType[8] = 1;
|
||||
logicPortPos[8] = "-5 -3 0";
|
||||
logicPortDir[8] = 3;
|
||||
logicPortUIName[8] = "Move Down";
|
||||
logicPortCauseUpdate[8] = true;
|
||||
|
||||
logicPortType[9] = 1;
|
||||
logicPortPos[9] = "-7 -3 0";
|
||||
logicPortDir[9] = 3;
|
||||
logicPortUIName[9] = "Move Up";
|
||||
logicPortCauseUpdate[9] = true;
|
||||
|
||||
logicPortType[10] = 1;
|
||||
logicPortPos[10] = "-9 -3 0";
|
||||
logicPortDir[10] = 3;
|
||||
logicPortUIName[10] = "Move Right";
|
||||
logicPortCauseUpdate[10] = true;
|
||||
|
||||
logicPortType[11] = 1;
|
||||
logicPortPos[11] = "-11 -3 0";
|
||||
logicPortDir[11] = 3;
|
||||
logicPortUIName[11] = "Move Left";
|
||||
logicPortCauseUpdate[11] = true;
|
||||
|
||||
logicPortType[12] = 1;
|
||||
logicPortPos[12] = "-13 -3 0";
|
||||
logicPortDir[12] = 3;
|
||||
logicPortUIName[12] = "Move Backward";
|
||||
logicPortCauseUpdate[12] = true;
|
||||
|
||||
logicPortType[13] = 1;
|
||||
logicPortPos[13] = "-15 -3 0";
|
||||
logicPortDir[13] = 3;
|
||||
logicPortUIName[13] = "Move Forward";
|
||||
logicPortCauseUpdate[13] = true;
|
||||
|
||||
logicPortType[14] = 0;
|
||||
logicPortPos[14] = "15 3 0";
|
||||
logicPortDir[14] = 1;
|
||||
logicPortUIName[14] = "ColorOut0";
|
||||
|
||||
logicPortType[15] = 0;
|
||||
logicPortPos[15] = "13 3 0";
|
||||
logicPortDir[15] = 1;
|
||||
logicPortUIName[15] = "ColorOut1";
|
||||
|
||||
logicPortType[16] = 0;
|
||||
logicPortPos[16] = "11 3 0";
|
||||
logicPortDir[16] = 1;
|
||||
logicPortUIName[16] = "ColorOut2";
|
||||
|
||||
logicPortType[17] = 0;
|
||||
logicPortPos[17] = "9 3 0";
|
||||
logicPortDir[17] = 1;
|
||||
logicPortUIName[17] = "ColorOut3";
|
||||
|
||||
logicPortType[18] = 0;
|
||||
logicPortPos[18] = "7 3 0";
|
||||
logicPortDir[18] = 1;
|
||||
logicPortUIName[18] = "ColorOut4";
|
||||
|
||||
logicPortType[19] = 0;
|
||||
logicPortPos[19] = "5 3 0";
|
||||
logicPortDir[19] = 1;
|
||||
logicPortUIName[19] = "ColorOut5";
|
||||
|
||||
logicPortType[20] = 0;
|
||||
logicPortPos[20] = "1 3 0";
|
||||
logicPortDir[20] = 1;
|
||||
logicPortUIName[20] = "Brick Detected";
|
||||
|
||||
logicPortType[21] = 1;
|
||||
logicPortPos[21] = "-1 3 0";
|
||||
logicPortDir[21] = 1;
|
||||
logicPortUIName[21] = "Detect Brick";
|
||||
logicPortCauseUpdate[21] = true;
|
||||
};
|
||||
|
||||
function LogicGate_RobotController_Data::LuaLogic_Callback(%this, %brick, %data) {
|
||||
%robot = %brick.luaLogicRobot;
|
||||
if(!isObject(%robot)) { talk("brick " @ %brick @ " has no robot!"); return; }
|
||||
%pos = %robot.getPosition();
|
||||
|
||||
initContainerBoxSearch(%pos, "0.49 0.49 0.19", $TypeMasks::FxBrickAlwaysObjectType);
|
||||
%tbrick = containerSearchNext();
|
||||
|
||||
%output = "";
|
||||
|
||||
for(%i=0; %i<getFieldCount(%data); %i++) {
|
||||
%field = getField(%data, %i);
|
||||
%first = getWord(%field, 0);
|
||||
|
||||
if(%first $= "D") { // remove / detect brick
|
||||
if(isObject(%tbrick)) {
|
||||
%field = "B" @ 1 SPC
|
||||
%tbrick.getColorId() SPC
|
||||
%tbrick.getColorFxID() SPC
|
||||
%tbrick.getShapeFxId() SPC
|
||||
%tbrick.isRaycasting() SPC
|
||||
%tbrick.isColliding() SPC
|
||||
%tbrick.isRendering();
|
||||
%output = %output @ %field @ "\t";
|
||||
} else {
|
||||
%output = %output @ "B 0 0 0 0 0 0 0\t";
|
||||
}
|
||||
} else if(%first $= "R") {
|
||||
if(isObject(%tbrick)) {
|
||||
%tbrick.schedule(0, delete);
|
||||
}
|
||||
} else if(%first $= "P") { // plant brick
|
||||
%brickGroup = LogicRobot_CreateBrickGroup();
|
||||
|
||||
if(!isObject(%tbrick)) {
|
||||
%robot.setTransform(vectorAdd(%pos, "0 0 0.2") SPC %robot.lr_rotation);
|
||||
%nbrick = new fxDTSBrick() {
|
||||
datablock = brick1x1fData;
|
||||
position = %pos;
|
||||
colorId = getWord(%field, 1);
|
||||
colorFxId = getWord(%field, 2);
|
||||
shapeFxId = getWord(%field, 3);
|
||||
isPlanted = 1;
|
||||
};
|
||||
%brickGroup.add(%nbrick);
|
||||
%nbrick.setTransform(%pos SPC "0 0 1 0");
|
||||
%nbrick.trustCheckFinished();
|
||||
|
||||
%err = %nbrick.plant();
|
||||
if(%err == 1 || %err == 5 || %err == 3) {
|
||||
%nbrick.delete();
|
||||
} else {
|
||||
%nbrick.setRaycasting(getWord(%field, 4));
|
||||
%nbrick.setColliding (getWord(%field, 5));
|
||||
%nbrick.setRendering (getWord(%field, 6));
|
||||
|
||||
%nbrick.setTrusted(1);
|
||||
}
|
||||
%robot.setTransform(%pos SPC %robot.lr_rotation);
|
||||
} else {
|
||||
%tbrick.setColor(getWord(%field, 1));
|
||||
%tbrick.setColorFx(getWord(%field, 2));
|
||||
%tbrick.setShapeFx(getWord(%field, 3));
|
||||
%tbrick.setRaycasting(getWord(%field, 4));
|
||||
%tbrick.setColliding (getWord(%field, 5));
|
||||
%tbrick.setRendering (getWord(%field, 6));
|
||||
}
|
||||
} else if(%first $= "M") { // move
|
||||
%pos = getWords(%field, 1, 3);
|
||||
%rot = getWord(%field, 4);
|
||||
%robot.lr_rotation = "0 0 1" SPC (%rot*$pi/2);
|
||||
%robot.setTransform(%pos SPC %robot.lr_rotation);
|
||||
} else {
|
||||
talk("invalid robot callback " @ %field);
|
||||
}
|
||||
}
|
||||
|
||||
lualogic_sendinput(%brick, 1, trim(%output));
|
||||
}
|
||||
|
||||
function LogicGate_RobotController_Data::getRelativeVector(%this, %obj, %vec) {
|
||||
%rot = %obj.angleID;
|
||||
%x = getWord(%vec, 0); %y = getWord(%vec, 1); %z = getWord(%vec, 2);
|
||||
%ax = %x;
|
||||
switch(%rot) {
|
||||
case 1: %x = %y; %y = -%ax;
|
||||
case 2: %x = -%x; %y = -%y ;
|
||||
case 3: %x = -%y; %y = %ax;
|
||||
}
|
||||
return %x SPC %y SPC %z;
|
||||
}
|
||||
|
||||
function LogicRobot_CreateBrickGroup() {
|
||||
//if(!isObject(BrickGroup_12345678)) {
|
||||
// new SimGroup(BrickGroup_12345678) {
|
||||
// bl_id = 12345678;
|
||||
// name = "\c1Robot";
|
||||
// QuotaObject = GlobalQuota;
|
||||
// };
|
||||
// mainBrickGroup.add(BrickGroup_12345678);
|
||||
//}
|
||||
return BrickGroup_888888;
|
||||
}
|
||||
|
||||
function LogicGate_RobotController_Data::createRobot(%this, %obj) {
|
||||
if(isObject(%obj.luaLogicRobot)) return;
|
||||
|
||||
%pos = %obj.getPosition();
|
||||
%rpos = vectorAdd(%pos, %this.getRelativeVector(%obj, "0.25 7.75 0"));
|
||||
%robot = new StaticShape() {
|
||||
datablock = LuaLogic_RobotShapeData;
|
||||
position = %rpos;
|
||||
};
|
||||
%robot.setScale("1 1 1");
|
||||
%robot.setNodeColor("ALL", "1 1 1 1");
|
||||
missionCleanup.add(%robot);
|
||||
|
||||
%obj.luaLogicRobot = %robot;
|
||||
}
|
||||
|
||||
function LogicGate_RobotController_Data::Logic_onRemove(%this, %obj) {
|
||||
if(isObject(%obj.luaLogicRobot))
|
||||
%obj.luaLogicRobot.delete();
|
||||
}
|
||||
|
||||
function LogicGate_RobotController_Data::Logic_onPlant(%this, %obj) {
|
||||
if(!isObject(%obj.luaLogicRobot))
|
||||
%this.createRobot(%obj);
|
||||
}
|
||||
|
||||
function LogicGate_RobotController_Data::Logic_onAdd(%this, %obj) {
|
||||
if(!isObject(%obj.luaLogicRobot)) %this.createRobot(%obj);
|
||||
|
||||
lualogic_sendinput(%obj, 1, "P" @ %obj.luaLogicRobot.getPosition() SPC %obj.getAngleId());
|
||||
}
|
Reference in New Issue
Block a user