Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@
"meatgun_module.meatweapons.slow_barrel.desc": "Makes projectiles into entities when installed in a BARREL slot.",
"meatgun_module.meatweapons.basic_stock": "Stock",
"meatgun_module.meatweapons.basic_stock.desc": "+100% accuracy",
"meatgun_module.meatweapons.phage_ray_speed_modifier": "Phage Ray Speed Modifier",
"meatgun_module.meatweapons.phage_ray_speed_modifier.desc": "Increases the mining speed of the Phage Ray",
"meatgun_module.meatweapons.phage_ray_speed_modifier": "Drill Speed Modifier",
"meatgun_module.meatweapons.phage_ray_speed_modifier.desc": "Increases the mining speed of the rotary drills and the phage ray",
"meatgun_module.meatweapons.base": "Base",
"meatgun_module.meatweapons.bloodthrower": "Bloodthrower - WIP",
"meatgun_module.meatweapons.short_phage_ray": "Small phage Ray",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@
"meatgun_module.meatweapons.slow_barrel.desc": "安装于枪管槽位时,将弹射物变为实体。",
"meatgun_module.meatweapons.basic_stock": "枪托",
"meatgun_module.meatweapons.basic_stock.desc": "+100% 精准度",
"meatgun_module.meatweapons.phage_ray_speed_modifier": "吞噬射线炮速度强化器",
"meatgun_module.meatweapons.phage_ray_speed_modifier.desc": "增加吞噬射线炮的破坏速度。",
"meatgun_module.meatweapons.phage_ray_speed_modifier": "钻具速度强化器",
"meatgun_module.meatweapons.phage_ray_speed_modifier.desc": "增加旋转式钻头和吞噬射线炮的破坏速度。",
"meatgun_module.meatweapons.base": "基座",
"meatgun_module.meatweapons.bloodthrower": "血液喷射器 - WIP",
"meatgun_module.meatweapons.short_phage_ray": "小型吞噬射线炮",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -310,13 +310,15 @@ Prints the data stored at the given address. Equivalent to @ .

## ' ( "word" -- addr )

Pushes the address of the following word to the stack.
Looks up the given word (provided in a string) and pushes its address to the stack.

Equivalent to NEEPASM `DYLOC`

```
: aword 1 + . ;

# Print the word's address
' aword .
"aword" ' .
```

## EXECUTE ( addr -- )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,11 +102,11 @@ execute

将栈顶的两个元素移动到返回栈栈顶。

## R> (-- n1 ) (R: n1 -- )
## R> ( -- n1 ) (R: n1 -- )

将返回栈栈顶元素移动到数据栈栈顶。

## 2R> (-- n1 n2 ) (R: n1 n2 -- )
## 2R> ( -- n1 n2 ) (R: n1 n2 -- )

将返回栈栈顶的两个元素移动到数据栈栈顶。

Expand Down Expand Up @@ -253,7 +253,7 @@ begin
123 >STR
```

## \>INT (x1 -- n1 )
## \>INT ( x1 -- n1 )

将栈顶元素转换为整型值。无法转换会产生错误。

Expand Down Expand Up @@ -303,31 +303,33 @@ a 2 + ?
[2] 将第三个元素设为123
[3] 打印第三个元素

## ! ( n1 地址 -- )
## ! ( n1 addr -- )

将n1存入所给地址。

## @ ( 地址 -- n1 )
## @ ( addr -- n1 )

读取所给地址处的数据。

## ? ( 地址 -- )
## ? ( addr -- )

打印给定地址处的数据。与`@ .`等价。

## ' ( "词" -- 地址 )
## ' ( "词" -- addr )

将本词后方的词的地址压栈。
查找所给词(以字符串形式给出),将其地址压栈。

与NEEPASM的`DYLOC`等价。

```
: aword 1 + . ;

# Print the word's address [1]
' aword .
"aword" ' .
```
[1] 打印词的地址

## EXECUTE ( 地址 -- )
## EXECUTE ( addr -- )

跳转到给定地址处的指令。与NEEPASM的`CALL`等价。

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
id: blood_bubble_tree
lookup: neepmeat:blood_bubble, neepmeat:blood_bubble_sapling
---

# Blood Bubble Tree

Granting Enlightenment to a Crimson Fungus remakes its flesh. Instead of fruit, the tree bears membranous sacs filled with animal blood.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
id: gland_potato
lookup: neepmeat:flesh_potato
---

# Gland Potato

Exposure to the Divine has caused the potato to take on exotic fleshy characteristics, perhaps echoing Its nature. The tissues produce novel organic products that can be extracted with a Mixer.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
id: whisper_wheat
lookup: neepmeat:whisper_wheat, neepmeat:whisper_wheat_seeds, neepmeat:whisper_bread
---

# Whisper Wheat

A farmer once heard a rotten voice beneath his fields. Each night he would dig, trying to get closer and hear what the voice was saying. On a dark, wet night, the walls of the hole collapsed, and he drowned in freezing earth.

## Usage

Whisper Wheat can be obtained by Enlightening regular wheat seeds. Whisper Wheat is the precursor to Whisper Brass and can be used to make bread and Animal Feed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
id: fluid_pipe
lookup: neepmeat:fluid_pipe
---

# Fluid Pipe

Fluid pipes are a simple way of transferring fluids from one block to another.

# Usage

Pipes connect to any block that can accept fluids, although some blocks only allow connections in certain directions."},

For fluids to move through pipes, there must be a height difference or an active pump. Fluids obey gravity, so they will naturally flow from containers at higher elevations to lower ones. Flow can also be induced by placing Redstone Pumps along the desired path of flow.

## Behaviour

Pipes have a maximum flow rate of 10125d (1/8 buckets) per tick. When no pumps are present, fluids can only move downwards and horizontally. Pipes will fill up when all paths are blocked.
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
---
id: process_interface
lookup: neepmeat:process_interface, neepmeat:process_card
---

# Process Interface

The Process Interface allows integrating any machine into a recursive crafting system.

It has slots for multiple Process Cards, each which records the ingredients and result of a specific recipe.

For example, a Process Interface can be connected to a furnace. The interface can contain cards for many different smelting recipes, which will be made available in the item network.

## Usage

To use a Process Interface to integrate a machine, place it facing the machine's input storage. It is recommended to use a hopper or some other intermediate storage that can hold multiple stacks if the interface is likely to process multiple items at once.

The rear side of the Process Interface is where ingredients will be requested to, so it must be connected to the pipe network. It is also where the outputs will be ejected from.

When a requested ingredient enters the rear face, it will be ejected into the storage on the front face.

Inserting an item into any other side of the Process Interface will put it into result storage. When a request is active, the return storage will be periodically checked for the request's result.

How a Process Interface spends its time:

1. Wait for a craft request.
2. Wait for the ingredients to arrive via the rear face.
3. When all ingredients have arrived, emit a PLC interrupt.
4. Wait for the result to arrive via a side face.
5. Eject the result via the rear face.

## PLC Interaction

The Process Interface can emit interrupt requests that can be listened for by a PLC.

For a recipe, an interrupt will be emitted after *all the ingredients for a recipe have arrived*.

The following program registers an interrupt for the Process Interface at (1, 2, 3) and waits for an interrupt to be emitted. As no label is provided to `IHANDLER` (note the _), the PLC will not branch to another position when an interrupt is received.

```
ihandler @(1 2 3 U) _
iwait

# Fetch the data ( -- batches id)
extfetch @(1 2 3 U)
# your code here

restart
```

### Memory

When PLC interrupts and the request queue are enabled, a Process Interface records and queues the batch size and requested item ID. These can be accessed with the `EXTFETCH` instruction.

Make sure to use `EXTFETCH` each time an interrupt is emitted, otherwise the queue will fill up.

## Example
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ lookup: neepmeat:breaker

This is a simple block breaker powered by a motor.

# Specifications
## Specifications

\columns{\graph{neepmeat:breaker}}{Min power: 10eJ/t}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ lookup: neepmeat:heater

The Heater warms any furnace-like block that it faces, allowing it to smelt items without fuel.

# Specifications
## Specifications

\columns{\graph{neepmeat:heater}}{\graph{neepmeat:heater_fluid_heating}}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ lookup: neepmeat:item_mincer

The Item Mincer squeezes food items into a Food slurry. The quality of the resulting Food is determined by the quality of the inserted food.

# Specifications
## Specifications

\columns{\graph{neepmeat:item_mincer}}{Min power: 40eJ/t
Max power: 800ej/t}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ id: mixer

The Mixer is a two block tall machine that combines fluids and items. It requires a source of rotation to function.

# Specifications
## Specifications

\columns{\graph{neepmeat:mixer}}{Min power: 40eJ/t
Max power: 800eJ/t}

## Usage
# Usage

Fluid inputs are taken from any tanks that are adjacent to the mixer's lower block. Item inputs must be inserted directly into the machine through hoppers or pipes.

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
---
id: program_cabinet
lookup: neepmeat:program_cabinet, neepmeat:program_card
---

# Program Disks

Program disks can be used to transfer programs (and source code) form one PLC to another.

To save a PLC's current program to a disk, click on the PLC while holding the disk.

To load a disk's program onto a PLC, sneak-click the PLC while holding it.

Clicking anywhere else while holding a disk allows changing the program's name. The program's name can be used to look up and run the entire program.

# Program Cabinet

A program cabinet is a program memory module. It provides some memory segments that can contain executable instructions for the PLC.

PLCs can access program disks stored in adjacent cabinets, and can execute their contents.

Each cabinet has 30 slots, each of which can hold a single program. Each slot takes up a single memory segment.

When using multiple cabinets, it is important to configure their memory offsets so that they do not overlap. Each segment must be uniquely addressable, and problems will arise if a PLC encounters multiple segments with the same offset.

# Executing Programs in a Cabinet

In this context, a *symbol* is an execution address that can be looked up from its name.

When a program is stored in a cabinet, all the words defined in that program (and the program's name) become accessible symbols to the connected PLC. The execution address of a word can be looked up using that word's name.

The list of symbols that a program contains can be seen in the tooltip of the program card.

To execute a program stored in a cabinet, the `'` or `DYCALL` words can be used.

- ' takes a string from the stack and finds the address of the corresponding symbol.
- DYCALL takes a string from the stack, locates the symbol and calls it as though it were a word.

## Example 1

The following program defines the word `PRINT_HELLO`. It has been saved to a program card and is stored in a cabinet

```
: print_hello "Hello" . ;
```

`print_hello` can be executed by a PLC's main program like this:

```
"print_hello" dycall
```

This is equivalent to

```
"print_hello" ' .call
```

## Example 2

As a program's name is also an exported symbol, an entire program can be executed like a word. The following program is stored on a disk and its name has been set to `print_hello`.

```
"Hello there" .
ret
```

Note the `RET` instruction at the end of the program. This will instruct the PLC to return to the original point where the program was *called*.

Now the PLC's main program can locate and call the symbol in the same way as the previous example:

```
"print_hello" dycall
```
Original file line number Diff line number Diff line change
Expand Up @@ -61,34 +61,34 @@ Arrays and noname words can do many interesting things. The following program st
# Create an array of three elements
array a 3

# Count represents the current element of the array to fill
# Count represents the current element of the array
variable count

# Create a noname word
:noname
.say "Look at me" ;
"Look at me!" . ;
;

# Stored it using a word we defined
# Store it using a word we defined
sto

# More compact syntax for the same thing
:noname .say "I'm a word" ; ; sto
:noname .say "Boiled in oil" ; ; sto
:noname "I'm a word" . ; sto
:noname "Boiled in oil" . ; sto

# Values of i: 0 1 2
3 0 for
# Get the value at i
i at execute
loop

# Stores top stack entry in the array and increments count.
# Stores top stack entry in 'a', increments count.
: sto ( addr -- )
count @ a + !
1 count +!
;

# Retrieves the element at idx
# Retrieves the element in 'a' at idx
: at ( idx -- addr )
a + @
;
Expand Down
Loading
Loading