Console Screen (30x18 dos-like console) Address Bus (To join up to 4 address spaces) Data Port (Aka old ports in CPU, but external) Data Plug (Connects address spaces) 32KB RAM module CPU Protected Mode (Simple) CPU Interrupts (in PM) Strings supported in DB macro. Lots more I forgot. CPU Frequency limit to 5000Hz Fixed: CPU is now V2.00, added lots and lots of opcodes, around 100 (but 8 are disabled due to some reasons) Digital Screen (new inputs) Wired Numpad (Hi-Speed link added, acts as buffer) New examples for CPU CPU supports writing to ROM, i.e. program will be restored each reset. ZCPU & ZASM bugs. Known bugs: Address Bus settings do not save when duping Console screen does not dupe (duplications of it result in things connected to old copy) Removed in-game editor, reworking it into VGUI. You can always use notepad, or my editor, it might be posted on forum Some other misc little bugs.
155 lines
3.7 KiB
Lua
155 lines
3.7 KiB
Lua
|
|
AddCSLuaFile( "cl_init.lua" )
|
|
AddCSLuaFile( "shared.lua" )
|
|
|
|
include('shared.lua')
|
|
|
|
ENT.WireDebugName = "Socket"
|
|
|
|
local MODEL = Model( "models/props_lab/tpplugholder_single.mdl" )
|
|
|
|
//Time after loosing one plug to search for another
|
|
local NEW_PLUG_WAIT_TIME = 2
|
|
local PLUG_IN_SOCKET_CONSTRAINT_POWER = 5000
|
|
local PLUG_IN_ATTACH_RANGE = 3
|
|
|
|
function ENT:Initialize()
|
|
self.Entity:SetModel( MODEL )
|
|
self.Entity:PhysicsInit( SOLID_VPHYSICS )
|
|
self.Entity:SetMoveType( MOVETYPE_VPHYSICS )
|
|
self.Entity:SetSolid( SOLID_VPHYSICS )
|
|
|
|
self.MyPlug = nil
|
|
self.Memory = nil
|
|
self.Const = nil
|
|
|
|
self.Outputs = Wire_CreateOutputs(self.Entity, { "Memory" })
|
|
end
|
|
|
|
function ENT:SetMemory(mement)
|
|
self.Memory = mement
|
|
end
|
|
|
|
function ENT:Setup(a,ar,ag,ab,aa)
|
|
self.A = a or 0
|
|
self.AR = ar or 255
|
|
self.AG = ag or 0
|
|
self.AB = ab or 0
|
|
self.AA = aa or 255
|
|
|
|
self.Entity:SetColor(ar, ag, ab, aa)
|
|
end
|
|
|
|
function ENT:ReadCell( Address )
|
|
if (self.Memory) then
|
|
if (self.Memory.ReadCell) then
|
|
return self.Memory:ReadCell( Address )
|
|
else
|
|
return nil
|
|
end
|
|
else
|
|
return nil
|
|
end
|
|
end
|
|
|
|
function ENT:WriteCell( Address, value )
|
|
if (self.Memory) then
|
|
if (self.Memory.WriteCell) then
|
|
return self.Memory:WriteCell( Address, value )
|
|
else
|
|
return false
|
|
end
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
function ENT:Think()
|
|
self.BaseClass.Think(self)
|
|
|
|
// If we were unplugged, reset the plug and socket to accept new ones.
|
|
if (self.Const) and (not self.Const:IsValid()) then
|
|
self.Const = nil
|
|
self.NoCollideConst = nil
|
|
if (self.MyPlug) and (self.MyPlug:IsValid()) then
|
|
self.MyPlug:SetSocket(nil)
|
|
self.MyPlug = nil
|
|
end
|
|
|
|
self.Memory = nil //We're now getting no signal
|
|
|
|
self.Entity:NextThink( CurTime() + NEW_PLUG_WAIT_TIME ) //Give time before next grabbing a plug.
|
|
return true
|
|
end
|
|
|
|
// If we have no plug in us
|
|
if (not self.MyPlug) or (not self.MyPlug:IsValid()) then
|
|
|
|
// Find entities near us
|
|
local sockCenter = self:GetOffset( Vector(8, -13, -10) )
|
|
local local_ents = ents.FindInSphere( sockCenter, PLUG_IN_ATTACH_RANGE )
|
|
for key, plug in pairs(local_ents) do
|
|
|
|
// If we find a plug, try to attach it to us
|
|
if ( plug:IsValid() && plug:GetClass() == "gmod_wire_dataplug" ) then
|
|
|
|
// If no other sockets are using it
|
|
if plug.MySocket == nil then
|
|
local plugpos = plug:GetPos()
|
|
local dist = (sockCenter-plugpos):Length()
|
|
|
|
self:AttachPlug(plug)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function ENT:AttachPlug( plug )
|
|
// Set references between them
|
|
plug:SetSocket(self.Entity)
|
|
self.MyPlug = plug
|
|
|
|
// Position plug
|
|
local newpos = self:GetOffset( Vector(8, -13, -5) )
|
|
local socketAng = self.Entity:GetAngles()
|
|
plug:SetPos( newpos )
|
|
plug:SetAngles( socketAng )
|
|
|
|
self.NoCollideConst = constraint.NoCollide(self.Entity, plug, 0, 0)
|
|
if (not self.NoCollideConst) then
|
|
self.MyPlug = nil
|
|
plug:SetSocket(nil)
|
|
self.Memory = nil
|
|
return
|
|
end
|
|
|
|
// Constrain together
|
|
self.Const = constraint.Weld( self.Entity, plug, 0, 0, PLUG_IN_SOCKET_CONSTRAINT_POWER, true )
|
|
if (not self.Const) then
|
|
self.NoCollideConst:Remove()
|
|
self.NoCollideConst = nil
|
|
self.MyPlug = nil
|
|
plug:SetSocket(nil)
|
|
self.Memory = nil
|
|
return
|
|
end
|
|
|
|
// Prepare clearup incase one is removed
|
|
plug:DeleteOnRemove( self.Const )
|
|
self.Entity:DeleteOnRemove( self.Const )
|
|
self.Const:DeleteOnRemove( self.NoCollideConst )
|
|
|
|
plug:AttachedToSocket(self.Entity)
|
|
end
|
|
|
|
function ENT:OnRestore()
|
|
self.A = self.A or 0
|
|
self.AR = self.AR or 255
|
|
self.AG = self.AG or 0
|
|
self.AB = self.AB or 0
|
|
self.AA = self.AA or 255
|
|
|
|
self.BaseClass.OnRestore(self)
|
|
end
|