This commit is contained in:
Redo
2022-10-05 15:43:07 -06:00
parent 519a887dca
commit fe8057f4ec
494 changed files with 293926 additions and 2323 deletions

View File

@ -1,105 +1,68 @@
function rom_reload() {
exec($Con::File);
exec($LuaLogic::Path @ "bricks/gen/newcode/ROM 16x16.cs");
}
$lualogic_rom_maxheight = (2/5)*256;
package lualogic_rom_update {
function fxDtsBrick::onPlant(%brick) {
parent::onPlant(%brick);
lualogic_rom_createbrick(%brick);
lualogic_rom_updatebrick(%brick);
}
function fxDtsBrick::onLoadPlant(%brick) {
parent::onLoadPlant(%brick);
lualogic_rom_createbrick(%brick);
lualogic_rom_updatebrick(%brick);
}
function fxDTSBrick::onDeath(%brick) {
parent::onDeath(%brick);
if(%brick.lualogic_rom_affects) {
lualogic_rom_deletebrick(%brick);
}
%brick.lualogic_rom_delete = 1;
lualogic_rom_updatebrick(%brick);
}
function fxDTSBrick::onRemove(%brick) {
parent::onRemove(%brick);
if(%brick.lualogic_rom_affects) {
lualogic_rom_deletebrick(%brick);
}
%brick.lualogic_rom_delete = 1;
lualogic_rom_updatebrick(%brick);
}
function fxDtsBrick::setRaycasting(%brick, %val) {
parent::setRaycasting(%brick, %val);
if(%brick.lualogic_rom_affects) {
lualogic_rom_updatercbrick(%brick);
}
lualogic_rom_updatebrick(%brick);
}
};
schedule(0, 0, activatePackage, lualogic_rom_update);
// lualogic_rom_affects: whether this brick is on top of a rom brick
// lualogic_rom_is: whether this brick is a rom brick
function lualogic_rom_createbrick(%brick) {
%brick.lualogic_rom_delete = 0;
function lualogic_rom_updatebrick(%brick) {
cancel(%brick.lualogic_rom_updatebrick_schedule);
%brick.lualogic_rom_updatebrick_schedule = schedule(100, 0, lualogic_rom_updatebrick_final, %brick);
}
function lualogic_rom_updatebrick_final(%brick) {
if(!isObject(%brick)) return;
if(%brick.lualogic_rom_delete) { if(%brick.lualogic_rom_deletedone) return; %brick.lualogic_rom_deletedone = 1; }
//if rom: set is, set affects on any up bricks, compute data
if(%brick.getdatablock().isLogicRom) {
%brick.lualogic_rom_is = 1;
%nub = 0;
for(%i=0; %i<%nub; %i++) {
%upbrick = %brick.getUpBrick(%i);
%upbrick.lualogic_rom_affects = 1;
// update any roms below
%box = %brick.getWorldBox();
%boxl = getWords(%box, 0, 2); %boxlz = getWord(%boxl, 2);
%boxh = getWords(%box, 3, 5);
%boxs = vectorSub(%boxh, %boxl);
%boxc = vectorAdd(%boxl, vectorScale(%boxs, 0.5));
%boxc = getWords(%boxc, 0, 1) SPC (%boxlz - $lualogic_rom_maxheight/2);
%boxs = getWords(%boxs, 0, 1) SPC $lualogic_rom_maxheight;
%boxs = vectorSub(%boxs, 0.5 SPC 0.5 SPC 0.1);
initContainerBoxSearch(%boxc, %boxs, $TypeMasks::FxBrickAlwaysObjectType);
while(%tbrick = containerSearchNext()) {
%tdata = %tbrick.getDatablock();
if(%tdata.isLogicRom) {
%rommaxz = getWord(%tbrick.getPosition(), 2) + (%tdata.brickSizeZ/10) + ((%tdata.logicRomZ$="" ? 1 : %tdata.logicRomZ)/5) - 0.1;
if(%boxlz <= %rommaxz) {
lualogic_rom_updatedata(%tbrick);
}
}
}
// if rom, update
if(%brick.lualogic_rom_delete) return;
if(%brick.getDatablock().isLogicRom) {
lualogic_rom_updatedata(%brick);
}
// update any rom down bricks; if there are any, set affects
%ndb = %brick.getNumDownBricks();
for(%i=0; %i<%ndb; %i++) {
%downbrick = %brick.getDownBrick(%i);
if(%downbrick.lualogic_rom_is) {
%brick.lualogic_rom_affects = 1;
lualogic_rom_updatedata(%downbrick);
}
}
}
function lualogic_rom_deletebrick(%brick) {
// update any rom down bricks
%brick.lualogic_rom_delete = 1;
%ndb = %brick.getNumDownBricks();
for(%i=0; %i<%ndb; %i++) {
%downbrick = %brick.getDownBrick(%i);
if(%downbrick.lualogic_rom_is) {
lualogic_rom_updatedata(%downbrick);
}
}
}
function lualogic_rom_updatercbrick(%brick) {
// update any rom down bricks
%ndb = %brick.getNumDownBricks();
for(%i=0; %i<%ndb; %i++) {
%downbrick = %brick.getDownBrick(%i);
if(%downbrick.lualogic_rom_is) {
lualogic_rom_updatedata(%downbrick);
}
}
}
function lualogic_rom_rotate(%pos, %rot) {
%x = getWord(%pos, 0);
%y = getWord(%pos, 1);
%z = getWord(%pos, 2);
%rot = %rot % 4;
if (%rot==0) {
return %x SPC %y SPC %z;
} else if(%rot==1) {
return %y SPC -%x SPC %z;
} else if(%rot==2) {
return -%x SPC -%y SPC %z;
} else if(%rot==3) {
return -%y SPC %x SPC %z;
}
}
function lualogic_rom_updatedata(%brick) {
@ -107,42 +70,81 @@ function lualogic_rom_updatedata(%brick) {
%brick.lualogic_rom_updatedata_schedule = schedule(1000, 0, lualogic_rom_updatedata_final, %brick);
}
function lualogic_rom_min(%a, %b) { return %a<%b ? %a : %b; }
function lualogic_rom_max(%a, %b) { return %a>%b ? %a : %b; }
function lualogic_rom_updatedata_final(%brick) {
if(!isObject(%brick) || %brick.lualogic_rom_delete) return;
%brick.lualogic_rom_updatedata_scheduled = 0;
// compute rom stud box
%data = %brick.getDatablock();
%rx = (%brick.angleId%2==0) ? %data.logicRomX : %data.logicRomY;
%ry = (%brick.angleId%2==0) ? %data.logicRomY : %data.logicRomX;
%rz = (%data.logicRomZ$="") ? 1 : %data.logicRomZ;
%rpos = vectorAdd(%brick.getPosition(), 0 SPC 0 SPC (%rz/10 + 1/10));
%rxc = getWord(%rpos, 0)* 4;
%ryc = getWord(%rpos, 1)* 4;
%rzc = getWord(%rpos, 2)*10;
%rxl = %rxc - (%rx-1);
%ryl = %ryc - (%ry-1);
%rzl = %rzc - (%rz-1);
%rxh = %rxc + (%rx-1);
%ryh = %ryc + (%ry-1);
%rzh = %rzc + (%rz-1);
%rx = %data.logicRomY;
%ry = %data.logicRomX;
// generate box by brick's rom volume
%boxs = vectorScale((%rx/4 - 1/4) SPC (%ry/4 - 1/4) SPC (%rz/10 - 1/10), 2);
%brickpos = %brick.getPosition();
%rot = (%brick.angleId + 1)%4;
%data_str = "";
for(%x=0; %x<%rx; %x++) {
%line_str = "";
for(%y=0; %y<%ry; %y++) {
%pos = (%x*0.5 - %rx/4 + 0.25) SPC (%y*0.5 - %ry/4 + 0.25) SPC 0;
%pos = lualogic_rom_rotate(%pos, %rot);
%pos = vectorAdd(%brickpos, %pos);
%ray = containerRaycast(
%pos,
vectorAdd(%pos, "0 0 0.2"),
$TypeMasks::FxBrickObjectType,
%brick
);
%hit = getWord(%ray, 0);
if(isObject(%hit) && !%hit.lualogic_rom_delete && %hit.isRaycasting()) {
%line_str = %line_str @ "1";
} else {
%line_str = %line_str @ "0";
}
// for each brick in the scan box, add all of its volume to data array
initContainerBoxSearch(%rpos, %boxs, $TypeMasks::FxBrickObjectType);
while(isObject(%tbrick = containerSearchNext())) {
if(%tbrick.isRaycasting()) {
// compute target stud box
%tdata = %tbrick.getDatablock();
%tx = (%tbrick.angleId%2==0) ? %tdata.brickSizeX : %tdata.brickSizeY;
%ty = (%tbrick.angleId%2==0) ? %tdata.brickSizeY : %tdata.brickSizeX;
%tz = %tdata.brickSizeZ;
%tpos = %tbrick.getPosition();
%txl = getWord(%tpos, 0)* 4 - (%tx-1);
%tyl = getWord(%tpos, 1)* 4 - (%ty-1);
%tzl = getWord(%tpos, 2)*10 - (%tz-1);
%txh = getWord(%tpos, 0)* 4 + (%tx-1);
%tyh = getWord(%tpos, 1)* 4 + (%ty-1);
%tzh = getWord(%tpos, 2)*10 + (%tz-1);
// add each stud within volume overlap to array
for(%x=lualogic_rom_max(%rxl, %txl); %x<=lualogic_rom_min(%rxh, %txh); %x+=2) { %xc = %x - %rxc;
for(%y=lualogic_rom_max(%ryl, %tyl); %y<=lualogic_rom_min(%ryh, %tyh); %y+=2) { %yc = %y - %ryc;
switch(%brick.angleId%4) {
case 0: %xcr = %xc; %ycr = %yc;
case 1: %xcr = -%yc; %ycr = %xc;
case 2: %xcr = -%xc; %ycr = -%yc;
case 3: %xcr = %yc; %ycr = -%xc;
}
for(%z=lualogic_rom_max(%rzl, %tzl); %z<=lualogic_rom_min(%rzh, %tzh); %z+=2) { %zc = %z - %rzc;
%data_array[%xcr+0, %ycr+0, %zc+0] = 1;
} } }
}
%data_str = %data_str @ %line_str;
}
// stringify array
%data_str = "";
%rxd = %data.logicRomX - 1;
%ryd = %data.logicRomY - 1;
%rzd = (%data.logicRomZ$="" ? 1 : %data.logicRomZ) - 1;
for(%z=-%rzd; %z<= %rzd; %z+=2) { %plane_str = "";
for(%y= %ryd; %y>=-%ryd; %y-=2) { %line_str = "";
for(%x=-%rxd; %x<= %rxd; %x+=2) {
if(%data_array[%x+0, %y+0, %z+0]) {
%line_str = %line_str @ "1";
} else {
%line_str = %line_str @ "0";
}
} %plane_str = %plane_str @ %line_str;
} %data_str = %data_str @ %plane_str;
}
// send output
//talk("rom" SPC %brick SPC %data_str);
lualogic_sendinput(%brick, 1, %data_str);
}

View File