Initial Commit
This commit is contained in:
commit
20b4e22ea6
6 changed files with 2137 additions and 0 deletions
665
base.lua
Normal file
665
base.lua
Normal file
|
@ -0,0 +1,665 @@
|
|||
base_fth = [[
|
||||
: HEX 16 BASE ! ;
|
||||
: DEC 10 BASE ! ;
|
||||
: OCT 8 BASE ! ;
|
||||
: BIN 2 BASE ! ;
|
||||
|
||||
: C! SWAP 255 AND SWAP ! ;
|
||||
: C@ @ 255 AND ;
|
||||
: C,
|
||||
HERE @ C!
|
||||
1 HERE +!
|
||||
;
|
||||
|
||||
: LITERAL IMMEDIATE
|
||||
COMP' LIT ,
|
||||
,
|
||||
;
|
||||
: CHAR BL WORD 1+ C@ ;
|
||||
|
||||
: '"' [ CHAR " ] LITERAL ;
|
||||
: '[' [ CHAR [ ] LITERAL ;
|
||||
: ']' [ CHAR ] ] LITERAL ;
|
||||
: '(' [ CHAR ( ] LITERAL ;
|
||||
: ')' [ CHAR ) ] LITERAL ;
|
||||
: ':' [ CHAR : ] LITERAL ;
|
||||
: ';' [ CHAR ; ] LITERAL ;
|
||||
: '0' [ CHAR 0 ] LITERAL ;
|
||||
: 'A' [ CHAR A ] LITERAL ;
|
||||
: '-' [ CHAR - ] LITERAL ;
|
||||
: '.' [ CHAR . ] LITERAL ;
|
||||
|
||||
: CR 10 EMIT ;
|
||||
: SPACE 32 EMIT ;
|
||||
|
||||
: ' BL WORD FIND >CFA ;
|
||||
: [COMPILE] IMMEDIATE ' , ;
|
||||
: ['] IMMEDIATE ' [COMPILE] LITERAL ;
|
||||
: LIT, ['] LIT , , ;
|
||||
|
||||
: / /MOD SWAP DROP ;
|
||||
: MOD /MOD DROP ;
|
||||
|
||||
: U/ UM/MOD SWAP DROP ;
|
||||
: UMOD UM/MOD DROP ;
|
||||
|
||||
: NOT 0= ;
|
||||
|
||||
: RECURSE IMMEDIATE
|
||||
LATEST @
|
||||
>CFA ,
|
||||
;
|
||||
|
||||
: IF IMMEDIATE
|
||||
['] 0BRANCH ,
|
||||
HERE @
|
||||
0 ,
|
||||
;
|
||||
: THEN IMMEDIATE
|
||||
DUP
|
||||
HERE @ SWAP -
|
||||
SWAP !
|
||||
;
|
||||
: ELSE IMMEDIATE
|
||||
['] BRANCH ,
|
||||
HERE @
|
||||
0 ,
|
||||
SWAP
|
||||
DUP HERE @ SWAP -
|
||||
SWAP !
|
||||
;
|
||||
|
||||
: ?HIDDEN 1+ C@ F_HIDDEN AND ;
|
||||
: ?IMMEDIATE 1+ C@ F_IMMED AND ;
|
||||
|
||||
: EXECUTE-COMPILING
|
||||
STATE @ IF EXECUTE EXIT THEN
|
||||
] EXECUTE [
|
||||
;
|
||||
|
||||
: POSTPONE IMMEDIATE
|
||||
BL WORD FIND
|
||||
DUP ?IMMEDIATE
|
||||
SWAP >CFA LIT,
|
||||
IF ['] EXECUTE-COMPILING ELSE ['] , THEN ,
|
||||
;
|
||||
|
||||
: BEGIN IMMEDIATE HERE @ ;
|
||||
: UNTIL IMMEDIATE
|
||||
POSTPONE 0BRANCH
|
||||
HERE @ - ,
|
||||
;
|
||||
: AGAIN IMMEDIATE
|
||||
POSTPONE BRANCH
|
||||
HERE @ - ,
|
||||
;
|
||||
: WHILE IMMEDIATE
|
||||
POSTPONE 0BRANCH
|
||||
HERE @
|
||||
0 ,
|
||||
;
|
||||
: REPEAT IMMEDIATE
|
||||
POSTPONE BRANCH
|
||||
SWAP HERE @ - ,
|
||||
DUP HERE @ SWAP - SWAP !
|
||||
;
|
||||
: UNLESS IMMEDIATE
|
||||
POSTPONE NOT
|
||||
POSTPONE IF
|
||||
;
|
||||
|
||||
: ( IMMEDIATE
|
||||
1
|
||||
BEGIN
|
||||
KEY DUP '(' = IF
|
||||
DROP
|
||||
1+
|
||||
ELSE
|
||||
')' = IF
|
||||
1-
|
||||
THEN
|
||||
THEN
|
||||
DUP 0= UNTIL
|
||||
DROP
|
||||
;
|
||||
|
||||
: NIP ( x y -- y ) SWAP DROP ;
|
||||
: TUCK ( x y -- y x y ) SWAP OVER ;
|
||||
: PICK ( xn ... x1 x0 n -- xn ... x1 x0 xn )
|
||||
1+ 1 CELLS * DSP@ + @
|
||||
;
|
||||
|
||||
( Print many of a character )
|
||||
: MANY ( n c -- )
|
||||
SWAP
|
||||
BEGIN
|
||||
DUP 0>
|
||||
WHILE
|
||||
OVER EMIT
|
||||
1-
|
||||
REPEAT
|
||||
2DROP
|
||||
;
|
||||
|
||||
: SPACES ( n -- )
|
||||
BL MANY
|
||||
;
|
||||
|
||||
: ZEROS ( n -- )
|
||||
'0' MANY
|
||||
;
|
||||
|
||||
: U. ( u -- )
|
||||
BASE @ UM/MOD ( base rem quot )
|
||||
?DUP IF
|
||||
RECURSE
|
||||
THEN
|
||||
|
||||
DUP 10 < IF
|
||||
'0'
|
||||
ELSE
|
||||
10 -
|
||||
'A'
|
||||
THEN
|
||||
+ EMIT
|
||||
;
|
||||
|
||||
( Get number of chars in an unsigend number )
|
||||
: UWIDTH ( u -- width )
|
||||
BASE @ U/ ( rem quot)
|
||||
?DUP IF ( if quot <> 0 )
|
||||
RECURSE 1+
|
||||
ELSE
|
||||
1
|
||||
THEN
|
||||
;
|
||||
|
||||
( Get number of chars in an unsigend number )
|
||||
: SWIDTH ( u -- width )
|
||||
DUP 0< IF NEGATE THEN
|
||||
BASE @ / ( rem quot)
|
||||
?DUP IF ( if quot <> 0 )
|
||||
RECURSE 1+
|
||||
ELSE
|
||||
1
|
||||
THEN
|
||||
;
|
||||
|
||||
( Left pad number )
|
||||
: U.R ( u width -- )
|
||||
SWAP
|
||||
DUP
|
||||
UWIDTH
|
||||
ROT
|
||||
SWAP -
|
||||
SPACES
|
||||
U.
|
||||
;
|
||||
|
||||
( Zero pad number )
|
||||
: U.0R ( u width -- )
|
||||
SWAP
|
||||
DUP
|
||||
UWIDTH
|
||||
ROT
|
||||
SWAP -
|
||||
ZEROS
|
||||
U.
|
||||
;
|
||||
|
||||
( Print left padded signed number )
|
||||
: .R
|
||||
SWAP
|
||||
DUP 0< IF
|
||||
NEGATE
|
||||
1
|
||||
SWAP
|
||||
ROT
|
||||
1-
|
||||
ELSE
|
||||
0
|
||||
SWAP
|
||||
ROT
|
||||
THEN
|
||||
SWAP
|
||||
DUP
|
||||
SWIDTH
|
||||
ROT
|
||||
SWAP -
|
||||
|
||||
SPACES
|
||||
SWAP
|
||||
|
||||
IF
|
||||
'-' EMIT
|
||||
THEN
|
||||
|
||||
U.
|
||||
;
|
||||
|
||||
( Print zero padded signed number )
|
||||
: .0R
|
||||
SWAP
|
||||
DUP 0< IF
|
||||
NEGATE
|
||||
1
|
||||
SWAP
|
||||
ROT
|
||||
1-
|
||||
ELSE
|
||||
0
|
||||
SWAP
|
||||
ROT
|
||||
THEN
|
||||
SWAP
|
||||
DUP
|
||||
SWIDTH
|
||||
ROT
|
||||
SWAP -
|
||||
|
||||
ZEROS
|
||||
SWAP
|
||||
|
||||
IF
|
||||
'-' EMIT
|
||||
THEN
|
||||
|
||||
U.
|
||||
;
|
||||
|
||||
: . 0 .R SPACE ;
|
||||
: U. U. SPACE ;
|
||||
|
||||
: .S ( Print the stack )
|
||||
DSP@ S0 @
|
||||
BEGIN
|
||||
2DUP <
|
||||
WHILE
|
||||
1-
|
||||
DUP @ .
|
||||
SPACE
|
||||
REPEAT
|
||||
2DROP
|
||||
CR
|
||||
;
|
||||
|
||||
( Print number at address )
|
||||
: ? ( addr -- ) @ . ;
|
||||
|
||||
: WITHIN
|
||||
-ROT OVER
|
||||
<= IF
|
||||
> IF
|
||||
TRUE
|
||||
ELSE
|
||||
FALSE
|
||||
THEN
|
||||
ELSE
|
||||
2DROP
|
||||
FALSE
|
||||
THEN
|
||||
;
|
||||
|
||||
( Returns depth of stack )
|
||||
: DEPTH ( -- n )
|
||||
S0 @ DSP@ -
|
||||
1-
|
||||
;
|
||||
|
||||
: S" IMMEDIATE
|
||||
STATE @ IF
|
||||
POSTPONE LITSTRING
|
||||
HERE @
|
||||
0 ,
|
||||
BEGIN
|
||||
KEY
|
||||
DUP '"' <>
|
||||
WHILE
|
||||
C,
|
||||
REPEAT
|
||||
DROP
|
||||
DUP
|
||||
HERE @ SWAP -
|
||||
1-
|
||||
SWAP !
|
||||
ELSE
|
||||
HERE @
|
||||
BEGIN
|
||||
KEY
|
||||
DUP '"' <>
|
||||
WHILE
|
||||
OVER C!
|
||||
1+
|
||||
REPEAT
|
||||
DROP
|
||||
HERE @ -
|
||||
HERE @
|
||||
SWAP
|
||||
THEN
|
||||
;
|
||||
|
||||
: ." IMMEDIATE
|
||||
STATE @ IF
|
||||
POSTPONE S"
|
||||
POSTPONE TELL
|
||||
ELSE
|
||||
BEGIN
|
||||
KEY
|
||||
DUP '"' = IF
|
||||
DROP
|
||||
EXIT
|
||||
THEN
|
||||
EMIT
|
||||
AGAIN
|
||||
THEN
|
||||
;
|
||||
|
||||
: DOES>
|
||||
STATE @ IF
|
||||
POSTPONE (DOES>)
|
||||
ELSE
|
||||
HERE @ ( HERE )
|
||||
LATEST @ >CFA ( HERE CFA )
|
||||
DUP [ ' DODOES @ ] LITERAL SWAP ! ( Write CW of DODOES to CFA )
|
||||
1+ ! ( Write HERE to >DOES )
|
||||
LATEST @ HIDDEN
|
||||
]
|
||||
THEN
|
||||
; IMMEDIATE
|
||||
|
||||
: VARIABLE CREATE 0 , ;
|
||||
: CONSTANT CREATE , DOES> @ ;
|
||||
|
||||
: VALUE ( n -- )
|
||||
CREATE ,
|
||||
DOES> ( -- n )
|
||||
@
|
||||
;
|
||||
|
||||
: TO ( n "name" -- )
|
||||
' >BODY !
|
||||
;
|
||||
|
||||
: +TO ( n "name" -- )
|
||||
' >BODY +!
|
||||
;
|
||||
|
||||
0 VALUE I
|
||||
: SETI [ ' I >BODY ] LITERAL ! ;
|
||||
|
||||
: DO IMMEDIATE ( C: -- HERE ) ( LIMIT I -- )
|
||||
SETI
|
||||
R> ( r: -- LIMIT )
|
||||
HERE @ ( C: -- HERE )
|
||||
;
|
||||
|
||||
: (LOOP)
|
||||
I 1+ DUP SETI
|
||||
R@ >
|
||||
0BRANCH
|
||||
;
|
||||
|
||||
: (UNLOOP)
|
||||
>R DROP
|
||||
;
|
||||
|
||||
: LOOP IMMEDIATE
|
||||
POSTPONE (LOOP)
|
||||
HERE @ - ,
|
||||
POSTPONE (UNLOOP)
|
||||
;
|
||||
|
||||
: ID.
|
||||
1+ ( Skip link pointer )
|
||||
DUP C@ ( entry flags )
|
||||
F_LENMASK AND ( entry len)
|
||||
|
||||
BEGIN
|
||||
DUP 0> ( entry len len>0? )
|
||||
WHILE
|
||||
SWAP 1+ ( len entry+1 )
|
||||
DUP C@ EMIT
|
||||
SWAP 1- ( entry+1 len-1 )
|
||||
REPEAT
|
||||
2DROP ( entry len -- )
|
||||
;
|
||||
|
||||
: WORDS
|
||||
LATEST @
|
||||
BEGIN
|
||||
?DUP
|
||||
WHILE
|
||||
DUP ?HIDDEN IF
|
||||
." (H)"
|
||||
THEN
|
||||
DUP ?IMMEDIATE IF
|
||||
." (I)"
|
||||
THEN
|
||||
DUP ID. SPACE
|
||||
@
|
||||
REPEAT
|
||||
CR
|
||||
;
|
||||
|
||||
: HIDE
|
||||
BL WORD FIND
|
||||
HIDDEN
|
||||
;
|
||||
|
||||
: FORGET
|
||||
BL WORD FIND
|
||||
DUP @ LATEST !
|
||||
HERE !
|
||||
;
|
||||
|
||||
: DUMP ( addr len -- )
|
||||
( Save BASE )
|
||||
BASE @ -ROT
|
||||
|
||||
BEGIN
|
||||
?DUP
|
||||
WHILE
|
||||
HEX
|
||||
OVER 8 U.0R
|
||||
4 SPACES
|
||||
|
||||
( Print hex )
|
||||
2DUP
|
||||
1- 15 AND 1+
|
||||
BEGIN
|
||||
?DUP
|
||||
WHILE
|
||||
SWAP
|
||||
DUP
|
||||
5 PICK DEC 10 = IF
|
||||
@ 0 DEC
|
||||
ELSE
|
||||
C@ 2 HEX
|
||||
THEN
|
||||
.0R SPACE
|
||||
1+ SWAP 1-
|
||||
REPEAT
|
||||
DROP
|
||||
|
||||
3 SPACES
|
||||
|
||||
( Print ascii )
|
||||
2DUP
|
||||
1- 15 AND 1+
|
||||
BEGIN
|
||||
?DUP
|
||||
WHILE
|
||||
SWAP
|
||||
DUP C@
|
||||
DUP 32 128 WITHIN IF
|
||||
EMIT
|
||||
ELSE
|
||||
DROP '.' EMIT
|
||||
THEN
|
||||
1+ SWAP 1-
|
||||
REPEAT
|
||||
DROP
|
||||
CR
|
||||
|
||||
DUP 1- 15 AND 1+
|
||||
TUCK
|
||||
-
|
||||
>R + R>
|
||||
REPEAT
|
||||
|
||||
DROP
|
||||
BASE !
|
||||
;
|
||||
|
||||
: CASE IMMEDIATE
|
||||
0
|
||||
;
|
||||
|
||||
: OF IMMEDIATE
|
||||
POSTPONE OVER
|
||||
POSTPONE =
|
||||
POSTPONE IF
|
||||
POSTPONE DROP
|
||||
;
|
||||
|
||||
: ENDOF IMMEDIATE
|
||||
POSTPONE ELSE
|
||||
;
|
||||
|
||||
: ENDCASE IMMEDIATE
|
||||
POSTPONE DROP
|
||||
|
||||
( Compile THEN's for each ELSE )
|
||||
BEGIN
|
||||
?DUP
|
||||
WHILE
|
||||
POSTPONE THEN
|
||||
REPEAT
|
||||
;
|
||||
|
||||
: CFA>
|
||||
LATEST @
|
||||
BEGIN
|
||||
?DUP
|
||||
WHILE
|
||||
2DUP SWAP
|
||||
< IF
|
||||
NIP
|
||||
EXIT
|
||||
THEN
|
||||
@
|
||||
REPEAT
|
||||
DROP
|
||||
0
|
||||
;
|
||||
|
||||
: SEE
|
||||
BL WORD FIND
|
||||
|
||||
HERE @
|
||||
LATEST @
|
||||
BEGIN
|
||||
2 PICK
|
||||
OVER
|
||||
<>
|
||||
WHILE
|
||||
NIP
|
||||
DUP @
|
||||
REPEAT
|
||||
|
||||
DROP SWAP
|
||||
|
||||
':' EMIT SPACE DUP ID. CR
|
||||
DUP ?IMMEDIATE IF ." IMMEDIATE " THEN
|
||||
|
||||
>DFA
|
||||
|
||||
BEGIN
|
||||
2DUP >
|
||||
WHILE
|
||||
DUP @
|
||||
|
||||
CASE
|
||||
['] LIT OF
|
||||
CELL+ DUP @
|
||||
. CR
|
||||
ENDOF
|
||||
['] LITSTRING OF
|
||||
[ CHAR S ] LITERAL EMIT '"' EMIT SPACE
|
||||
CELL+
|
||||
COUNT 2DUP TELL
|
||||
'"' EMIT CR
|
||||
+
|
||||
CELL-
|
||||
ENDOF
|
||||
['] 0BRANCH OF
|
||||
." 0BRANCH("
|
||||
CELL+ DUP @ 0 .R
|
||||
." ) " CR
|
||||
ENDOF
|
||||
['] BRANCH OF
|
||||
." BRANCH("
|
||||
CELL+ DUP @ 0 .R
|
||||
." ) " CR
|
||||
ENDOF
|
||||
['] ' OF
|
||||
[ CHAR ' ] LITERAL EMIT SPACE
|
||||
CELL+ @
|
||||
CFA> ID. CR
|
||||
ENDOF
|
||||
['] EXIT OF
|
||||
2DUP CELL+
|
||||
<> IF
|
||||
." EXIT " CR
|
||||
THEN
|
||||
ENDOF
|
||||
DUP
|
||||
CFA>
|
||||
ID. CR
|
||||
ENDCASE
|
||||
|
||||
CELL+
|
||||
REPEAT
|
||||
|
||||
';' EMIT CR
|
||||
|
||||
2DROP
|
||||
;
|
||||
|
||||
: :NONAME
|
||||
HERE @
|
||||
LATEST @ ,
|
||||
LATEST !
|
||||
0 ,
|
||||
HERE @
|
||||
[ ' DOCOL @ ] LITERAL ,
|
||||
0 ,
|
||||
]
|
||||
;
|
||||
|
||||
( Colors )
|
||||
DEC
|
||||
: ESC[ 27 EMIT '[' EMIT ;
|
||||
0 CONSTANT RESET
|
||||
1 CONSTANT BRIGHT
|
||||
2 CONSTANT DIM
|
||||
4 CONSTANT UNSERSCORE
|
||||
5 CONSTANT BLINK
|
||||
7 CONSTANT REVERSE
|
||||
8 CONSTANT HIDDEN
|
||||
|
||||
: FG> 30 + ;
|
||||
: BG> 40 + ;
|
||||
|
||||
0 CONSTANT <BLK
|
||||
1 CONSTANT <RED
|
||||
2 CONSTANT <GRN
|
||||
3 CONSTANT <YEL
|
||||
4 CONSTANT <BLU
|
||||
5 CONSTANT <MAG
|
||||
6 CONSTANT <CYN
|
||||
7 CONSTANT <WHT
|
||||
|
||||
: <COLOR> ESC[ 0 .R ';' EMIT 0 .R ." m" ;
|
||||
: <ATTRIB> ESC[ 0 .R ';' EMIT ." ;m" ;
|
||||
]]
|
198
control.lua
Normal file
198
control.lua
Normal file
|
@ -0,0 +1,198 @@
|
|||
require('forth')
|
||||
|
||||
function init_storage()
|
||||
-- storage.valid = false
|
||||
if not storage.valid then
|
||||
storage.players = {}
|
||||
storage.computers = {}
|
||||
storage.guis = {}
|
||||
storage.valid = true
|
||||
end
|
||||
end
|
||||
|
||||
function computer_for_ent(entity)
|
||||
for _, computer in pairs(storage.computers) do
|
||||
if computer.entity == entity then
|
||||
return computer
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
script.on_event(defines.events.on_tick, function(event)
|
||||
init_storage()
|
||||
|
||||
for _, computer in pairs(storage.computers) do
|
||||
for _=1,250 do
|
||||
local ok, result = pcall(forth_tick, computer.ctx)
|
||||
if ok and result then break end
|
||||
if not ok then
|
||||
game.print(result)
|
||||
computer.ctx = forth_initialize(computer.entity)
|
||||
end
|
||||
end
|
||||
if #computer.ctx.outbuf > 0 then
|
||||
local out = ''
|
||||
for i, v in pairs(computer.ctx.outbuf) do
|
||||
out = out..v
|
||||
end
|
||||
computer.screen = computer.screen..out
|
||||
computer.ctx.outbuf = {}
|
||||
end
|
||||
end
|
||||
|
||||
for player_index, player in pairs(storage.players) do
|
||||
if player.opened_combinator then
|
||||
local computer = computer_for_ent(player.opened_combinator)
|
||||
local ui = game.get_player(player_index).gui.screen.forth_combinator_gui
|
||||
ui.forth_combinator_console.text = computer.screen
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
script.on_event(defines.events.on_gui_text_changed, function(event)
|
||||
if not event.element or event.element.name ~= 'forth_combinator_editor' then return end
|
||||
|
||||
local player = storage.players[event.player_index]
|
||||
player.curtext = event.element.text
|
||||
end)
|
||||
|
||||
function create_ui(player, computer)
|
||||
local frame = player.gui.screen.add{type = "frame", name = "forth_combinator_gui", caption = "Console"}
|
||||
frame.force_auto_center()
|
||||
|
||||
local editor = frame.add{type = 'text-box', name = 'forth_combinator_editor'}
|
||||
editor.style.minimal_height = 600
|
||||
editor.style.minimal_width = 800
|
||||
editor.style.maximal_height = 600
|
||||
editor.style.maximal_width = 800
|
||||
editor.text = computer.script
|
||||
local console = frame.add{type = 'text-box', name = 'forth_combinator_console'}
|
||||
console.style.minimal_height = 600
|
||||
console.style.minimal_width = 400
|
||||
console.style.maximal_height = 600
|
||||
console.style.maximal_width = 400
|
||||
console.text = computer.screen
|
||||
local run_button = frame.add{type = 'button', name = 'forth_combinator_run', caption = "Do Shit"}
|
||||
-- console.selectable = false
|
||||
|
||||
|
||||
|
||||
return frame
|
||||
end
|
||||
|
||||
script.on_event(defines.events.on_gui_opened, function(event)
|
||||
if not event.entity or event.entity.name ~= 'forth-combinator' then return end
|
||||
init_storage()
|
||||
|
||||
local player = game.get_player(event.player_index)
|
||||
|
||||
if not storage.players[event.player_index] then
|
||||
storage.players[event.player_index] = {}
|
||||
end
|
||||
|
||||
if player.gui.screen.forth_combinator_gui then
|
||||
player.gui.screen.forth_combinator_gui.destroy()
|
||||
end
|
||||
|
||||
if player.opened then
|
||||
player.opened = nil
|
||||
end
|
||||
|
||||
player.opened = create_ui(player, computer_for_ent(event.entity))
|
||||
storage.players[event.player_index].opened_combinator = event.entity
|
||||
end)
|
||||
|
||||
script.on_event(defines.events.on_gui_closed, function(event)
|
||||
local player = game.get_player(event.player_index)
|
||||
|
||||
if player.gui.screen.forth_combinator_gui then
|
||||
player.gui.screen.forth_combinator_gui.destroy()
|
||||
if storage.players[event.player_index] then
|
||||
storage.players[event.player_index].opened_combinator = nil
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
script.on_event(defines.events.on_gui_click, function(event)
|
||||
local player = game.get_player(event.player_index)
|
||||
local entity = storage.players[event.player_index].opened_combinator
|
||||
|
||||
if event.element.name == 'forth_combinator_run' then
|
||||
local computer = computer_for_ent(entity)
|
||||
if not computer then
|
||||
game.print('Invalid computer in gui click')
|
||||
return
|
||||
end
|
||||
computer.ctx = forth_initialize(entity)
|
||||
|
||||
-- Hack, idc
|
||||
local text = storage.players[event.player_index].curtext
|
||||
for c in text:gmatch('.') do
|
||||
table.insert(computer.ctx.keybuf, string.byte(c))
|
||||
end
|
||||
table.insert(computer.ctx.keybuf, 10)
|
||||
|
||||
computer.screen = ''
|
||||
computer.script = text
|
||||
end
|
||||
end)
|
||||
|
||||
function OnBuiltEntity(event)
|
||||
local entity = event.entity
|
||||
if entity.name ~= 'forth-combinator' then return end
|
||||
init_storage()
|
||||
|
||||
local computer = {
|
||||
ctx = forth_initialize(entity),
|
||||
entity = entity,
|
||||
screen = '',
|
||||
script = '',
|
||||
}
|
||||
|
||||
table.insert(storage.computers, computer)
|
||||
end
|
||||
|
||||
function OnEntityDied(event)
|
||||
local entity = event.entity
|
||||
if entity.name ~= 'forth-combinator' then return end
|
||||
init_storage()
|
||||
|
||||
local removals = {}
|
||||
for i, comp in pairs(storage.computers) do
|
||||
if comp.entity == entity then
|
||||
table.insert(removals, i)
|
||||
end
|
||||
end
|
||||
for _, i in pairs(removals) do
|
||||
table.remove(storage.computers, i)
|
||||
end
|
||||
end
|
||||
|
||||
script.on_event(defines.events.on_built_entity, OnBuiltEntity)
|
||||
script.on_event(defines.events.on_robot_built_entity, OnBuiltEntity)
|
||||
-- script.on_event(defines.events.on_pre_ghost_deconstructed, OnPreGhostDeconstructed)
|
||||
script.on_event(defines.events.on_entity_died, OnEntityDied)
|
||||
script.on_event(defines.events.on_pre_player_mined_item, OnEntityDied)
|
||||
script.on_event(defines.events.on_robot_pre_mined, OnEntityDied)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-- player.surface.create_entity({
|
||||
-- name = 'laser-beam',
|
||||
-- position = entity.position,
|
||||
-- source_position = entity.position,
|
||||
-- target = player.position,
|
||||
-- })
|
27
data.lua
Normal file
27
data.lua
Normal file
|
@ -0,0 +1,27 @@
|
|||
local forthCombinator = table.deepcopy(data.raw['constant-combinator']['constant-combinator'])
|
||||
|
||||
forthCombinator.name = 'forth-combinator'
|
||||
forthCombinator.minable.result = 'forth-combinator'
|
||||
for k, direction in pairs(forthCombinator.sprites) do
|
||||
for kk, vv in pairs(direction.layers) do
|
||||
vv.tint = {r = 0, g = 0, b = 1}
|
||||
end
|
||||
end
|
||||
|
||||
local forthCombinatorItem = table.deepcopy(data.raw['item']['constant-combinator'])
|
||||
forthCombinatorItem.name = 'forth-combinator'
|
||||
forthCombinatorItem.place_result = 'forth-combinator'
|
||||
|
||||
local recipe = {
|
||||
type = 'recipe',
|
||||
name = 'forth-combinator',
|
||||
enabled = true,
|
||||
energy_required = 1, -- time to craft in seconds (at crafting speed 1)
|
||||
ingredients = {
|
||||
{type = 'item', name = 'copper-plate', amount = 1}
|
||||
},
|
||||
results = {{type = 'item', name = 'forth-combinator', amount = 1}}
|
||||
}
|
||||
|
||||
data:extend{forthCombinator, forthCombinatorItem, recipe}
|
||||
|
9
info.json
Normal file
9
info.json
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"name": "forthCombinator",
|
||||
"version": "0.1.0",
|
||||
"title": "Forth Combinator",
|
||||
"author": "UrMomLel",
|
||||
"factorio_version": "2.0",
|
||||
"dependencies": ["base >= 2.0"],
|
||||
"description": "This game needs computers and those computers need to be running forth"
|
||||
}
|
9
locale/en/locale.cfg
Normal file
9
locale/en/locale.cfg
Normal file
|
@ -0,0 +1,9 @@
|
|||
|
||||
[item-name]
|
||||
forth-combinator=forth combinator
|
||||
|
||||
[entity-name]
|
||||
forth-combinator=forth combinator
|
||||
|
||||
[item-description]
|
||||
forth-combinator=This game needs computers and those computers need to run Forth
|
Loading…
Reference in a new issue