151 lines
3.6 KiB
C#
151 lines
3.6 KiB
C#
|
|
function rom_reload() {
|
|
exec($Con::File);
|
|
exec($LuaLogic::Path @ "bricks/gen/newcode/ROM 16x16.cs");
|
|
}
|
|
|
|
package lualogic_rom_update {
|
|
function fxDtsBrick::onPlant(%brick) {
|
|
parent::onPlant(%brick);
|
|
lualogic_rom_createbrick(%brick);
|
|
}
|
|
function fxDtsBrick::onLoadPlant(%brick) {
|
|
parent::onLoadPlant(%brick);
|
|
lualogic_rom_createbrick(%brick);
|
|
}
|
|
function fxDTSBrick::onDeath(%brick) {
|
|
parent::onDeath(%brick);
|
|
if(%brick.lualogic_rom_affects) {
|
|
lualogic_rom_deletebrick(%brick);
|
|
}
|
|
}
|
|
function fxDTSBrick::onRemove(%brick) {
|
|
parent::onRemove(%brick);
|
|
if(%brick.lualogic_rom_affects) {
|
|
lualogic_rom_deletebrick(%brick);
|
|
}
|
|
}
|
|
function fxDtsBrick::setRaycasting(%brick, %val) {
|
|
parent::setRaycasting(%brick, %val);
|
|
if(%brick.lualogic_rom_affects) {
|
|
lualogic_rom_updatercbrick(%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;
|
|
|
|
//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;
|
|
}
|
|
|
|
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) {
|
|
if(!%brick.lualogic_rom_updatedata_scheduled) {
|
|
schedule(1, 0, lualogic_rom_updatedata_final, %brick);
|
|
%brick.lualogic_rom_updatedata_scheduled = 1;
|
|
}
|
|
}
|
|
|
|
function lualogic_rom_updatedata_final(%brick) {
|
|
if(!isObject(%brick) || %brick.lualogic_rom_delete) return;
|
|
|
|
%brick.lualogic_rom_updatedata_scheduled = 0;
|
|
|
|
%data = %brick.getDatablock();
|
|
|
|
%rx = %data.logicRomX;
|
|
%ry = %data.logicRomY;
|
|
|
|
%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";
|
|
}
|
|
}
|
|
%data_str = %data_str @ %line_str;
|
|
}
|
|
|
|
lualogic_sendinput(%brick, 1, %data_str);
|
|
}
|