use get/set for parameters on ports and wires
This commit is contained in:
parent
941348002b
commit
54f45520c0
@ -14,7 +14,7 @@ end
|
||||
|
||||
function Gate.addport(self, port)
|
||||
self.ports[#self.ports+1] = port
|
||||
port.gate = self
|
||||
Port.setgate(port, self)
|
||||
end
|
||||
|
||||
function Gate.getportstate(self, index)
|
||||
|
@ -62,10 +62,10 @@ function GateDefinition.constructgate(self, objref, position, rotation)
|
||||
local gate = Gate.new(Gate, objref, self)
|
||||
|
||||
for i = 1, #self.ports do
|
||||
local port = self.ports[i]
|
||||
local type = port.type
|
||||
local pos = {port.position[1], port.position[2], port.position[3]}
|
||||
local dir = port.direction
|
||||
local portd = self.ports[i]
|
||||
local type = portd.type
|
||||
local pos = {portd.position[1], portd.position[2], portd.position[3]}
|
||||
local dir = portd.direction
|
||||
|
||||
if dir < 4 then
|
||||
dir = (dir + rotation) % 4
|
||||
@ -84,7 +84,7 @@ function GateDefinition.constructgate(self, objref, position, rotation)
|
||||
pos[2] = x
|
||||
end
|
||||
|
||||
Gate.addport(gate, Port.new(Port, type, dir, {position[1]+pos[1], position[2]+pos[2], position[3]+pos[3]}, port.causeupdate))
|
||||
Gate.addport(gate, Port.new(Port, type, dir, {position[1]+pos[1], position[2]+pos[2], position[3]+pos[3]}, portd.causeupdate))
|
||||
end
|
||||
|
||||
return gate
|
||||
|
@ -24,46 +24,46 @@ function Group.getsize(self)
|
||||
end
|
||||
|
||||
function Group.addwire(self, wire)
|
||||
if wire.group ~= self then
|
||||
if wire.group ~= nil then
|
||||
self:mergewith(wire.group)
|
||||
if Wire.getgroup(wire) ~= self then
|
||||
if Wire.getgroup(wire) ~= nil then
|
||||
Group.mergewith(self, Wire.getgroup(wire))
|
||||
else
|
||||
self.wires[wire] = wire
|
||||
self.nwires = self.nwires + 1
|
||||
|
||||
wire.group = self
|
||||
wire:update()
|
||||
sim:queuegroup(self)
|
||||
Wire.setgroup(wire, self)
|
||||
Wire.update(wire)
|
||||
Simulation.queuegroup(sim, self)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function Group.removewire(self, wire)
|
||||
wire.group = nil
|
||||
Wire.setgroup(wire, nil)
|
||||
self.wires[wire] = nil
|
||||
|
||||
for k, wire in pairs(self.wires) do
|
||||
wire.group = nil
|
||||
Wire.setgroup(wire, nil)
|
||||
end
|
||||
|
||||
for k, port in pairs(self.out_ports) do
|
||||
port.group = nil
|
||||
Port.setgroup(port, nil)
|
||||
end
|
||||
|
||||
for k, port in pairs(self.in_ports) do
|
||||
port.group = nil
|
||||
Port.setgroup(port, nil)
|
||||
end
|
||||
|
||||
for k, wire in pairs(self.wires) do
|
||||
sim:connectwire(wire)
|
||||
Simulation.connectwire(sim, wire)
|
||||
end
|
||||
|
||||
for k, port in pairs(self.out_ports) do
|
||||
sim:connectport(port)
|
||||
Simulation.connectport(sim, port)
|
||||
end
|
||||
|
||||
for k, port in pairs(self.in_ports) do
|
||||
sim:connectport(port)
|
||||
Simulation.connectport(sim, port)
|
||||
end
|
||||
|
||||
self.wires = {}
|
||||
@ -113,7 +113,7 @@ end
|
||||
|
||||
function Group.mergeinto(self, group)
|
||||
for k, wire in pairs(self.wires) do
|
||||
wire.group = nil
|
||||
Wire.setgroup(wire, nil)
|
||||
Group.addwire(group, wire)
|
||||
end
|
||||
|
||||
|
@ -180,16 +180,16 @@ while 1 do
|
||||
local ports = {}
|
||||
|
||||
for a = i+9, numports*5+i+8, 5 do
|
||||
local port = {
|
||||
local portd = {
|
||||
type = tonumber(data[a]),
|
||||
position = vectotable(data[a+1]),
|
||||
direction = tonumber(data[a+2]),
|
||||
causeupdate = toboolean(data[a+3]),
|
||||
name = data[a+4],
|
||||
}
|
||||
ports[#ports+1] = port
|
||||
ports[#ports+1] = portd
|
||||
|
||||
if not port.direction then print(line) end
|
||||
if not portd.direction then print(line) end
|
||||
end
|
||||
|
||||
local definition = GateDefinition.new(GateDefitinion, objref, name, desc, init, logic, input, global, ports)
|
||||
@ -213,7 +213,7 @@ while 1 do
|
||||
elseif data[i] == "SG" then
|
||||
local wire = Simulation.getwirebyref(sim, tonumber(data[i+1]))
|
||||
if wire ~= nil then
|
||||
Group.setstate(wire.group, toboolean(data[i+2]))
|
||||
Group.setstate(Wire.getgroup(wire), toboolean(data[i+2]))
|
||||
end
|
||||
|
||||
i = i + 2
|
||||
|
20
sim/port.lua
20
sim/port.lua
@ -66,3 +66,23 @@ function Port.isfalling(self)
|
||||
end
|
||||
return self.group.state == false and (self.group.updatetick == sim.currenttick)
|
||||
end
|
||||
|
||||
function Port.setgate(self, gate)
|
||||
self.gate = gate
|
||||
end
|
||||
|
||||
function Port.setgroup(self, group)
|
||||
self.group = group
|
||||
end
|
||||
|
||||
function Port.getgroup(self)
|
||||
return self.group
|
||||
end
|
||||
|
||||
function Port.gettype(self)
|
||||
return self.type
|
||||
end
|
||||
|
||||
function Port.getstate(self)
|
||||
return self.state
|
||||
end
|
||||
|
@ -69,26 +69,28 @@ function Simulation.addgatedefinition(self, definition)
|
||||
end
|
||||
|
||||
function Simulation.addwire(self, wire)
|
||||
self.wires[wire.objref] = wire
|
||||
self.wires[Wire.getobjref(wire)] = wire
|
||||
|
||||
for x = wire.bounds[1]+1, wire.bounds[4]-1, 2 do
|
||||
for z = wire.bounds[3]+1, wire.bounds[6]-1, 2 do
|
||||
Simulation.addtoworld(self, wire, x, wire.bounds[2], z)
|
||||
Simulation.addtoworld(self, wire, x, wire.bounds[5], z)
|
||||
local bounds = Wire.getbounds(wire)
|
||||
|
||||
for x = bounds[1]+1, bounds[4]-1, 2 do
|
||||
for z = bounds[3]+1, bounds[6]-1, 2 do
|
||||
Simulation.addtoworld(self, wire, x, bounds[2], z)
|
||||
Simulation.addtoworld(self, wire, x, bounds[5], z)
|
||||
end
|
||||
end
|
||||
|
||||
for y = wire.bounds[2]+1, wire.bounds[5]-1, 2 do
|
||||
for z = wire.bounds[3]+1, wire.bounds[6]-1, 2 do
|
||||
Simulation.addtoworld(self, wire, wire.bounds[1], y, z)
|
||||
Simulation.addtoworld(self, wire, wire.bounds[4], y, z)
|
||||
for y = bounds[2]+1, bounds[5]-1, 2 do
|
||||
for z = bounds[3]+1, bounds[6]-1, 2 do
|
||||
Simulation.addtoworld(self, wire, bounds[1], y, z)
|
||||
Simulation.addtoworld(self, wire, bounds[4], y, z)
|
||||
end
|
||||
end
|
||||
|
||||
for x = wire.bounds[1]+1, wire.bounds[4]-1, 2 do
|
||||
for y = wire.bounds[2]+1, wire.bounds[5]-1, 2 do
|
||||
Simulation.addtoworld(self, wire, x, y, wire.bounds[3])
|
||||
Simulation.addtoworld(self, wire, x, y, wire.bounds[6])
|
||||
for x = bounds[1]+1, bounds[4]-1, 2 do
|
||||
for y = bounds[2]+1, bounds[5]-1, 2 do
|
||||
Simulation.addtoworld(self, wire, x, y, bounds[3])
|
||||
Simulation.addtoworld(self, wire, x, y, bounds[6])
|
||||
end
|
||||
end
|
||||
|
||||
@ -104,9 +106,9 @@ function Simulation.addgate(self, gate)
|
||||
Simulation.addtoworld(self, port, offset[1], offset[2], offset[3])
|
||||
Simulation.connectport(self, port)
|
||||
|
||||
if port.type == PortTypes.input then
|
||||
if Port.gettype(port) == PortTypes.input then
|
||||
self.ninports = self.ninports + 1
|
||||
elseif port.type == PortTypes.output then
|
||||
elseif Port.gettype(port) == PortTypes.output then
|
||||
self.noutports = self.noutports + 1
|
||||
end
|
||||
end
|
||||
@ -119,29 +121,31 @@ function Simulation.removewire(self, objref)
|
||||
if wire ~= nil then
|
||||
self.wires[objref] = nil
|
||||
|
||||
for x = wire.bounds[1]+1, wire.bounds[4]-1, 2 do
|
||||
for z = wire.bounds[3]+1, wire.bounds[6]-1, 2 do
|
||||
sim[x][wire.bounds[2]][z][wire] = nil
|
||||
sim[x][wire.bounds[5]][z][wire] = nil
|
||||
local bounds = Wire.getbounds(wire)
|
||||
|
||||
for x = bounds[1]+1, bounds[4]-1, 2 do
|
||||
for z = bounds[3]+1, bounds[6]-1, 2 do
|
||||
sim[x][bounds[2]][z][wire] = nil
|
||||
sim[x][bounds[5]][z][wire] = nil
|
||||
end
|
||||
end
|
||||
|
||||
for y = wire.bounds[2]+1, wire.bounds[5]-1, 2 do
|
||||
for z = wire.bounds[3]+1, wire.bounds[6]-1, 2 do
|
||||
sim[wire.bounds[1]][y][z][wire] = nil
|
||||
sim[wire.bounds[4]][y][z][wire] = nil
|
||||
for y = bounds[2]+1, bounds[5]-1, 2 do
|
||||
for z = bounds[3]+1, bounds[6]-1, 2 do
|
||||
sim[bounds[1]][y][z][wire] = nil
|
||||
sim[bounds[4]][y][z][wire] = nil
|
||||
end
|
||||
end
|
||||
|
||||
for x = wire.bounds[1]+1, wire.bounds[4]-1, 2 do
|
||||
for y = wire.bounds[2]+1, wire.bounds[5]-1, 2 do
|
||||
sim[x][y][wire.bounds[3]][wire] = nil
|
||||
sim[x][y][wire.bounds[6]][wire] = nil
|
||||
for x = bounds[1]+1, bounds[4]-1, 2 do
|
||||
for y = bounds[2]+1, bounds[5]-1, 2 do
|
||||
sim[x][y][bounds[3]][wire] = nil
|
||||
sim[x][y][bounds[6]][wire] = nil
|
||||
end
|
||||
end
|
||||
|
||||
self.nwires = self.nwires - 1
|
||||
Group.removewire(wire.group, wire)
|
||||
Group.removewire(Wire.getgroup(wire), wire)
|
||||
end
|
||||
end
|
||||
|
||||
@ -151,11 +155,11 @@ function Simulation.removegate(self, objref)
|
||||
for k, port in pairs(gate.ports) do
|
||||
local pos = Port.getconnectionposition(port)
|
||||
self[pos[1]][pos[2]][pos[3]][port] = nil
|
||||
Group.removeport(port.group, port)
|
||||
Group.removeport(Port.getgroup(port), port)
|
||||
|
||||
if port.type == PortTypes.input then
|
||||
if Port.gettype(port) == PortTypes.input then
|
||||
self.ninports = self.ninports - 1
|
||||
elseif port.type == PortTypes.output then
|
||||
elseif Port.gettype(port) == PortTypes.output then
|
||||
self.noutports = self.noutports - 1
|
||||
end
|
||||
end
|
||||
@ -169,10 +173,8 @@ function Simulation.connectwireat(self, wire, x, y, z)
|
||||
local objs = Simulation.getfromworld(self, x, y, z)
|
||||
for k, obj in pairs(objs) do
|
||||
if obj ~= wire and obj.group ~= nil then
|
||||
if obj.logictype == 0 and obj.layer == wire.layer then
|
||||
if obj.layer == wire.layer then
|
||||
if obj.logictype == 0 and Wire.getlayer(obj) == Wire.getlayer(wire) then
|
||||
Group.addwire(obj.group, wire)
|
||||
end
|
||||
elseif obj.logictype == 1 then
|
||||
Group.addwire(obj.group, wire)
|
||||
end
|
||||
@ -181,28 +183,30 @@ function Simulation.connectwireat(self, wire, x, y, z)
|
||||
end
|
||||
|
||||
function Simulation.connectwire(self, wire)
|
||||
for x = wire.bounds[1]+1, wire.bounds[4]-1, 2 do
|
||||
for z = wire.bounds[3]+1, wire.bounds[6]-1, 2 do
|
||||
self:connectwireat(wire, x, wire.bounds[2], z)
|
||||
self:connectwireat(wire, x, wire.bounds[5], z)
|
||||
local bounds = Wire.getbounds(wire)
|
||||
|
||||
for x = bounds[1]+1, bounds[4]-1, 2 do
|
||||
for z = bounds[3]+1, bounds[6]-1, 2 do
|
||||
self:connectwireat(wire, x, bounds[2], z)
|
||||
self:connectwireat(wire, x, bounds[5], z)
|
||||
end
|
||||
end
|
||||
|
||||
for y = wire.bounds[2]+1, wire.bounds[5]-1, 2 do
|
||||
for z = wire.bounds[3]+1, wire.bounds[6]-1, 2 do
|
||||
self:connectwireat(wire, wire.bounds[1], y, z)
|
||||
self:connectwireat(wire, wire.bounds[4], y, z)
|
||||
for y = bounds[2]+1, bounds[5]-1, 2 do
|
||||
for z = bounds[3]+1, bounds[6]-1, 2 do
|
||||
self:connectwireat(wire, bounds[1], y, z)
|
||||
self:connectwireat(wire, bounds[4], y, z)
|
||||
end
|
||||
end
|
||||
|
||||
for x = wire.bounds[1]+1, wire.bounds[4]-1, 2 do
|
||||
for y = wire.bounds[2]+1, wire.bounds[5]-1, 2 do
|
||||
self:connectwireat(wire, x, y, wire.bounds[3])
|
||||
self:connectwireat(wire, x, y, wire.bounds[6])
|
||||
for x = bounds[1]+1, bounds[4]-1, 2 do
|
||||
for y = bounds[2]+1, bounds[5]-1, 2 do
|
||||
self:connectwireat(wire, x, y, bounds[3])
|
||||
self:connectwireat(wire, x, y, bounds[6])
|
||||
end
|
||||
end
|
||||
|
||||
if wire.group == nil then
|
||||
if Wire.getgroup(wire)==nil then
|
||||
Group.addwire(Group.new(Group), wire)
|
||||
end
|
||||
end
|
||||
@ -216,7 +220,7 @@ function Simulation.connectport(self, port)
|
||||
end
|
||||
end
|
||||
|
||||
if port.group == nil then
|
||||
if Port.getgroup(port) == nil then
|
||||
Group.addport(Group.new(Group), port)
|
||||
end
|
||||
end
|
||||
@ -258,7 +262,7 @@ function Simulation.tick(self)
|
||||
for k, group in pairs(self.groupqueue) do
|
||||
local newstate = false
|
||||
for j, port in pairs(group.out_ports) do
|
||||
newstate = newstate or port.state
|
||||
newstate = newstate or Port.getstate(port)
|
||||
if newstate then
|
||||
break
|
||||
end
|
||||
@ -303,7 +307,7 @@ function Simulation.sendfxupdate(self)
|
||||
local data = bool_to_int[group.state]
|
||||
|
||||
for i, wire in pairs(group.wires) do
|
||||
data = data .. "\t" .. wire.objref
|
||||
data = data .. "\t" .. Wire.getobjref(wire)
|
||||
end
|
||||
|
||||
client:send("WU\t" .. data .. "\n")
|
||||
|
20
sim/wire.lua
20
sim/wire.lua
@ -26,3 +26,23 @@ end
|
||||
function Wire.update(self)
|
||||
client:send("WU\t" .. bool_to_int[self.group.state] .. "\t" .. self.objref .. "\n")
|
||||
end
|
||||
|
||||
function Wire.setgroup(self, group)
|
||||
self.group = group
|
||||
end
|
||||
|
||||
function Wire.getgroup(self)
|
||||
return self.group
|
||||
end
|
||||
|
||||
function Wire.getobjref(self)
|
||||
return self.objref
|
||||
end
|
||||
|
||||
function Wire.getlayer()
|
||||
return self.layer
|
||||
end
|
||||
|
||||
function Wire.getbounds(wire)
|
||||
return self.bounds
|
||||
end
|
||||
|
Loading…
x
Reference in New Issue
Block a user