Start of the history

This commit is contained in:
Kimapr 2019-10-23 06:57:37 +05:00
commit b1fe0b2ad4
420 changed files with 18284 additions and 0 deletions

11
.cdbrelease.lua Normal file
View File

@ -0,0 +1,11 @@
-- LUALOCALS < ---------------------------------------------------------
local dofile
= dofile
-- LUALOCALS > ---------------------------------------------------------
return {
user = "Kimapr",
pkg = "nodecore-skyblock",
min = "5.0",
version = dofile("./mods/nc_api/version.lua")
}

5
.gitattributes vendored Normal file
View File

@ -0,0 +1,5 @@
version.lua export-subst
.git* export-ignore
.lua* export-ignore
docs export-ignore
src export-ignore

3
.luacheckrc Normal file
View File

@ -0,0 +1,3 @@
globals = {"minetest", "ItemStack", "VoxelArea", "vector", "nodecore", "include", "SecureRandom"}
color = false
quiet = 1

8
.lualocals Normal file
View File

@ -0,0 +1,8 @@
~print
minetest
ItemStack
VoxelArea
vector
nodecore
include
SecureRandom

50
CONTRIBUTING Normal file
View File

@ -0,0 +1,50 @@
========================================================================
------------------------------------------------------------------------
For your contribution to be included in this project, you must
understand and agree to the terms in this document at the time of
contribution.
- A "contribution" consists of all files, patches and changes, source
control commits, comments and other metadata submitted to the project
maintainer(s) for inclusion or other use in the project.
- All contributions must consist only of your own original work, to
which you retain copyright, or to which copyright is not applicable.
- All copyrightable portions must be non-exclusively, perpetually and
irrevocably licensed under the same license terms as the overall
project.
- You will receive attribution in the project's license, in the form of
"Portions (C) ...", which shall cover all portions of all
contributions. You agree that this constitutes adequate attribution
under the terms of the license.
- You may request to be attributed pseudonymously at the time of
submission. Unless otherwise specified, source control metadata
will be used for attribution.
........................................................................
Other Guidelines:
- Non-included contributions to the project, such as hosting or other
services, content such as videos/streams, screenshots/galleries,
reviews, stories and other publicity do not need to follow the
guidelines above unless they are intended to also be eligible for
inclusion directly in the project.
- Keep original media source files that are not directly used by the
game engine (e.g. *.blend, *.xcf, *.svg) in folders named "src" in the
appropriate mod/area. These will NOT be distributed with the source
repo, but will not be packaged by ContentDB to keep download sizes
minimal.
- Lua code indentation style is based on this script:
http://notebook.kulchenko.com/programming/lua-beautifier-in-55-lines-of-perl
(except with INDENT set to "\t" for tabs instead of spaces)
This is very similar to the style used by ZeroBrane Studio.
------------------------------------------------------------------------
========================================================================

24
LICENSE Normal file
View File

@ -0,0 +1,24 @@
Copyright (C)2018-2019 Aaron Suen <warr1024@gmail.com>
Portions Copyright (C)2019 LoneWolfHT <lonewolf04361@gmail.com>
Portions Copyright (C)2019 Magik Eh
Portions Copyright (C)2019 Terifo <terifo1590@gmail.com>
Portions Copyright (C)2019 GreenXenith
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject
to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

66
README Normal file
View File

@ -0,0 +1,66 @@
========================================================================
\ /\
\ / \
/\ \ /\ |\ / / \ /\ |\ /
| \ | / \ | \ / | / \ | \ /
| \ | | | | | |__ | | | | / |__
\ \/ | | | | | \ / | | |/ |
\ \ / | / \ \ / \ / |\ \
\ \/ |/ \ \/ \/ | \ \
========================================================================
NodeCore - An original, immersive puzzle/adventure game for Minetest
------------------------------------------------------------------------
NodeCore is a major reconstruction of survival gameplay from the ground
up. Relearn much of what you thought you knew about Minetest!
Features:
- Immersive gameplay. Zero in-game pop-up GUIs. Minimal HUDs.
All interactions take place in continuous first-person perspective.
Nothing gets between you and the game world.
- Nearly everything is on the grid. Item stacks settle onto the grid
and persist. Complex machines (e.g. furnaces, storage) are built
in-world and can be designed, customized, optimized.
- In-world crafting. Assemble more complex recipes directly on the grid
or in-place. Learn how to "pummel" nodes to hammer things together
or break things apart.
- Built-in player guide and hint system provides low-spoiler guidance.
- Rich and subtle interactions. Some materials dig and transform in
stages. Some materials slump into repose when stacked high. Some
things transform if conditions are met, but transform faster based
on environment. Experiment and see what effects what!
- Build complex in-game systems. Design your own furnace. Construct
digital logic circuits. Build gears and rotary machinery. Assemble
portable storage containers.
- Eggcorns!
------------------------------------------------------------------------
NodeCore is (C)2018-2019 by Aaron Suen <warr1024@gmail.com>
MIT License (http://www.opensource.org/licenses/MIT)
See included LICENSE file for full details and credits
Minetest ContentDB Listing:
https://content.minetest.net/packages/Warr1024/nodecore/
GitLab:
https://gitlab.com/sztest/nodecore
Discord:
https://discord.gg/SHq2tkb
IRC:
#nodecore on chat.freenode.net
(bridged to Discord)
------------------------------------------------------------------------
========================================================================

51
WISHLIST Normal file
View File

@ -0,0 +1,51 @@
========================================================================
-----===== PUBLIC CONTRIBUTION WISHLIST =====-----
------------------------------------------------------------------------
Remember, check out the CONTRIBUTING file for guidelines on contributing
to the project!
- Translations:
- NodeCore is running Weblate:
https://nodecore.mine.nu/trans/projects/nodecore/core/
- Contact the NodeCore Developer(s) to get an account if you
want to contribute translations.
- Help (PRs and/or advocacy) with Minetest engine issues:
- >5.0.1 Release: Improvements already in the development branch
of the engine are expected to benefit NodeCore, e.g. #8701.
- #7245: This is blocking making navigation challenges and
distinguishing nodes with similar appearance into gameplay
elements.
- #8952: This causes hidden bases and other items to be visible
through walls and other terrain in our MP server.
- #8141: We want cleaner player name labels, and to move
the touchtip from screen-space into node-space.
- #7020: This bug requires NodeCore to maintain a workaround for
the engine in its own code.
- Publicity and player content:
- Help spread NodeCore! Share your experiences, screenshots,
videos and streams!
- Let the developers know if you have shared something about
NodeCore, or would like guidance creating something to share.
- Player model enhancements
- Check that UV maps are consistent with existing skins,
e.g. MTG Sam or MC Steve, for TP authors to more easily
adapt existing skins.
- Improved versions of any art assets (sounds, textures).
- All textures for base inclusion should be 16x (keep
high-def textures to texture packs).
- It must be practical to maintain a consistent style for
other assets, including future related ones.
- Animated fluid textures (especially both stationary and
flowing water) would be especially appreciated.
- Help maintaining the hint system.
- Development of hints often lags behind development of new
features, sometimes significantly.
- Hint organization and content is subject to improvement.
........................................................................
========================================================================

31
docs/design.txt Normal file
View File

@ -0,0 +1,31 @@
========================================================================
CORE DESIGN PRINCIPLES
------------------------------------------------------------------------
- Do as much in node-space in the world as possible.
- Minimize use of off-grid entities.
- Avoid encapsulating things in inventories, machines, GUIs.
- Crafting and transforming in-world.
- Minimal set of primitive composable functions.
- Each node should do one job (or one part of a job).
- Only include the most primitive, fungible components.
- Avoid redundant functionality, include fewest possible
different elements.
- Complex emergent gameplay by combining simple nodes.
- Challenging and constrained gameplay.
- Limited inventories, very restricted item storage, e.g. one
stack per node.
- Large, complex machines to design and build for resource
transformations.
- Subtle environmental hazards, like deadfalls and pestilence.
- Rich, subtle interactions.
- Digging, placing, punching and battering.
- Different effects from different tools (including empty hand).
- Different faces of node may have different effects.
- Focus on puzzle-oriented single-player/cooperative gameplay.
- Avoid dependence on action, combat, PvP.
- Slow-moving hazards, players have a chance to think and plan.
- Acessible for slow reflexes, slow networks, mobile devices.
........................................................................
========================================================================

57
docs/icebox.txt Normal file
View File

@ -0,0 +1,57 @@
========================================================================
ICEBOX: Low-Priority Ideas
------------------------------------------------------------------------
#### ##### #### # # ###### ##### ####
# # # # # # # # # # #
#### # # # # # # ##### # # ####
# ##### # # # # # ##### #
# # # # # # # # # # # #
#### # #### # ###### ###### # # ####
- Release an official beta pack/edition.
- Modpack of experimental features vs. alternate game by branch?
- Flammable/igniter ABM should be reversed, so we scan over few igniters
instead of many flammables?
- Wandering fluids API for concrete, glass?
- AStMs: Active Stack Modifiers.
- Operate on all visinv nodes.
- Possibly operate on player inventories?
- Make separate walkable/non-walkable stack nodes.
- Should sticks and eggcorns be non-walkable?
- Code Quality.
- Scripts to validate dependency graph.
- Tag deps directly in code at place of use.
- Auto-generate mod.conf / depends.txt
- Scripts for automatic metapackage mods?
- Git hooks (and git hook setup scripts)?
- API Cleanup
- Utils
- Box mueller (and repeated box mueller sum) and exporand
- Break up the nc_api monstrosity.
- nc_api_base to create _G.nodecore and include for all.
- nc_api metamod that just depends on ALL other api's.
- nc_all metamod for 3rd party mod authors...?
- Heat API
- Unified heating/cooling number from env.
- Proper API for burning up items
- on_burn? burns_to?
- Unify heat transformations into recipe system with
cooking recipes?
- Unify nc_items and visinv API.
- Stack nodes are "special", get first-class support.
- Make neighbor/distance calcs consistent.
- We're using scan_flood in some places, face checks in others,
and find_nodes_in_area (cuboid) in others.
- Diamond shape would be most consistent.
- Should require face touching, not diagonal.
........................................................................
========================================================================

37
docs/issues.txt Normal file
View File

@ -0,0 +1,37 @@
========================================================================
ISSUES: Bugs, Cleanup and Refinements
------------------------------------------------------------------------
#### ##### #### # # ###### ##### ####
# # # # # # # # # # #
#### # # # # # # ##### # # ####
# ##### # # # # # ##### #
# # # # # # # # # # # #
#### # #### # ###### ###### # # ####
- Design principles doc is badly out of date, needs to reflect lessons
learned and things observed about where the game is headed.
- Less cumbersome scaling controls.
- Use loitering or staring, or some other passive input
instead of a pummel recipe.
- Should hopefully make the process feel more natural.
- Need multiple handholds (i.e. ceil+wall version) since
player no longer picks the surface.
- With no death/respawn, and no fast-travel, we need to
buff player movement to balance that out.
- Hint system updates.
- Need a "witness" system for spontaneous in-world processes,
such as tree growth or lode cooling. Credit players within
a certain distance and line-of-sight.
- Feedback/issues URL?
- Look for new URL buttons in 5.0+
- Reinstate and update toolbelt once engine PR #8701 is released
- Alternative item strategy with dedicated slots for each
inventory space, which can be empty if in hand instead.
- Consider a "backpack" approach as opposed to toolbelt.
........................................................................
========================================================================

175
docs/roadmap.txt Normal file
View File

@ -0,0 +1,175 @@
========================================================================
ROADMAP: Large New Development Projects
------------------------------------------------------------------------
#### ##### #### # # ###### ##### ####
# # # # # # # # # # #
#### # # # # # # ##### # # ####
# ##### # # # # # ##### #
# # # # # # # # # # # #
#### # #### # ###### ###### # # ####
- Split this doc into "core gameplay" and "side quest" forks?
- Lux Ore
- Reconsider mapgen depth; push downwards?
- Players accumulate radiation.
- Player health API to allow registering multiple reasons
for player health loss (injury, radiation)
- Radiation fades, washes off faster with water.
- Stacks also radioactive. Tools too but less so.
- Infuse other materials
- Infuse clear glass to make "smoked" glass.
- Does not transmit light.
- See-thru only from one side.
- Infuse chromatic glass to make piezo glass.
- Step on it or punch it to emit light.
- Button/touchplate for optics.
- Trees/logs.
- Tree trunks as falling nodes, dig as logs.
- Logs as non-falling nodes, facedir.
- Sand renewability.
- Dirt turns to sand if left near water.
- Stronger near more water.
- Stronger near flowing water.
- Torches
- Burning nodes with ash parts, to display torch lifetime
- Create a "strike-anywhere match" by adding other
materials (sand, and something to react with like
gravel or lux infusion) to instantly light on
punching a solid enough surface.
- Advanced Tools
- Sickle / kopesh, choppy + snappy, recursive harvesting.
- Mop/broom for mass stack pickup.
- Sponge on a staff for a mop, thatch on a staff for broom.
- Broom recipe feels more right, but requires more work...
- Tinted glass: can see thru only one way and not others, does not
transmit light? Infuse non-chromatic glass w/ lux?
- Player knockback coming in 5.1+?
- Allow players to push others around by punching?
- Use for door conveyors?
- Doors
- Automation via laser ablation propulsion.
- Some materials cannot be operated by hand?
- Stirling engine using light gradient?
- Water or steam for rotary power?
- Arrangements to auto-return if propulsion removed?
- Push fluids, falling_nodes, items, ents as appropriate?
- Also move items sitting atop?
- Use as press for quick packing recipes?
- Domain Wall Sensor
- Adapt from sztest?
- Field Generator?
- Power an annealed lode block from 2 opposite faces.
- Generates particle effect at mapblock boundary.
- Thatch
- Collect grass and dry in sun, or pummel sticks into wood fiber.
- Nodes that reduce fall damage, decorative for building.
- Brushes for painting, writing system.
- Broom to sweep scattered item stacks together.
- Water and lava surface springs.
- Access to water for forges.
- Access to lava for lighting, firestarting, glass?
- Lava quenching, new material?
- Lurk Ore
- Moves freely among air-exposed stone while no player is looking.
- Follows after player, attempting to cause harm.
- Weakens nodes above/below player into falling nodes,
e.g. loose cobble, gravel?
- Steals items from player, drops onto ground or absorbs them
into body? Saps tool durability?
- Ignites flammables it passes by?
- Downgrades or absorbs ores nearby by contact or air floodfill?
- Creates illusionary nodes you can fall through?
- Cannot be dug or damaged directly.
- Digging it yields plain stone, but converts up to 2
surrounding stone nodes into Lurk.
- Need to dig all around it so it cannot move, then apply Some
time-integrated process to convert it to useful form.
- Threats
- Visceral
- Flammable/toxic gas?
- Monsters: stone-lurkers, mimics.
- Lightning, meteor strikes?
- Creeping
- Cellular automata hazards.
- From exploration, delving too deep, leaving things to rot, etc.
- Blights, Fungi
- Social features
- Randomize player appearance/colors.
- Shirt/pants, possibly w/ stripes/patterns
- Skin color, hair color, eye color?
- Add more holiday outfits.
- Track server lag in metadata?
- New writing system based on charcoal
- Draw a symbol on surfaces by pummeling w/ charcoal
- ...or maybe make ink from coal+water, use a brush?
- Punch symbol w/ charcoal to rotate thru alphabet
- Use a special/reduced alphabet?
- Smoked glass
- Lux-infuse clear glass.
- Does not transmit light.
- See thru only in one direction.
- Useful for hidden bases.
- Digital logic + lighting via optics.
- Piezo Crystal Node
- Emits light briefly when punched or stepped on
- Need to interpolate player paths for "stepped on" logic
- Lux-infused chromatic glass?
- Pistons or rack&pinions for affecting world stuff.
- Laser ablation propulsion
- Gray code absolute game time to determine distance (logarithmic by load)
- Advanced optics?
- Polarization? Phase? Interference and superposition?
- Rotary power?
- Stirling engine?
- Rotors?
- Conveyors?
- Steam as a classic fluid?
- New materials to craft with.
- Dungeon materials, stonework?
- Decorations for dungeons
- Tree sap from stumps? Resin? Rubber? Shellac?
- Small plants? Reeds? Mallows?
- Sea stars, anenome, coral, other underwater things?
- Fungi, esp. tree-destroying ones, blight?
- Oil, natural gas? Fossils and fossil fuels?
- Geode, hydra crystals, radioactives?
- Shipwrecks or alien tech
- Slow-moving animals? Snails? Miniature spice worms?
- Non-portable things, like "spawners" or wormholes
- Tubers and taproots, cacti, and other "defensive" plantlife
- Plant-like CA animals, like bee nests and clouds of bees?
Termine mounds? Ant colonies? Coral?
- Popeggcorn?
- Ores that smelt via heating and then rapid quenching?
- System for transporting cargo.
- Trains of minecarts?
- Conveyors, elevators?
- Vary player walking speed based on nodes under feet?
- Use gravity vector to make flowing water push the player?
........................................................................
========================================================================

8
docs/screenshot-world/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
auth.*
env_meta.*
force_loaded.*
ipban.*
mod_storage
players.*
players
world.mt

View File

@ -0,0 +1,3 @@
clean:
lua5.1 mapclean.lua | sqlite3 map.sqlite
cp world.mt.dist world.mt

Binary file not shown.

View File

@ -0,0 +1,202 @@
mgv7_np_ridge = {
lacunarity = 2
persistence = 0.75
octaves = 4
offset = 0
scale = 1
flags = defaults
spread = (100,100,100)
seed = 6467
}
mgv7_np_mountain = {
lacunarity = 2
persistence = 0.63
octaves = 5
offset = -0.6
scale = 1
flags = defaults
spread = (250,350,250)
seed = 5333
}
mgv7_np_float_base_height = {
lacunarity = 2
persistence = 0.7
octaves = 4
offset = 48
scale = 24
flags = defaults
spread = (300,300,300)
seed = 907
}
mgv7_np_ridge_uwater = {
lacunarity = 2
persistence = 0.6
octaves = 5
offset = 0
scale = 1
flags = defaults
spread = (1000,1000,1000)
seed = 85039
}
mgv7_np_mount_height = {
lacunarity = 2
persistence = 0.6
octaves = 3
offset = 256
scale = 112
flags = defaults
spread = (1000,1000,1000)
seed = 72449
}
mgv7_np_filler_depth = {
lacunarity = 2
persistence = 0.7
octaves = 3
offset = 0
scale = 1.2
flags = defaults
spread = (150,150,150)
seed = 261
}
mgv7_np_height_select = {
lacunarity = 2
persistence = 0.7
octaves = 6
offset = -8
scale = 16
flags = defaults
spread = (500,500,500)
seed = 4213
}
mgv7_dungeon_ymax = 31000
mgv7_dungeon_ymin = -31000
mgv7_cavern_threshold = 0.7
mg_flags = caves, dungeons, light, decorations, biomes
seed = 14531853857515683775
mgv7_np_cave1 = {
lacunarity = 2
persistence = 0.5
octaves = 3
offset = 0
scale = 12
flags = defaults
spread = (61,61,61)
seed = 52534
}
mg_biome_np_humidity = {
lacunarity = 2
persistence = 0.5
octaves = 3
offset = 50
scale = 50
flags = defaults
spread = (1000,1000,1000)
seed = 842
}
mg_biome_np_humidity_blend = {
lacunarity = 2
persistence = 1
octaves = 2
offset = 0
scale = 1.5
flags = defaults
spread = (8,8,8)
seed = 90003
}
mgv7_float_mount_exponent = 0.75
mgv7_np_terrain_persist = {
lacunarity = 2
persistence = 0.6
octaves = 3
offset = 0.6
scale = 0.1
flags = defaults
spread = (2000,2000,2000)
seed = 539
}
mg_name = v7
mgv7_np_cave2 = {
lacunarity = 2
persistence = 0.5
octaves = 3
offset = 0
scale = 12
flags = defaults
spread = (67,67,67)
seed = 10325
}
water_level = 1
mg_biome_np_heat_blend = {
lacunarity = 2
persistence = 1
octaves = 2
offset = 0
scale = 1.5
flags = defaults
spread = (8,8,8)
seed = 13
}
mgv7_cavern_limit = -256
mgv7_cavern_taper = 256
mgv7_np_cavern = {
lacunarity = 2
persistence = 0.63
octaves = 5
offset = 0
scale = 1
flags = defaults
spread = (384,128,384)
seed = 723
}
mgv7_np_floatland_base = {
lacunarity = 2
persistence = 0.6
octaves = 5
offset = -0.6
scale = 1.5
flags = defaults
spread = (600,600,600)
seed = 114
}
mg_biome_np_heat = {
lacunarity = 2
persistence = 0.5
octaves = 3
offset = 50
scale = 50
flags = defaults
spread = (1000,1000,1000)
seed = 5349
}
chunksize = 5
mapgen_limit = 31000
mgv7_np_terrain_alt = {
lacunarity = 2
persistence = 0.6
octaves = 5
offset = 4
scale = 25
flags = defaults
spread = (600,600,600)
seed = 5934
}
mgv7_mount_zero_level = 0
mgv7_spflags = mountains, ridges, nofloatlands, caverns
mgv7_large_cave_depth = -33
mgv7_float_mount_height = 128
mgv7_float_mount_density = 0.6
mgv7_cave_width = 0.09
mgv7_lava_depth = -256
mgv7_floatland_level = 1280
mgv7_np_terrain_base = {
lacunarity = 2
persistence = 0.6
octaves = 5
offset = 4
scale = 70
flags = defaults
spread = (600,600,600)
seed = 82341
}
mgv7_shadow_limit = 1024
[end_of_params]

View File

@ -0,0 +1,44 @@
-- LUALOCALS < ---------------------------------------------------------
local math, pairs, table
= math, pairs, table
local math_ceil, math_floor, table_concat, table_sort
= math.ceil, math.floor, table.concat, table.sort
-- LUALOCALS > ---------------------------------------------------------
local min = {
x = -192,
y = -16,
z = -192
}
local max = {
x = 64,
y = 32,
z = -64
}
for k, v in pairs(min) do min[k] = math_floor(v / 80) * 5 end
for k, v in pairs(max) do max[k] = math_ceil(v / 80) * 5 end
local t = {}
for x = min.x, max.x do
for y = min.y, max.y do
for z = min.z, max.z do
t[#t + 1] = x + 4096 * y + 16777216 * z
end
end
end
table_sort(t)
print("create table if not exists keep(id integer primary key);")
print("begin transaction;")
for s = 1, #t, 100 do
local e = s + 99
if e > #t then e = #t end
local u = {}
for i = s, e do u[#u + 1] = t[i] end
print("insert into keep(id) values(" .. table_concat(u, "),(") .. ");")
end
print("commit;")
print("delete from blocks where pos not in (select distinct id from keep);")
print("drop table keep;")
print("vacuum;")

View File

@ -0,0 +1,3 @@
gameid = nodecore
backend = sqlite3
load_mod_nc_reative = true

View File

@ -0,0 +1,23 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest
= minetest
-- LUALOCALS > ---------------------------------------------------------
minetest.settings:set("time_speed", 0)
minetest.after(0, function() minetest.set_timeofday(0.5) end)
local function setup(p)
local n = p:get_player_name()
local v = minetest.get_player_privs(n)
v.fly = true
v.fast = true
v.give = true
v.interact = true
v.nc_reative = true
minetest.set_player_privs(n, v)
p:set_pos({x = -113, y = 5, z = -93})
end
minetest.register_on_joinplayer(setup)
minetest.register_on_respawnplayer(setup)

2
game.conf Normal file
View File

@ -0,0 +1,2 @@
name = NodeCore Skyblock
description = Skyblock version of an original, immersive puzzle/adventure game with NO popup GUIs, minimal HUDs.

BIN
menu/background.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

BIN
menu/header.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
menu/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

227
menu/src/header.svg Normal file
View File

@ -0,0 +1,227 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="625.26715mm"
height="134.6713mm"
viewBox="0 0 1000.4274 215.47406"
version="1.1"
id="svg8"
sodipodi:docname="header.svg"
inkscape:version="0.92.1 r15371"
inkscape:export-filename="header.png"
inkscape:export-xdpi="41.599998"
inkscape:export-ydpi="41.599998">
<defs
id="defs2">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="16.93333 : 181.96188 : 1"
inkscape:vp_y="140.18095 : 489.6094 : 1"
inkscape:vp_z="328.74288 : 169.26187 : 1"
inkscape:persp3d-origin="168 : 158.39997 : 1"
id="perspective4485" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.175"
inkscape:cx="1208.5144"
inkscape:cy="234.92333"
inkscape:document-units="mm"
inkscape:current-layer="g4676"
showgrid="false"
inkscape:snap-bbox="true"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-global="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:pagecheckerboard="true"
scale-x="1.6" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(235.51666,155.09466)">
<g
id="g4676"
transform="matrix(0.94952391,0,0,0.94978823,1.2397197,8.6363235)"
style="stroke-width:1.05301285">
<g
style="stroke:#ffffff;stroke-width:25.27230644;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g4657-5">
<path
sodipodi:type="star"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:25.27230644;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
id="path4515-5-48"
sodipodi:sides="6"
sodipodi:cx="28.273651"
sodipodi:cy="-58.95414"
sodipodi:r1="64.224815"
sodipodi:r2="55.620323"
sodipodi:arg1="-1.5707963"
sodipodi:arg2="-1.0471976"
inkscape:flatsided="true"
inkscape:rounded="0"
inkscape:randomized="0"
d="m 28.273653,-123.17896 55.620321,32.112414 -2e-6,64.224815 -55.620323,32.1124067 -55.62032,-32.1124097 1e-6,-64.224815 z"
inkscape:transform-center-x="1.0101525e-06"
inkscape:transform-center-y="-1.3577723e-06" />
<path
inkscape:connector-curvature="0"
id="path4516-1"
d="M 117.65593,-123.1792 V 5.270433 l 55.62032,-32.11241 v -64.224817 z"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:25.27230644;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
<path
sodipodi:nodetypes="cccccc"
inkscape:connector-curvature="0"
d="m 262.65853,-58.923867 h -55.24781 m 55.24781,-64.224813 -55.62032,32.112404 v 64.224819 l 55.62032,32.1124099"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:25.27230644;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
id="path4520-2" />
<path
sodipodi:nodetypes="cccccc"
inkscape:connector-curvature="0"
id="path4515-5-4-8"
d="M 467.57949,-9.732521 382.02998,39.489085 296.48047,-9.7325256 V -108.17574 l 85.54951,-49.22163 85.54952,49.22163"
inkscape:transform-center-y="-5.1205033e-06"
inkscape:transform-center-x="1.5537137e-06"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:25.27230644;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
<path
sodipodi:type="star"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:25.27230644;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
id="path4515-5-0-9"
sodipodi:sides="6"
sodipodi:cx="557.01379"
sodipodi:cy="-58.95414"
sodipodi:r1="64.224815"
sodipodi:r2="55.620323"
sodipodi:arg1="-1.5707963"
sodipodi:arg2="-1.0471976"
inkscape:flatsided="true"
inkscape:rounded="0"
inkscape:randomized="0"
d="m 557.0138,-123.17896 55.62032,32.112414 -1e-5,64.224815 -55.62032,32.1124067 -55.62032,-32.1124097 0,-64.224815 z"
inkscape:transform-center-x="1.0101525e-06"
inkscape:transform-center-y="-1.3577723e-06" />
<path
inkscape:connector-curvature="0"
id="path4554-3"
d="M 646.39652,5.2704448 V -123.1792 l 55.62032,32.112413 -55.62032,32.112412 55.62032,32.11241"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:25.27230644;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
<path
sodipodi:nodetypes="cccccc"
inkscape:connector-curvature="0"
d="m 791.45113,-58.923867 h -55.1483 m 55.1483,-64.224813 -55.62032,32.112402 v 64.224822 l 55.62032,32.1124089"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:25.27230644;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
id="path4520-5-6" />
<path
sodipodi:nodetypes="cccccc"
inkscape:connector-curvature="0"
id="path4515-8"
d="m -148.90733,-159.66051 87.798708,50.35319 -9e-6,100.7063678 L -236.70605,-109.30733 V -8.6009522 l 87.79871,50.3531812"
inkscape:transform-center-y="-3.6452217e-06"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:25.27230644;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
</g>
<g
id="g4657">
<path
sodipodi:type="star"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.42410278;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
id="path4515-5"
sodipodi:sides="6"
sodipodi:cx="28.273651"
sodipodi:cy="-58.95414"
sodipodi:r1="64.224815"
sodipodi:r2="55.620323"
sodipodi:arg1="-1.5707963"
sodipodi:arg2="-1.0471976"
inkscape:flatsided="true"
inkscape:rounded="0"
inkscape:randomized="0"
d="m 28.273653,-123.17896 55.620321,32.112414 -2e-6,64.224815 -55.620323,32.1124067 -55.62032,-32.1124097 1e-6,-64.224815 z"
inkscape:transform-center-x="1.0101525e-06"
inkscape:transform-center-y="-1.3577723e-06" />
<path
inkscape:connector-curvature="0"
id="path4516"
d="M 117.65593,-123.1792 V 5.270433 l 55.62032,-32.11241 v -64.224817 z"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.42410278;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
<path
sodipodi:nodetypes="cccccc"
inkscape:connector-curvature="0"
d="m 262.65853,-58.923867 h -55.24781 m 55.24781,-64.224813 -55.62032,32.112404 v 64.224819 l 55.62032,32.1124099"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.42410278;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
id="path4520" />
<path
sodipodi:nodetypes="cccccc"
inkscape:connector-curvature="0"
id="path4515-5-4"
d="M 467.57949,-9.732521 382.02998,39.489085 296.48047,-9.7325256 V -108.17574 l 85.54951,-49.22163 85.54952,49.22163"
inkscape:transform-center-y="-5.1205033e-06"
inkscape:transform-center-x="1.5537137e-06"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.42410278;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
<path
sodipodi:type="star"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.42410278;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
id="path4515-5-0"
sodipodi:sides="6"
sodipodi:cx="557.01379"
sodipodi:cy="-58.95414"
sodipodi:r1="64.224815"
sodipodi:r2="55.620323"
sodipodi:arg1="-1.5707963"
sodipodi:arg2="-1.0471976"
inkscape:flatsided="true"
inkscape:rounded="0"
inkscape:randomized="0"
d="m 557.0138,-123.17896 55.62032,32.112414 -1e-5,64.224815 -55.62032,32.1124067 -55.62032,-32.1124097 0,-64.224815 z"
inkscape:transform-center-x="1.0101525e-06"
inkscape:transform-center-y="-1.3577723e-06" />
<path
inkscape:connector-curvature="0"
id="path4554"
d="M 646.39652,5.2704448 V -123.1792 l 55.62032,32.112413 -55.62032,32.112412 55.62032,32.11241"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.42410278;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
<path
sodipodi:nodetypes="cccccc"
inkscape:connector-curvature="0"
d="m 791.45113,-58.923867 h -55.1483 m 55.1483,-64.224813 -55.62032,32.112402 v 64.224822 l 55.62032,32.1124089"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.42410278;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
id="path4520-5" />
<path
sodipodi:nodetypes="cccccc"
inkscape:connector-curvature="0"
id="path4515"
d="m -148.90733,-159.66051 87.798708,50.35319 -9e-6,100.7063678 L -236.70605,-109.30733 V -8.6009522 l 87.79871,50.3531812"
inkscape:transform-center-y="-3.6452217e-06"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.42410278;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

134
menu/src/icon.svg Normal file
View File

@ -0,0 +1,134 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="134.66922mm"
height="134.66922mm"
viewBox="0 0 134.66923 134.66922"
version="1.1"
id="svg8"
sodipodi:docname="icon.svg"
inkscape:version="0.92.1 r15371"
inkscape:export-filename="/home/warr/git/gitlab.com/sztest/nodecore/menu/icon.png"
inkscape:export-xdpi="24.139999"
inkscape:export-ydpi="24.139999">
<defs
id="defs2">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="10.583334 : 113.72616 : 1"
inkscape:vp_y="87.613106 : 306.00588 : 1"
inkscape:vp_z="205.46432 : 105.78866 : 1"
inkscape:persp3d-origin="105.00001 : 98.999985 : 1"
id="perspective4485" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="41.97112"
inkscape:cy="355.38663"
inkscape:document-units="mm"
inkscape:current-layer="g89"
showgrid="false"
inkscape:snap-bbox="true"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-global="false"
fit-margin-top="0"
fit-margin-left="7.730245"
fit-margin-right="7.730245"
fit-margin-bottom="0"
inkscape:pagecheckerboard="true" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-10.038749,-43.6634)">
<g
id="g4676"
transform="matrix(0.94952391,0,0,0.94978823,1.2397197,8.6363235)"
style="stroke-width:1.05301285">
<path
inkscape:transform-center-y="-1.3577723e-06"
inkscape:transform-center-x="1.0101525e-06"
d="m 80.180857,43.548355 55.620323,32.112409 0,64.224816 -55.620327,32.11241 -55.620321,-32.11241 2e-6,-64.224819 z"
inkscape:randomized="0"
inkscape:rounded="0"
inkscape:flatsided="true"
sodipodi:arg2="-1.0471976"
sodipodi:arg1="-1.5707963"
sodipodi:r2="55.620323"
sodipodi:r1="64.224815"
sodipodi:cy="107.77317"
sodipodi:cx="80.180855"
sodipodi:sides="6"
id="path4515-2"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:6.31807709;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
sodipodi:type="star" />
<path
inkscape:transform-center-y="-1.3577723e-06"
inkscape:transform-center-x="1.0101525e-06"
d="m 80.180857,43.548355 55.620323,32.112409 0,64.224816 -55.620327,32.11241 -55.620321,-32.11241 2e-6,-64.224819 z"
inkscape:randomized="0"
inkscape:rounded="0"
inkscape:flatsided="true"
sodipodi:arg2="-1.0471976"
sodipodi:arg1="-1.5707963"
sodipodi:r2="55.620323"
sodipodi:r1="64.224815"
sodipodi:cy="107.77317"
sodipodi:cx="80.180855"
sodipodi:sides="6"
id="path4515"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.1060257;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
sodipodi:type="star" />
<path
inkscape:connector-curvature="0"
d="m 80.180857,43.548355 -10e-7,64.224815 m -55.620324,32.11241 55.620323,-32.11241 55.620325,32.11241"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.1060257;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
id="path4515-7" />
</g>
<g
id="g89"
transform="translate(-2.5234665,-44.723556)">
<path
sodipodi:nodetypes="cccccc"
inkscape:connector-curvature="0"
id="path4515-8"
d="m 79.896826,95.940486 52.104364,29.890544 -1e-5,59.78108 -104.20872,-59.78109 v 59.78109 l 52.104361,29.89054"
inkscape:transform-center-y="-3.6452217e-06"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
<path
sodipodi:nodetypes="cccccc"
inkscape:connector-curvature="0"
id="path4515-3"
d="m 79.896826,95.940486 52.104364,29.890544 -1e-5,59.78108 -104.20872,-59.78109 v 59.78109 l 52.104361,29.89054"
inkscape:transform-center-y="-3.6452217e-06"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
menu/src/icon.xcf Normal file

Binary file not shown.

View File

@ -0,0 +1,41 @@
-- LUALOCALS < ---------------------------------------------------------
local math, minetest, nodecore, pairs
= math, minetest, nodecore, pairs
local math_ceil, math_floor, math_random
= math.ceil, math.floor, math.random
-- LUALOCALS > ---------------------------------------------------------
function nodecore.digparticles(nodedef, partdef)
if partdef.forcetexture then
partdef.texture = partdef.forcetexture
local id = minetest.add_particlespawner(partdef)
return function() minetest.delete_particlespawner(id) end
end
local img = {}
if nodedef.tiles then
for i = 1, 6 do
img[#img + 1] = nodedef.tiles[i > #nodedef.tiles and #nodedef.tiles or i]
end
elseif nodedef.inventory_image then
img[1] = nodedef.inventory_image
end
if #img < 1 then return minetest.log("no pummel tile images found!") end
img = nodecore.pickrand(img)
if img.name then img = img.name end
partdef.amount = partdef.amount and math_ceil(partdef.amount / 4) or 4
local t = {}
for _ = 1, 4 do
partdef.texture = img .. "^[mask:[combine\\:16x16\\:"
.. math_floor(math_random() * 12) .. ","
.. math_floor(math_random() * 12) .. "=nc_api_pummel.png"
t[#t + 1] = minetest.add_particlespawner(partdef)
end
return function()
for _, v in pairs(t) do
minetest.delete_particlespawner(v)
end
end
end

76
mods/nc_api/init.lua Normal file
View File

@ -0,0 +1,76 @@
-- LUALOCALS < ---------------------------------------------------------
-- SKIP: include nodecore
local dofile, error, minetest, pairs, rawget, rawset, setmetatable,
table, type
= dofile, error, minetest, pairs, rawget, rawset, setmetatable,
table, type
local table_concat, table_insert
= table.concat, table.insert
-- LUALOCALS > ---------------------------------------------------------
local nodecore = rawget(_G, "nodecore") or {}
rawset(_G, "nodecore", nodecore)
local include = rawget(_G, "include") or function(...)
local parts = {...}
table_insert(parts, 1, minetest.get_modpath(minetest.get_current_modname()))
if parts[#parts]:sub(-4) ~= ".lua" then
parts[#parts] = parts[#parts] .. ".lua"
end
return dofile(table_concat(parts, "/"))
end
rawset(_G, "include", include)
nodecore.product = "NodeCore Skyblock"
nodecore.version = include("version")
local function callguard(n, t, k, v)
if type(v) ~= "function" then return v end
return function(first, ...)
if first == t then
error("called " .. n .. ":" .. k .. "() instead of " .. n .. "." .. k .. "()")
end
return v(first, ...)
end
end
for k, v in pairs(minetest) do
minetest[k] = callguard("minetest", minetest, k, v)
end
setmetatable(nodecore, {
__newindex = function(t, k, v)
rawset(nodecore, k, callguard("nodecore", t, k, v))
end
})
include("issue7020")
include("util_misc")
include("util_falling")
include("util_scan_flood")
include("util_node_is")
include("util_toolcaps")
include("util_stack")
include("util_phealth")
include("util_facedir")
include("util_sound")
include("util_translate")
include("util_ezschematic")
include("match")
include("fx_digparticles")
include("register_limited_abm")
include("register_soaking_abm")
include("register_ambiance")
include("register_mods")
include("mapgen_shared")
include("item_on_register")
include("item_drop_in_place")
include("item_falling_repose")
include("item_alternate_loose")
include("item_group_visinv")
include("item_oldnames")
include("item_tool_wears_to")
include("item_tool_sounds")
include("item_punch_sounds")

22
mods/nc_api/issue7020.lua Normal file
View File

@ -0,0 +1,22 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, pairs, setmetatable, type
= minetest, pairs, setmetatable, type
-- LUALOCALS > ---------------------------------------------------------
local bifn = minetest.registered_entities["__builtin:falling_node"]
local falling = {
set_node = function(self, node, meta, ...)
meta = meta or {}
if type(meta) ~= "table" then meta = meta:to_table() end
for _, v1 in pairs(meta.inventory or {}) do
for k2, v2 in pairs(v1) do
if type(v2) == "userdata" then
v1[k2] = v2:to_string()
end
end
end
return bifn.set_node(self, node, meta, ...)
end
}
setmetatable(falling, bifn)
minetest.register_entity(":__builtin:falling_node", falling)

View File

@ -0,0 +1,109 @@
-- LUALOCALS < ---------------------------------------------------------
local math, minetest, nodecore, pairs, type
= math, minetest, nodecore, pairs, type
local math_pow
= math.pow
-- LUALOCALS > ---------------------------------------------------------
--[[
Nodes that have an "alternate_loose = { ... }" definition when
registered will be registered as a pair, one being the "loose" version
and the other being the normal "solid" one. Solid-specific attributes
can be set via "alternate_solid = { ... }". The solid version will
transform to the loose one when dug, and the loose to solid when
pummeled.
--]]
local looseimg = "^nc_api_loose.png"
nodecore.register_on_register_item(function(name, def)
if def.type ~= "node" then return end
local loose = def.alternate_loose
if not loose then return end
if not loose.tiles then
loose.tiles = nodecore.underride({}, def.tiles)
for k, v in pairs(loose.tiles) do
if type(v) == "string" then
loose.tiles[k] = v .. looseimg
elseif type(v) == "table" then
loose.tiles[k] = nodecore.underride({
name = v.name .. looseimg
}, v)
end
end
end
nodecore.underride(loose, def)
loose.name = name .. "_loose"
if loose.oldnames then
for k, v in pairs(loose.oldnames) do
loose.oldnames[k] = v .. "_loose"
end
end
loose.description = "Loose " .. loose.description
loose.groups = nodecore.underride({}, loose.groups or {})
loose.groups.falling_node = 1
loose.groups.loose_repack = 1
if loose.groups.crumbly and not loose.no_repack then
minetest.after(0, function()
nodecore.register_craft({
label = "repack " .. loose.name,
action = "pummel",
nodes = {
{match = loose.name, replace = name}
},
toolgroups = {thumpy = loose.repack_level or 1},
})
end)
end
loose.alternate_loose = nil
loose.alternate_solid = nil
loose.repack_to = name
minetest.register_node(loose.name, loose)
local solid = nodecore.underride(def.alternate_solid or {}, def)
solid.drop_in_place = solid.drop_in_place or loose.name
solid.alternate_loose = nil
solid.alternate_solid = nil
minetest.register_node(name, solid)
return true
end)
nodecore.register_soaking_abm({
label = "loose self-repacking",
nodenames = {"group:loose_repack"},
interval = 10,
chance = 1,
limited_max = 100,
limited_alert = 1000,
soakrate = function(pos, node)
local bnode = minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z})
local bdef = minetest.registered_items[bnode.name] or {}
if (not bdef.groups) or bdef.groups.falling_node then return false end
local weight = 1
for dy = 1, 8 do
local n = minetest.get_node({x = pos.x, y = pos.y + dy, z = pos.z})
local def = minetest.registered_items[n.name] or {}
if def and def.groups and def.groups.falling_node then
local w = def.crush_damage or 1
if w < 1 then w = 1 end
weight = weight + w
end
end
local def = minetest.registered_items[node.name] or {}
return weight * 2 / math_pow(2, def.repack_level or 1)
end,
soakcheck = function(data, pos, node)
if data.total < 100 then return end
local def = minetest.registered_items[node.name] or {}
return minetest.set_node(pos, {name = def.repack_to})
end
})

View File

@ -0,0 +1,38 @@
-- LUALOCALS < ---------------------------------------------------------
local ItemStack, minetest, nodecore, pairs, type
= ItemStack, minetest, nodecore, pairs, type
-- LUALOCALS > ---------------------------------------------------------
--[[
Nodes with a "drop_in_place" spec transform on node drop by dropping
into place of existing node instead of digger inventory.
--]]
nodecore.register_on_register_item(function(_, def)
if def.type ~= "node" then return end
local dip = def.drop_in_place
if dip then
if type(dip) ~= "table" then dip = {name = dip} end
def.drop = def.drop or ""
def.node_dig_prediction = def.node_dig_prediction or dip.name
local st = def.silktouch
if st == nil then
st = {}
for k, v in pairs(def.groups or {}) do
st[k] = v + 5
end
end
def.after_dig_node = def.after_dig_node or function(pos, node, _, digger)
if st and digger and nodecore.toolspeed(
digger:get_wielded_item(), st) then
local stack = ItemStack(node.name)
stack = digger:get_inventory():add_item("main",
stack:to_string())
if stack:is_empty() then return end
do return nodecore.item_eject(pos, stack) end
end
dip.param2 = node.param2
minetest.set_node(pos, dip)
end
end
end)

View File

@ -0,0 +1,109 @@
-- LUALOCALS < ---------------------------------------------------------
local math, minetest, nodecore, pairs
= math, minetest, nodecore, pairs
local math_random
= math.random
-- LUALOCALS > ---------------------------------------------------------
--[[
Nodes with the "falling_repose" group will not only fall if unsupported
from below, but if there is a sufficient drop off the sides, so simulate
an "angle of repose."
--]]
function nodecore.falling_repose_drop(posfrom, posto, node)
minetest.spawn_falling_node(posto, node, minetest.get_meta(posfrom))
minetest.remove_node(posfrom)
posfrom.y = posfrom.y + 1
return nodecore.fallcheck(posfrom)
end
nodecore.register_on_register_item(function(_, def)
if def.type ~= "node" then return end
def.groups = def.groups or {}
if def.groups.falling_repose then def.groups.falling_node = 1 end
def.repose_drop = def.repose_drop or nodecore.falling_repose_drop
end)
function minetest.spawn_falling_node(pos, node, meta)
node = node or minetest.get_node(pos)
if node.name == "air" or node.name == "ignore" then
return false
end
local obj = minetest.add_entity(pos, "__builtin:falling_node")
if obj then
obj:get_luaentity():set_node(node, meta or minetest.get_meta(pos):to_table())
minetest.remove_node(pos)
return true
end
return false
end
local function check_empty(pos, dx, dy, dz)
for ndy = dy, 1 do
local p = {x = pos.x + dx, y = pos.y + ndy, z = pos.z + dz}
if not nodecore.buildable_to(p) then return end
end
return {x = pos.x + dx, y = pos.y, z = pos.z + dz}
end
function nodecore.falling_repose_check(pos)
if minetest.check_single_for_falling(pos) then return end
local node = minetest.get_node(pos)
local def = minetest.registered_items[node.name] or {}
local repose = def.groups and def.groups.falling_repose
if not repose then return end
-- Reposing nodes can always sit comfortably atop
-- a non-moving node; it's only when stacked on other
-- falling nodes that they can slip off.
local sitdef = minetest.registered_items[minetest.get_node(
{x = pos.x, y = pos.y - 1, z = pos.z}).name]
if not (sitdef and sitdef.groups and sitdef.groups.falling_node)
then return end
local open = {}
local ok = check_empty(pos, 1, -repose, 0)
if ok then open[1] = ok end
ok = check_empty(pos, -1, -repose, 0)
if ok then open[#open + 1] = ok end
ok = check_empty(pos, 0, -repose, 1)
if ok then open[#open + 1] = ok end
ok = check_empty(pos, 0, -repose, -1)
if ok then open[#open + 1] = ok end
if #open < 1 then return end
return def.repose_drop(pos, open[math_random(1, #open)], node)
end
local reposeq
local qqty
local qmax = 100
local function reposeall()
for _, v in pairs(reposeq) do v() end
reposeq = nil
qqty = nil
end
nodecore.register_limited_abm({
label = "Falling Repose",
nodenames = {"group:falling_repose"},
neighbors = {"air"},
interval = 2,
chance = 5,
action = function(pos)
if not reposeq then
reposeq = {}
qqty = 0
minetest.after(0, reposeall)
end
local f = function() nodecore.falling_repose_check(pos) end
if #reposeq > qmax then
local i = math_random(1, qqty)
if i < qmax then reposeq[i] = f end
else
reposeq[#reposeq + 1] = f
end
qqty = qqty + 1
end
})

View File

@ -0,0 +1,196 @@
-- LUALOCALS < ---------------------------------------------------------
local ItemStack, math, minetest, nodecore, pairs, setmetatable, type,
vector
= ItemStack, math, minetest, nodecore, pairs, setmetatable, type,
vector
local math_floor, math_pi, math_random, math_sqrt
= math.floor, math.pi, math.random, math.sqrt
-- LUALOCALS > ---------------------------------------------------------
--[[
Helpers for visible inventory. Use "visinv" node group.
Sets up on_construct, after_destruct and an ABM to manage
the visual entities.
--]]
local modname = minetest.get_current_modname()
------------------------------------------------------------------------
-- VISIBLE STACK ENTITY
function nodecore.stackentprops(stack, yaw, rotate)
local props = {
hp_max = 1,
physical = false,
collide_with_objects = false,
collisionbox = {0, 0, 0, 0, 0, 0},
visual = "wielditem",
visual_size = {x = 0.4, y = 0.4 },
textures = {""},
spritediv = {x = 1, y = 1},
initial_sprite_basepos = {x = 0, y = 0},
is_visible = false,
static_save = false
}
local scale = 0
yaw = yaw or 0
if stack then
if type(stack) == "string" then stack = ItemStack(stack) end
props.is_visible = not stack:is_empty()
props.textures[1] = stack:get_name()
local ratio = stack:get_count() / stack:get_stack_max()
scale = math_sqrt(ratio) * 0.15 + 0.25
props.visual_size = {x = scale, y = scale}
props.automatic_rotate = rotate
and rotate * 2 / math_sqrt(math_sqrt(ratio)) or nil
if ratio == 1 then ratio = 1 - (stack:get_wear() / 65536) end
if ratio ~= 1 then yaw = yaw + 1/8 + 3/8 * (1 - ratio) end
yaw = yaw - 2 * math_floor(yaw / 2)
end
return props, scale, yaw * math_pi / 2
end
minetest.register_entity(modname .. ":stackent", {
initial_properties = nodecore.stackentprops(),
is_stack = true,
itemcheck = function(self)
local pos = self.object:get_pos()
local stack = nodecore.stack_get(pos)
if not stack or stack:is_empty() then return self.object:remove() end
local rp = vector.round(pos)
local props, scale, yaw = nodecore.stackentprops(stack,
rp.x * 3 + rp.y * 5 + rp.z * 7)
rp.y = rp.y + scale - 31/64
local obj = self.object
obj:set_properties(props)
obj:set_yaw(yaw)
obj:set_pos(rp)
end,
on_activate = function(self)
self.cktime = 0.00001
end,
on_step = function(self, dtime)
self.cktime = (self.cktime or 0) - dtime
if self.cktime > 0 then return end
self.cktime = 1
return self:itemcheck()
end
})
function nodecore.visinv_update_ents(pos, node)
node = node or minetest.get_node(pos)
local def = minetest.registered_items[node.name] or {}
local max = def.groups and def.groups.visinv and 1 or 0
local found = {}
for _, v in pairs(minetest.get_objects_inside_radius(pos, 0.5)) do
if v and v.get_luaentity and v:get_luaentity()
and v:get_luaentity().is_stack then
found[#found + 1] = v
end
end
if #found < max then
minetest.add_entity(pos, modname .. ":stackent")
else
while #found > max do
found[#found]:remove()
found[#found] = nil
end
end
return found
end
------------------------------------------------------------------------
-- ITEM ENT APPEARANCE
local bii = minetest.registered_entities["__builtin:item"]
local item = {
set_item = function(self, ...)
local realobj = self.object
self.object = {}
setmetatable(self.object, {
__index = {
set_properties = function() end
}
})
bii.set_item(self, ...)
self.object = realobj
self.rotdir = self.rotdir or math_random(1, 2) * 2 - 3
local p, s = nodecore.stackentprops(self.itemstring, 0, self.rotdir)
p.physical = true
s = s / math_sqrt(2)
p.collisionbox = {-s, -s, -s, s, s, s}
return realobj:set_properties(p)
end
}
setmetatable(item, bii)
minetest.register_entity(":__builtin:item", item)
------------------------------------------------------------------------
-- NODE REGISTRATION HELPERS
function nodecore.visinv_on_construct(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size("solo", 1)
nodecore.visinv_update_ents(pos)
end
function nodecore.visinv_after_destruct(pos)
nodecore.visinv_update_ents(pos)
nodecore.fallcheck(pos)
end
nodecore.register_on_register_item(function(_, def)
if def.type ~= "node" then return end
def.groups = def.groups or {}
if def.groups.visinv then
def.on_construct = def.on_construct or nodecore.visinv_on_construct
def.after_destruct = def.after_destruct or nodecore.visinv_after_destruct
end
end)
nodecore.register_limited_abm({
label = "VisInv Check",
nodenames = {"group:visinv"},
interval = 1,
chance = 1,
action = function(...) return nodecore.visinv_update_ents(...) end
})
------------------------------------------------------------------------
-- DIG INVENTORY
local digpos
local old_node_dig = minetest.node_dig
minetest.node_dig = function(pos, ...)
nodecore.stack_sounds(pos, "dug")
local function helper(...)
digpos = nil
return ...
end
digpos = pos
return helper(old_node_dig(pos, ...))
end
local old_get_node_drops = minetest.get_node_drops
minetest.get_node_drops = function(...)
local drops = old_get_node_drops(...)
if not digpos then return drops end
drops = drops or {}
local stack = nodecore.stack_get(digpos)
if stack and not stack:is_empty() then
drops[#drops + 1] = stack
end
return drops
end

View File

@ -0,0 +1,14 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, pairs
= minetest, nodecore, pairs
-- LUALOCALS > ---------------------------------------------------------
nodecore.register_on_register_item(function(name, def)
if def.oldnames then
for _, v in pairs(def.oldnames) do
if not minetest.registered_items[v] then
minetest.register_alias(v, name)
end
end
end
end)

View File

@ -0,0 +1,17 @@
-- LUALOCALS < ---------------------------------------------------------
local ipairs, minetest, nodecore
= ipairs, minetest, nodecore
-- LUALOCALS > ---------------------------------------------------------
nodecore.register_on_register_item,
nodecore.registered_on_register_item
= nodecore.mkreg()
local oldreg = minetest.register_item
function minetest.register_item(name, def, ...)
for _, v in ipairs(nodecore.registered_on_register_item) do
local x = v(name, def, ...)
if x then return x end
end
return oldreg(name, def, ...)
end

View File

@ -0,0 +1,40 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore
= minetest, nodecore
-- LUALOCALS > ---------------------------------------------------------
local lasthit = {}
minetest.register_on_punchnode(function(pos, node, puncher)
if not puncher then return end
local pname = puncher:get_player_name()
local now = minetest.get_us_time() / 1000000
local last = lasthit[pname] or 0
if now - last < 0.25 then return end
lasthit[pname] = now
local def = minetest.registered_items[node.name] or {}
local wield = puncher:get_wielded_item()
if (not def.sounds) or (not def.groups)
or (not nodecore.toolspeed(wield, def.groups)) then
nodecore.node_sound(pos, "dig")
else
nodecore.node_sound(pos, "dig",
{except = puncher})
end
if wield:get_wear() >= (65536 * 0.95) then
minetest.sound_play("nc_api_toolwear",
{object = puncher, gain = 0.5})
end
end)
minetest.register_on_dignode(function(pos, node, digger)
return nodecore.node_sound(pos, "dug",
{node = node, except = digger})
end)
minetest.register_on_placenode(function(pos, node, placer)
return nodecore.node_sound(pos, "place",
{node = node, except = placer})
end)

View File

@ -0,0 +1,11 @@
-- LUALOCALS < ---------------------------------------------------------
local nodecore
= nodecore
-- LUALOCALS > ---------------------------------------------------------
nodecore.register_on_register_item(function(_, def)
if def.type == "tool" then
def.sound = def.sound or {}
def.sound.breaks = def.sound.breaks or {name = "nc_api_toolbreak", gain = 1}
end
end)

View File

@ -0,0 +1,20 @@
-- LUALOCALS < ---------------------------------------------------------
local ItemStack, minetest, nodecore
= ItemStack, minetest, nodecore
-- LUALOCALS > ---------------------------------------------------------
nodecore.register_on_register_item(function(_, def)
if def.tool_wears_to then
def.after_use = def.after_use or function(what, who, _, dp)
what:add_wear(dp.wear)
if what:get_count() == 0 then
if def.sound and def.sound.breaks then
minetest.sound_play(def.sound.breaks,
{object = who, gain = 0.5})
end
return ItemStack(def.tool_wears_to)
end
return what
end
end
end)

View File

@ -0,0 +1,4 @@
# textdomain: nc_api
(C)2018-2019 by Aaron Suen <warr1024@@gmail.com>=(C)2018-2019 から Aaron Suen <warr1024@@gmail.com>
(and 1 more hint)=(さらに1つのヒント)
(and @1 more hints)=(さらに@1つのヒント)

View File

@ -0,0 +1,145 @@
# textdomain: nc_api
(C)2018-2019 by Aaron Suen <warr1024@@gmail.com>=(C)2018-2019 por Aaron Suen <war1024@@gmail.com>
(and 1 more hint)=( e mais 1 dica)
(and @1 more hints)=(e mais @1 dicas)
- Crafting is done by building recipes in-world.=- A Criação de Itens é feita construindo as receitas pelo mundo.
- If a recipe exists, you will see a special particle effect.=- Se uma receita existe, você verá um efeito especial de partícula sair do node.
- Items picked up try to fit into the current selected slot first.=- Os itens pegados são primeiramente armazenados no espaço atualmente selecionado.
- Order and specific face of placement may matter for crafting.=- A ordem e a face em que os itens são colocados pode importar no processo de criação.
- Recipes are time-based, punching faster does not speed up.=- Receitas são cronometradas, bater mais forte não afetará a velocidade delas.
- Sneak+drop to count out single items from stack.=- Use os comandos de agachar e soltar juntos para soltar um só item.
- Some recipes require "pummeling" a node.=- Algumas receitas necessitam que você "esmurre" um node.
- Stacks may be pummeled, exact item count may matter.=- Amontoados de itens podem ser esmurrados, pode ser que precise de uma quantidade exata do item.
- There is NO inventory screen.=- NÃO EXISTE tela de inventário.
- To pummel, punch a node repeatedly, WITHOUT digging.=- Para esmurrar, bata num node repetidamente, SEM QUEBRÁ-LO.
- Wielded item, target face, and surrounding nodes may matter.=- O item segurado, a face do objeto alvo e os nodes ao redor podem importar durante a criação de algo.
- You do not have to punch very fast (about 1 per second).=- Você não precisa bater muito rápido(basta 1 batida por segundo).
About=Sobre
Active Lens=Lente Ativa
Active Prism=Prisma Ativo
Aggregate=Agregar
Air=Ar
Annealed Lode=Veio Mineral Recozido
Annealed Lode Bar=Barra de Veio Mineral Recozida
Annealed Lode Hatchet=Machado de Veio Mineral Recozida
Annealed Lode Hatchet Head=Cabeça de Machado de Veio Mineral Recozida
Annealed Lode Mallet=Marreta de Veio Mineral Recozida
Annealed Lode Mallet Head=Cabeça de Marreta de Veio Mineral Recozida
Annealed Lode Mattock=Enxada de Veio Mineral Recozida
Annealed Lode Mattock Head=Cabeça de Enxada de Veio Mineral Recozida
Annealed Lode Pick=Picareta de Veio Mineral Recozida
Annealed Lode Pick Head=Cabeça de Picareta de Veio Mineral Recozida
Annealed Lode Prill=Lascas de Veio Mineral Recozida
Annealed Lode Rod=Vara de Veio Mineral Recozida
Annealed Lode Spade=Pá de Veio Mineral Recozida
Annealed Lode Spade Head=Cabeça de Pá de Veio Mineral Recozida
Ash=Cinza
Ash Lump=Nódulo de Cinzas
Burning Embers=Brasa Quente
Charcoal=Carvão Vegetal
Charcoal Lump=Nódulo de Carvão Vegetal
Chromatic Glass=Vidro Cromático
Clear Glass=Vidro Transparente
Cobble=Pedregulho
Cobble Hinged Panel=Painel de Pedregulho Articulado
Cobble Panel=Painel de Pedregulho
Crude Glass=Vidro Bruto
DEVELOPMENT VERSION=VERSÃO EM DESENVOLVIMENTO
Dirt=Terra
Eggcorn=Semente de Carvalho
Fire=Fogo
Float Glass=Vidro Float
Glowing Lode=Veio Mineral Incandescente
Glowing Lode Bar=Barra de Veio Mineral Incandescente
Glowing Lode Hatchet=Machado de Veio Mineral Incandescente
Glowing Lode Hatchet Head=Cabeça de Machado Veio Mineral Incandescente
Glowing Lode Mallet=Marreta de Veio Mineral Incandescente
Glowing Lode Mallet Head=Cabeça de Marreta Veio Mineral Incandescente
Glowing Lode Mattock=Enxada de Veio Mineral Incandescente
Glowing Lode Mattock Head=Cabeça de Enxada Veio Mineral Incandescente
Glowing Lode Pick=Picareta de Veio Mineral Incandescente
Glowing Lode Pick Head=Cabeça de Picareta de Veio Mineral Incandescente
Glowing Lode Prill=Lascas de Veio Mineral Incandescente
Glowing Lode Rod=Vara de Veio Mineral Incandescente
Glowing Lode Spade=Pá de Veio Mineral Incandescente
Glowing Lode Spade Head=Cabeça de Pá Veio Mineral Incandescente
Grass=Grama
Gravel=Cascalho
Hints=Dicas
Ignore=Ignorar
Injury=Ferir
Inventory=Inventário
Leaves=Folhas
Lens=Lente
Living Sponge=Esponja Viva
Lode Cobble=Veio de Pedregulho
Lode Ore=Veio Mineral
Loose Cobble=Pedregulho Solta
Loose Dirt=Terra Solta
Loose Gravel=Cascalho Solto
Loose Leaves=Folhas Soltas
Loose Lode Cobble=Veio de Pedregulho Solto
Loose Sand=Areia Solta
Molten Glass=Vidro Derretido
Molten Rock=Pedra Derretida
Player's Guide: Inventory Management=Guia do Jogador: Gerenciamento de Inventário
Player's Guide: Pummeling Recipes=Guia do Jogador: Receitas por Esmurrada
Prism=Prisma
Progress: @1 complete, @2 current, @3 future=Progresso: @1 completo(s), @2 atual(is), @3 futuro(s)
Pummel=Esmurrar
Sand=Areia
See included LICENSE file for full details and credits=Veja o arquivo de LICENSA incluso para créditos e maiores detalhes
Shining Lens=Lente Brilhante
Sponge=Esponja
Staff=Bastão
Stick=Graveto
Stone=Pedra
Stone Chip=Pedaço de Pedra
Stone-Tipped Hatchet=Machado com Ponta de Pedra
Stone-Tipped Mallet=Marreta com Ponta de Pedra
Stone-Tipped Pick=Picareta com Ponta de Pedra
Stone-Tipped Spade=Pá com Ponta de Pedra
Stump=Toco
Tempered Lode=Veio Mineral Temperado
Tempered Lode Bar=Barra de Veio Mineral Temperado
Tempered Lode Hatchet=Machado de Veio Mineral Temperado
Tempered Lode Hatchet Head=Cabeça de Machado de Veio Mineral Temperado
Tempered Lode Mallet=Marreta de Veio Mineral Temperado
Tempered Lode Mallet Head=Cabeça de Marreta de Veio Mineral Temperado
Tempered Lode Mattock=Enxada de Veio Mineral Temperado
Tempered Lode Mattock Head=Cabeça de Enxada de Veio Mineral Temperado
Tempered Lode Pick=Picareta de Veio Mineral Temperado
Tempered Lode Pick Head=Cabeça de Picareta de Veio Mineral Temperado
Tempered Lode Prill=Lascas de Veio Mineral Temperado
Tempered Lode Rod=Vara de Veio Mineral Temperado
Tempered Lode Spade=Pá de Veio Mineral Temperado
Tempered Lode Spade Head=Cabeça de Enxada de Veio Mineral Temperado
Tote (1 Slot)=Bolsa (1 Compartimento)
Tote (2 Slots)=Bolsa (2 Compartimentos)
Tote (3 Slots)=Bolsa (3 Compartimentos)
Tote (4 Slots)=Bolsa (4 Compartimentos)
Tote (5 Slots)=Bolsa (5 Compartimentos)
Tote (6 Slots)=Bolsa (6 Compartimentos)
Tote (7 Slots)=Bolsa (7 Compartimentos)
Tote (8 Slots)=Bolsa (8 Compartimentos)
Tote Handle=Alça de Bolsa
Tree Trunk=Tronco de Árvore
Unknown Item=Item Desconhecido
Water=Água
Wet Aggregate=Massa Úmida
Wet Sponge=Esponja Molhada
Wooden Adze=Enxó de Madeira
Wooden Frame=Estrutura de Madeira
Wooden Hatchet=Machado de Madeira
Wooden Hatchet Head=Cabeça de Machado de Madeira
Wooden Hinged Panel=Painel Articulado de Madeira
Wooden Ladder=Escada de Madeira
Wooden Mallet=Marreta de Madeira
Wooden Mallet Head=Cabeça de Marreta de Madeira
Wooden Panel=Painel de Madeira
Wooden Pick=Picareta de Madeira
Wooden Pick Head=Cabeça de Picareta de Madeira
Wooden Plank=Tábua de Madeira
Wooden Shelf=Estante de Madeira
Wooden Spade=Pá de Madeira
Wooden Spade Head=Cabeça de Pá de Madeira

View File

@ -0,0 +1,143 @@
# textdomain: nc_api
(C)2018-2019 by Aaron Suen <warr1024@@gmail.com>=(C)2018-2019 por Aaron Suen <war1024@@gmail.com>
- Crafting is done by building recipes in-world.=- A Criação de Itens é feita construindo as receitas pelo mundo.
- If a recipe exists, you will see a special particle effect.=- Se uma receita existe, você verá um efeito especial de partícula sair do node.
- Items picked up try to fit into the current selected slot first.=- Os itens pegados são primeiramente armazenados no espaço atualmente selecionado.
- Order and specific face of placement may matter for crafting.=- A ordem e a face em que os itens são colocados pode importar no processo de criação.
- Recipes are time-based, punching faster does not speed up.=- Receitas são cronometradas, bater mais forte não afetará a velocidade delas.
- Sneak+drop to count out single items from stack.=- Use os comandos de agachar e soltar juntos para soltar um só item.
- Some recipes require "pummeling" a node.=- Algumas receitas necessitam que você "esmurre" um node.
- Stacks may be pummeled, exact item count may matter.=- Amontoados de itens podem ser esmurrados, pode ser que precise de uma quantidade exata do item.
- There is NO inventory screen.=- NÃO EXISTE tela de inventário.
- To pummel, punch a node repeatedly, WITHOUT digging.=- Para esmurrar, bata num node repetidamente, SEM QUEBRÁ-LO.
- Wielded item, target face, and surrounding nodes may matter.=- O item segurado, a face do objeto alvo e os nodes ao redor podem importar durante a criação de algo.
- You do not have to punch very fast (about 1 per second).=- Você não precisa bater muito rápido(basta 1 batida por segundo).
About=Sobre
Active Lens=Lente Ativa
Active Prism=Prisma Ativo
Aggregate=Agregar
Air=Ar
Annealed Lode=Veio Mineral Recozido
Annealed Lode Bar=Barra de Veio Mineral Recozida
Annealed Lode Hatchet=Machado de Veio Mineral Recozida
Annealed Lode Hatchet Head=Cabeça de Machado de Veio Mineral Recozida
Annealed Lode Mallet=Marreta de Veio Mineral Recozida
Annealed Lode Mallet Head=Cabeça de Marreta de Veio Mineral Recozida
Annealed Lode Mattock=Enxada de Veio Mineral Recozida
Annealed Lode Mattock Head=Cabeça de Enxada de Veio Mineral Recozida
Annealed Lode Pick=Picareta de Veio Mineral Recozida
Annealed Lode Pick Head=Cabeça de Picareta de Veio Mineral Recozida
Annealed Lode Prill=Lascas de Veio Mineral Recozida
Annealed Lode Rod=Vara de Veio Mineral Recozida
Annealed Lode Spade=Pá de Veio Mineral Recozida
Annealed Lode Spade Head=Cabeça de Pá de Veio Mineral Recozida
Ash=Cinza
Ash Lump=Nódulo de Cinzas
Burning Embers=Brasa Quente
Charcoal=Carvão Vegetal
Charcoal Lump=Nódulo de Carvão Vegetal
Chromatic Glass=Vidro Cromático
Clear Glass=Vidro Transparente
Cobble=Pedregulho
Cobble Hinged Panel=Painel de Pedregulho Articulado
Cobble Panel=Painel de Pedregulho
Crude Glass=Vidro Bruto
DEVELOPMENT VERSION=VERSÃO EM DESENVOLVIMENTO
Dirt=Terra
Eggcorn=Semente de Carvalho
Fire=Fogo
Float Glass=Vidro Float
Glowing Lode=Veio Mineral Incandescente
Glowing Lode Bar=Barra de Veio Mineral Incandescente
Glowing Lode Hatchet=Machado de Veio Mineral Incandescente
Glowing Lode Hatchet Head=Cabeça de Machado Veio Mineral Incandescente
Glowing Lode Mallet=Marreta de Veio Mineral Incandescente
Glowing Lode Mallet Head=Cabeça de Marreta Veio Mineral Incandescente
Glowing Lode Mattock=Enxada de Veio Mineral Incandescente
Glowing Lode Mattock Head=Cabeça de Enxada Veio Mineral Incandescente
Glowing Lode Pick=Picareta de Veio Mineral Incandescente
Glowing Lode Pick Head=Cabeça de Picareta de Veio Mineral Incandescente
Glowing Lode Prill=Lascas de Veio Mineral Incandescente
Glowing Lode Rod=Vara de Veio Mineral Incandescente
Glowing Lode Spade=Pá de Veio Mineral Incandescente
Glowing Lode Spade Head=Cabeça de Pá Veio Mineral Incandescente
Grass=Grama
Gravel=Cascalho
Hints=Dicas
Ignore=Ignorar
Injury=Ferir
Inventory=Inventário
Leaves=Folhas
Lens=Lente
Living Sponge=Esponja Viva
Lode Cobble=Veio de Pedregulho
Lode Ore=Veio Mineral
Loose Cobble=Pedregulho Solta
Loose Dirt=Terra Solta
Loose Gravel=Cascalho Solto
Loose Leaves=Folhas Soltas
Loose Lode Cobble=Veio de Pedregulho Solto
Loose Sand=Areia Solta
Molten Glass=Vidro Derretido
Molten Rock=Pedra Derretida
Player's Guide: Inventory Management=Guia do Jogador: Gerenciamento de Inventário
Player's Guide: Pummeling Recipes=Guia do Jogador: Receitas por Esmurrada
Prism=Prisma
Progress: @1 complete, @2 current, @3 future=Progresso: @1 completo(s), @2 atual(is), @3 futuro(s)
Pummel=Esmurrar
Sand=Areia
See included LICENSE file for full details and credits=Veja o arquivo de LICENSA incluso para créditos e maiores detalhes
Shining Lens=Lente Brilhante
Sponge=Esponja
Staff=Bastão
Stick=Graveto
Stone=Pedra
Stone Chip=Pedaço de Pedra
Stone-Tipped Hatchet=Machado com Ponta de Pedra
Stone-Tipped Mallet=Marreta com Ponta de Pedra
Stone-Tipped Pick=Picareta com Ponta de Pedra
Stone-Tipped Spade=Pá com Ponta de Pedra
Stump=Toco
Tempered Lode=Veio Mineral Temperado
Tempered Lode Bar=Barra de Veio Mineral Temperado
Tempered Lode Hatchet=Machado de Veio Mineral Temperado
Tempered Lode Hatchet Head=Cabeça de Machado de Veio Mineral Temperado
Tempered Lode Mallet=Marreta de Veio Mineral Temperado
Tempered Lode Mallet Head=Cabeça de Marreta de Veio Mineral Temperado
Tempered Lode Mattock=Enxada de Veio Mineral Temperado
Tempered Lode Mattock Head=Cabeça de Enxada de Veio Mineral Temperado
Tempered Lode Pick=Picareta de Veio Mineral Temperado
Tempered Lode Pick Head=Cabeça de Picareta de Veio Mineral Temperado
Tempered Lode Prill=Lascas de Veio Mineral Temperado
Tempered Lode Rod=Vara de Veio Mineral Temperado
Tempered Lode Spade=Pá de Veio Mineral Temperado
Tempered Lode Spade Head=Cabeça de Enxada de Veio Mineral Temperado
Tote (1 Slot)=Bolsa (1 Compartimento)
Tote (2 Slots)=Bolsa (2 Compartimentos)
Tote (3 Slots)=Bolsa (3 Compartimentos)
Tote (4 Slots)=Bolsa (4 Compartimentos)
Tote (5 Slots)=Bolsa (5 Compartimentos)
Tote (6 Slots)=Bolsa (6 Compartimentos)
Tote (7 Slots)=Bolsa (7 Compartimentos)
Tote (8 Slots)=Bolsa (8 Compartimentos)
Tote Handle=Alça de Bolsa
Tree Trunk=Tronco de Árvore
Unknown Item=Item Desconhecido
Water=Água
Wet Aggregate=Massa Úmida
Wet Sponge=Esponja Molhada
Wooden Adze=Enxó de Madeira
Wooden Frame=Estrutura de Madeira
Wooden Hatchet=Machado de Madeira
Wooden Hatchet Head=Cabeça de Machado de Madeira
Wooden Hinged Panel=Painel Articulado de Madeira
Wooden Ladder=Escada de Madeira
Wooden Mallet=Marreta de Madeira
Wooden Mallet Head=Cabeça de Marreta de Madeira
Wooden Panel=Painel de Madeira
Wooden Pick=Picareta de Madeira
Wooden Pick Head=Cabeça de Picareta de Madeira
Wooden Plank=Tábua de Madeira
Wooden Shelf=Estante de Madeira
Wooden Spade=Pá de Madeira
Wooden Spade Head=Cabeça de Pá de Madeira

View File

@ -0,0 +1,2 @@
update:
cd .. && perl -w src/update.pl

View File

@ -0,0 +1,771 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-04 22:56+0000\n"
"PO-Revision-Date: 2019-10-04 22:56+0000\n"
"Last-Translator: Weblate Admin <warr1024@gmail.com>\n"
"Language-Team: English <http://nodecore.mine.nu/trans/projects/nodecore/core/"
"en/>\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.8\n"
msgid "(C)2018-2019 by Aaron Suen <warr1024@@gmail.com>"
msgstr "(C)2018-2019 by Aaron Suen <warr1024@@gmail.com>"
msgid "(and 1 more hint)"
msgstr "(and 1 more hint)"
msgid "(and @1 more hints)"
msgstr "(and @1 more hints)"
msgid "- "Furnaces" are not a thing; discover smelting with open flames."
msgstr "- "Furnaces" are not a thing; discover smelting with open flames."
msgid "- "Torches" are not a thing; use fire as your first light source."
msgstr "[REMOVED]"
msgid "- @1"
msgstr "- @1"
msgid "- Can't dig trees or grass? Search for sticks in the canopy."
msgstr "- Can't dig trees or grass? Search for sticks in the canopy."
msgid "- Crafting is done by building recipes in-world."
msgstr "- Crafting is done by building recipes in-world."
msgid "- DONE: @1"
msgstr "- DONE: @1"
msgid "- Drop items onto ground to create stack nodes. They do not decay."
msgstr "- Drop items onto ground to create stack nodes. They do not decay."
msgid "- If a recipe exists, you will see a special particle effect."
msgstr "- If a recipe exists, you will see a special particle effect."
msgid "- Items picked up try to fit into the current selected slot first."
msgstr "- Items picked up try to fit into the current selected slot first."
msgid "- Order and specific face of placement may matter for crafting."
msgstr "- Order and specific face of placement may matter for crafting."
msgid "- Ores may be hidden, but revealed by subtle clues in terrain."
msgstr "- Ores may be hidden, but revealed by subtle clues in terrain."
msgid "- Recipes are time-based, punching faster does not speed up."
msgstr "- Recipes are time-based, punching faster does not speed up."
msgid "- Sneak+drop to count out single items from stack."
msgstr "- Sneak+drop to count out single items from stack."
msgid "- Some recipes require "pummeling" a node."
msgstr "- Some recipes require "pummeling" a node."
msgid "- Stacks may be pummeled, exact item count may matter."
msgstr "- Stacks may be pummeled, exact item count may matter."
msgid "- Stuck in a pit? Pummel surfaces barehanded to find places to climb."
msgstr "- Stuck in a pit? Pummel surfaces barehanded to find places to climb."
msgid "- The game is challenging by design, sometimes frustrating. DON'T GIVE UP!"
msgstr "- The game is challenging by design, sometimes frustrating. DON'T GIVE UP!"
msgid "- There is NO inventory screen."
msgstr "- There is NO inventory screen."
msgid "- To pummel, punch a node repeatedly, WITHOUT digging."
msgstr "- To pummel, punch a node repeatedly, WITHOUT digging."
msgid "- Trouble lighting a fire? Try using longer sticks, more tinder."
msgstr "- Trouble lighting a fire? Try using longer sticks, more tinder."
msgid "- Wielded item, target face, and surrounding nodes may matter."
msgstr "- Wielded item, target face, and surrounding nodes may matter."
msgid "- You do not have to punch very fast (about 1 per second)."
msgstr "- You do not have to punch very fast (about 1 per second)."
msgid "About"
msgstr "About"
msgid "Active Lens"
msgstr "Active Lens"
msgid "Active Prism"
msgstr "Active Prism"
msgid "Aggregate"
msgstr "Aggregate"
msgid "Air"
msgstr "Air"
msgid "Annealed Lode"
msgstr "Annealed Lode"
msgid "Annealed Lode Bar"
msgstr "Annealed Lode Bar"
msgid "Annealed Lode Hatchet"
msgstr "Annealed Lode Hatchet"
msgid "Annealed Lode Hatchet Head"
msgstr "Annealed Lode Hatchet Head"
msgid "Annealed Lode Mallet"
msgstr "Annealed Lode Mallet"
msgid "Annealed Lode Mallet Head"
msgstr "Annealed Lode Mallet Head"
msgid "Annealed Lode Mattock"
msgstr "Annealed Lode Mattock"
msgid "Annealed Lode Mattock Head"
msgstr "Annealed Lode Mattock Head"
msgid "Annealed Lode Pick"
msgstr "Annealed Lode Pick"
msgid "Annealed Lode Pick Head"
msgstr "Annealed Lode Pick Head"
msgid "Annealed Lode Prill"
msgstr "Annealed Lode Prill"
msgid "Annealed Lode Rod"
msgstr "Annealed Lode Rod"
msgid "Annealed Lode Spade"
msgstr "Annealed Lode Spade"
msgid "Annealed Lode Spade Head"
msgstr "Annealed Lode Spade Head"
msgid "Ash"
msgstr "Ash"
msgid "Ash Lump"
msgstr "Ash Lump"
msgid "Burning Embers"
msgstr "Burning Embers"
msgid "Charcoal"
msgstr "Charcoal"
msgid "Charcoal Lump"
msgstr "Charcoal Lump"
msgid "Chromatic Glass"
msgstr "Chromatic Glass"
msgid "Clear Glass"
msgstr "Clear Glass"
msgid "Cobble"
msgstr "Cobble"
msgid "Cobble Hinged Panel"
msgstr "Cobble Hinged Panel"
msgid "Cobble Panel"
msgstr "Cobble Panel"
msgid "Crude Glass"
msgstr "Crude Glass"
msgid "DEVELOPMENT VERSION"
msgstr "DEVELOPMENT VERSION"
msgid "Dirt"
msgstr "Dirt"
msgid "Discord: https://discord.gg/SHq2tkb"
msgstr "Discord: https://discord.gg/SHq2tkb"
msgid "Eggcorn"
msgstr "Eggcorn"
msgid "Fire"
msgstr "Fire"
msgid "Float Glass"
msgstr "Float Glass"
msgid "GitLab: https://gitlab.com/sztest/nodecore"
msgstr "GitLab: https://gitlab.com/sztest/nodecore"
msgid "Glowing Lode"
msgstr "Glowing Lode"
msgid "Glowing Lode Bar"
msgstr "Glowing Lode Bar"
msgid "Glowing Lode Hatchet"
msgstr "Glowing Lode Hatchet"
msgid "Glowing Lode Hatchet Head"
msgstr "Glowing Lode Hatchet Head"
msgid "Glowing Lode Mallet"
msgstr "Glowing Lode Mallet"
msgid "Glowing Lode Mallet Head"
msgstr "Glowing Lode Mallet Head"
msgid "Glowing Lode Mattock"
msgstr "Glowing Lode Mattock"
msgid "Glowing Lode Mattock Head"
msgstr "Glowing Lode Mattock Head"
msgid "Glowing Lode Pick"
msgstr "Glowing Lode Pick"
msgid "Glowing Lode Pick Head"
msgstr "Glowing Lode Pick Head"
msgid "Glowing Lode Prill"
msgstr "Glowing Lode Prill"
msgid "Glowing Lode Rod"
msgstr "Glowing Lode Rod"
msgid "Glowing Lode Spade"
msgstr "Glowing Lode Spade"
msgid "Glowing Lode Spade Head"
msgstr "Glowing Lode Spade Head"
msgid "Grass"
msgstr "Grass"
msgid "Gravel"
msgstr "Gravel"
msgid "Hints"
msgstr "Hints"
msgid "Ignore"
msgstr "Ignore"
msgid "Infused Annealed Lode Hatchet"
msgstr "Infused Annealed Lode Hatchet"
msgid "Infused Annealed Lode Mallet"
msgstr "Infused Annealed Lode Mallet"
msgid "Infused Annealed Lode Mattock"
msgstr "Infused Annealed Lode Mattock"
msgid "Infused Annealed Lode Pick"
msgstr "Infused Annealed Lode Pick"
msgid "Infused Annealed Lode Spade"
msgstr "Infused Annealed Lode Spade"
msgid "Infused Tempered Lode Hatchet"
msgstr "Infused Tempered Lode Hatchet"
msgid "Infused Tempered Lode Mallet"
msgstr "Infused Tempered Lode Mallet"
msgid "Infused Tempered Lode Mattock"
msgstr "Infused Tempered Lode Mattock"
msgid "Infused Tempered Lode Pick"
msgstr "Infused Tempered Lode Pick"
msgid "Infused Tempered Lode Spade"
msgstr "Infused Tempered Lode Spade"
msgid "Injury"
msgstr "Injury"
msgid "Inventory"
msgstr "Inventory"
msgid "Leaves"
msgstr "Leaves"
msgid "Lens"
msgstr "Lens"
msgid "Living Sponge"
msgstr "Living Sponge"
msgid "Lode Cobble"
msgstr "Lode Cobble"
msgid "Lode Crate"
msgstr "Lode Crate"
msgid "Lode Ore"
msgstr "Lode Ore"
msgid "Loose Cobble"
msgstr "Loose Cobble"
msgid "Loose Dirt"
msgstr "Loose Dirt"
msgid "Loose Gravel"
msgstr "Loose Gravel"
msgid "Loose Leaves"
msgstr "Loose Leaves"
msgid "Loose Lode Cobble"
msgstr "Loose Lode Cobble"
msgid "Loose Lux Cobble"
msgstr "Loose Lux Cobble"
msgid "Loose Sand"
msgstr "Loose Sand"
msgid "Lux Cobble"
msgstr "Lux Cobble"
msgid "Lux Flow"
msgstr "Lux Flow"
msgid "MIT License (http://www.opensource.org/licenses/MIT)"
msgstr "MIT License (http://www.opensource.org/licenses/MIT)"
msgid "Molten Glass"
msgstr "Molten Glass"
msgid "Molten Rock"
msgstr "Molten Rock"
msgid "NodeCore"
msgstr "NodeCore"
msgid "Not all game content is covered by hints. Explore!"
msgstr "Not all game content is covered by hints. Explore!"
msgid "Player's Guide: Inventory Management"
msgstr "Player's Guide: Inventory Management"
msgid "Player's Guide: Pummeling Recipes"
msgstr "Player's Guide: Pummeling Recipes"
msgid "Player's Guide: Tips and Guidance"
msgstr "Player's Guide: Tips and Guidance"
msgid "Prism"
msgstr "Prism"
msgid "Progress: @1 complete, @2 current, @3 future"
msgstr "Progress: @1 complete, @2 current, @3 future"
msgid "Pummel"
msgstr "Pummel"
msgid "Sand"
msgstr "Sand"
msgid "See included LICENSE file for full details and credits"
msgstr "See included LICENSE file for full details and credits"
msgid "Shining Lens"
msgstr "Shining Lens"
msgid "Sponge"
msgstr "Sponge"
msgid "Staff"
msgstr "Staff"
msgid "Stick"
msgstr "Stick"
msgid "Stone"
msgstr "Stone"
msgid "Stone Chip"
msgstr "Stone Chip"
msgid "Stone-Tipped Hatchet"
msgstr "Stone-Tipped Hatchet"
msgid "Stone-Tipped Mallet"
msgstr "Stone-Tipped Mallet"
msgid "Stone-Tipped Pick"
msgstr "Stone-Tipped Pick"
msgid "Stone-Tipped Spade"
msgstr "Stone-Tipped Spade"
msgid "Stump"
msgstr "Stump"
msgid "Tempered Lode"
msgstr "Tempered Lode"
msgid "Tempered Lode Bar"
msgstr "Tempered Lode Bar"
msgid "Tempered Lode Hatchet"
msgstr "Tempered Lode Hatchet"
msgid "Tempered Lode Hatchet Head"
msgstr "Tempered Lode Hatchet Head"
msgid "Tempered Lode Mallet"
msgstr "Tempered Lode Mallet"
msgid "Tempered Lode Mallet Head"
msgstr "Tempered Lode Mallet Head"
msgid "Tempered Lode Mattock"
msgstr "Tempered Lode Mattock"
msgid "Tempered Lode Mattock Head"
msgstr "Tempered Lode Mattock Head"
msgid "Tempered Lode Pick"
msgstr "Tempered Lode Pick"
msgid "Tempered Lode Pick Head"
msgstr "Tempered Lode Pick Head"
msgid "Tempered Lode Prill"
msgstr "Tempered Lode Prill"
msgid "Tempered Lode Rod"
msgstr "Tempered Lode Rod"
msgid "Tempered Lode Spade"
msgstr "Tempered Lode Spade"
msgid "Tempered Lode Spade Head"
msgstr "Tempered Lode Spade Head"
msgid "Tips"
msgstr "Tips"
msgid "Tote (1 Slot)"
msgstr "Tote (1 Slot)"
msgid "Tote (2 Slots)"
msgstr "Tote (2 Slots)"
msgid "Tote (3 Slots)"
msgstr "Tote (3 Slots)"
msgid "Tote (4 Slots)"
msgstr "Tote (4 Slots)"
msgid "Tote (5 Slots)"
msgstr "Tote (5 Slots)"
msgid "Tote (6 Slots)"
msgstr "Tote (6 Slots)"
msgid "Tote (7 Slots)"
msgstr "Tote (7 Slots)"
msgid "Tote (8 Slots)"
msgstr "Tote (8 Slots)"
msgid "Tote Handle"
msgstr "Tote Handle"
msgid "Tree Trunk"
msgstr "Tree Trunk"
msgid "Unknown Item"
msgstr "Unknown Item"
msgid "Water"
msgstr "Water"
msgid "Wet Aggregate"
msgstr "Wet Aggregate"
msgid "Wet Sponge"
msgstr "Wet Sponge"
msgid "Wooden Adze"
msgstr "Wooden Adze"
msgid "Wooden Frame"
msgstr "Wooden Frame"
msgid "Wooden Hatchet"
msgstr "Wooden Hatchet"
msgid "Wooden Hatchet Head"
msgstr "Wooden Hatchet Head"
msgid "Wooden Hinged Panel"
msgstr "Wooden Hinged Panel"
msgid "Wooden Ladder"
msgstr "Wooden Ladder"
msgid "Wooden Mallet"
msgstr "Wooden Mallet"
msgid "Wooden Mallet Head"
msgstr "Wooden Mallet Head"
msgid "Wooden Panel"
msgstr "Wooden Panel"
msgid "Wooden Pick"
msgstr "Wooden Pick"
msgid "Wooden Pick Head"
msgstr "Wooden Pick Head"
msgid "Wooden Plank"
msgstr "Wooden Plank"
msgid "Wooden Shelf"
msgstr "Wooden Shelf"
msgid "Wooden Spade"
msgstr "Wooden Spade"
msgid "Wooden Spade Head"
msgstr "Wooden Spade Head"
msgid "activate a lens"
msgstr "activate a lens"
msgid "assemble a staff from sticks"
msgstr "assemble a staff from sticks"
msgid "assemble a wooden frame from staves"
msgstr "assemble a wooden frame from staves"
msgid "assemble a wooden ladder from sticks"
msgstr "assemble a wooden ladder from sticks"
msgid "assemble a wooden shelf from frames and planks"
msgstr "assemble a wooden shelf from frames and planks"
msgid "assemble a wooden tool"
msgstr "assemble a wooden tool"
msgid "assemble an adze out of sticks"
msgstr "assemble an adze out of sticks"
msgid "assemble an annealed lode tote handle"
msgstr "assemble an annealed lode tote handle"
msgid "bash a plank into sticks"
msgstr "bash a plank into sticks"
msgid "break cobble into chips"
msgstr "break cobble into chips"
msgid "carve a wooden plank completely"
msgstr "carve a wooden plank completely"
msgid "carve wooden tool heads from planks"
msgstr "carve wooden tool heads from planks"
msgid "chip chromatic glass into prisms"
msgstr "chip chromatic glass into prisms"
msgid "chisel a hinge groove into a wooden plank"
msgstr "chisel a hinge groove into a wooden plank"
msgid "chisel a hinge groove into cobble"
msgstr "chisel a hinge groove into cobble"
msgid "chop a glowing lode cube into prills"
msgstr "chop a glowing lode cube into prills"
msgid "chop a lode crate back apart"
msgstr "chop a lode crate back apart"
msgid "chop chromatic glass into lenses"
msgstr "chop chromatic glass into lenses"
msgid "chop lode a rod back into bars"
msgstr "chop lode a rod back into bars"
msgid "chop up charcoal"
msgstr "chop up charcoal"
msgid "cold-forge annealed lode prills into a tool head"
msgstr "cold-forge annealed lode prills into a tool head"
msgid "cold-forge lode down completely"
msgstr "cold-forge lode down completely"
msgid "cool molten glass into crude glass"
msgstr "cool molten glass into crude glass"
msgid "cut down a tree"
msgstr "cut down a tree"
msgid "dig up a tree stump"
msgstr "dig up a tree stump"
msgid "dig up dirt"
msgstr "dig up dirt"
msgid "dig up gravel"
msgstr "dig up gravel"
msgid "dig up lode ore"
msgstr "dig up lode ore"
msgid "dig up lux cobble"
msgstr "dig up lux cobble"
msgid "dig up sand"
msgstr "dig up sand"
msgid "dig up stone"
msgstr "dig up stone"
msgid "dry out a sponge"
msgstr "dry out a sponge"
msgid "find a lode stratum"
msgstr "find a lode stratum"
msgid "find a sponge"
msgstr "find a sponge"
msgid "find a stick"
msgstr "find a stick"
msgid "find an eggcorn"
msgstr "find an eggcorn"
msgid "find ash"
msgstr "find ash"
msgid "find charcoal"
msgstr "find charcoal"
msgid "find deep stone strata"
msgstr "find deep stone strata"
msgid "find dry (loose) leaves"
msgstr "find dry (loose) leaves"
msgid "find lode ore"
msgstr "find lode ore"
msgid "find lux"
msgstr "find lux"
msgid "find molten rock"
msgstr "find molten rock"
msgid "hammer a lode bar back to a prill"
msgstr "hammer a lode bar back to a prill"
msgid "hammer a lode prill into a bar"
msgstr "hammer a lode prill into a bar"
msgid "hammer a metal rod into a cobble panel"
msgstr "hammer a metal rod into a cobble panel"
msgid "hammer a staff into a lubricated wooden panel"
msgstr "hammer a staff into a lubricated wooden panel"
msgid "hammer lode bars into a rod"
msgstr "hammer lode bars into a rod"
msgid "harvest a sponge"
msgstr "harvest a sponge"
msgid "https://content.minetest.net/packages/Warr1024/nodecore/"
msgstr "https://content.minetest.net/packages/Warr1024/nodecore/"
msgid "lubricate a cobble panel with graphite"
msgstr "lubricate a cobble panel with graphite"
msgid "lubricate a wooden panel with graphite"
msgstr "lubricate a wooden panel with graphite"
msgid "lux-infuse a lode tool"
msgstr "lux-infuse a lode tool"
msgid "make an anvil by tempering a lode cube"
msgstr "make an anvil by tempering a lode cube"
msgid "make fire by rubbing sticks together"
msgstr "make fire by rubbing sticks together"
msgid "make wet aggregate"
msgstr "make wet aggregate"
msgid "melt down lode metal from lode cobble"
msgstr "melt down lode metal from lode cobble"
msgid "melt sand into glass"
msgstr "melt sand into glass"
msgid "mix gravel into ash to make aggregate"
msgstr "mix gravel into ash to make aggregate"
msgid "mold molten glass into clear glass"
msgstr "mold molten glass into clear glass"
msgid "mold molten glass into float glass"
msgstr "mold molten glass into float glass"
msgid "observe a lux reaction"
msgstr "observe a lux reaction"
msgid "observe lux criticality"
msgstr "observe lux criticality"
msgid "pack high-quality charcoal"
msgstr "pack high-quality charcoal"
msgid "pack stone chips back into cobble"
msgstr "pack stone chips back into cobble"
msgid "plant an eggcorn"
msgstr "plant an eggcorn"
msgid "produce light from a lens"
msgstr "produce light from a lens"
msgid "put a stone tip onto a wooden tool"
msgstr "put a stone tip onto a wooden tool"
msgid "quench molten glass into chromatic glass"
msgstr "quench molten glass into chromatic glass"
msgid "scale a sheer overhang"
msgstr "scale a sheer overhang"
msgid "scale a sheer wall"
msgstr "scale a sheer wall"
msgid "sinter glowing lode prills into a cube"
msgstr "sinter glowing lode prills into a cube"
msgid "solder lode rods into crates"
msgstr "solder lode rods into crates"
msgid "split a tree trunk into planks"
msgstr "split a tree trunk into planks"
msgid "squeeze out a sponge"
msgstr "squeeze out a sponge"
msgid "temper a lode tool head"
msgstr "temper a lode tool head"
msgid "weld glowing lode pick and spade heads together"
msgstr "weld glowing lode pick and spade heads together"

View File

@ -0,0 +1,2 @@
msgid ""
msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit"

View File

@ -0,0 +1,2 @@
msgid ""
msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit"

View File

@ -0,0 +1,21 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2019-10-04 22:59+0000\n"
"Last-Translator: Terifo <none@example.org>\n"
"Language-Team: Japanese <http://nodecore.mine.nu/trans/projects/nodecore/"
"core/ja/>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 3.8\n"
msgid "(and @1 more hints)"
msgstr "(さらに@1つのヒント)"
msgid "(and 1 more hint)"
msgstr "(さらに1つのヒント)"
msgid "(C)2018-2019 by Aaron Suen <warr1024@@gmail.com>"
msgstr "(C)2018-2019 から Aaron Suen <warr1024@@gmail.com>"

View File

@ -0,0 +1,633 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-09-12 14:44+0000\n"
"PO-Revision-Date: 2019-10-04 22:56+0000\n"
"Last-Translator: Terifo <none@example.org>\n"
"Language-Team: Portuguese <http://nodecore.mine.nu/trans/projects/nodecore/"
"core/pt/>\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.8\n"
msgid "(C)2018-2019 by Aaron Suen <warr1024@@gmail.com>"
msgstr "(C)2018-2019 por Aaron Suen <war1024@@gmail.com>"
msgid "- Crafting is done by building recipes in-world."
msgstr "- A Criação de Itens é feita construindo as receitas pelo mundo."
msgid "- Drop items onto ground to create stack nodes. They do not decay."
msgstr "- Solte itens no chão para criar um node de itens amontoados. Eles não desaparecem."
msgid "- If a recipe exists, you will see a special particle effect."
msgstr "- Se uma receita existe, você verá um efeito especial de partícula sair do node."
msgid "- Items picked up try to fit into the current selected slot first."
msgstr "- Os itens pegados são primeiramente armazenados no espaço atualmente selecionado."
msgid "- Order and specific face of placement may matter for crafting."
msgstr "- A ordem e a face em que os itens são colocados pode importar no processo de criação."
msgid "- Recipes are time-based, punching faster does not speed up."
msgstr "- Receitas são cronometradas, bater mais forte não afetará a velocidade delas."
msgid "- Sneak+drop to count out single items from stack."
msgstr "- Use os comandos de agachar e soltar juntos para soltar um só item."
msgid "- Some recipes require "pummeling" a node."
msgstr "- Algumas receitas necessitam que você "esmurre" um node."
msgid "- Stacks may be pummeled, exact item count may matter."
msgstr "- Amontoados de itens podem ser esmurrados, pode ser que precise de uma quantidade exata do item."
msgid "- There is NO inventory screen."
msgstr "- NÃO EXISTE tela de inventário."
msgid "- To pummel, punch a node repeatedly, WITHOUT digging."
msgstr "- Para esmurrar, bata num node repetidamente, SEM QUEBRÁ-LO."
msgid "- Wielded item, target face, and surrounding nodes may matter."
msgstr "- O item segurado, a face do objeto alvo e os nodes ao redor podem importar durante a criação de algo."
msgid "- You do not have to punch very fast (about 1 per second)."
msgstr "- Você não precisa bater muito rápido(basta 1 batida por segundo)."
msgid "...and 1 more hint..."
msgstr "...e mais 1 dica..."
msgid "...and @1 more hints..."
msgstr "...e mais @1 dicas..."
msgid "...have you activated a lens yet?"
msgstr "...você já ativou uma lente?"
msgid "...have you assembled a staff from sticks yet?"
msgstr "...você já montou um bastão usando gravetos?"
msgid "...have you assembled a wooden frame yet?"
msgstr "...você já montou um estrutura de madeira?"
msgid "...have you assembled a wooden ladder yet?"
msgstr "...você já montou uma escada de madeira?"
msgid "...have you assembled a wooden shelf yet?"
msgstr "...você já montou uma estante de madeira?"
msgid "...have you assembled a wooden tool yet?"
msgstr "...você já montou uma ferramenta de madeira?"
msgid "...have you assembled an adze out of sticks yet?"
msgstr "...você já montou um enxó usando gravetos?"
msgid "...have you assembled an annealed lode tote handle yet?"
msgstr "...você já montou uma alça de bolsa recozida?"
msgid "...have you bashed a plank into sticks yet?"
msgstr "...você já quebrou uma tábua em gravetos batendo nela?"
msgid "...have you broken cobble into chips yet?"
msgstr "...você já quebrou pedregulho em pedaços?"
msgid "...have you carved a wooden plank completely yet?"
msgstr "...você já entalhou completamente uma tábua de madeira?"
msgid "...have you carved wooden tool heads from planks yet?"
msgstr "...você já transformou uma tábua em cabeças de ferramentas, entalhando a madeira?"
msgid "...have you chipped chromatic glass into prisms yet?"
msgstr "...você já quebrou um vidro cromático em prismas, lascando o vidro?"
msgid "...have you chopped a lode cube into prills yet?"
msgstr "...você já quebrou um veio mineral em lascas, usando um machado?"
msgid "...have you chopped chromatic glass into lenses yet?"
msgstr "...você já quebrou vidro cromático em lentes, usando um machado?"
msgid "...have you chopped up charcoal yet?"
msgstr "...você já quebrou carvão usando um machado?"
msgid "...have you cold-forged an annealed lode tool head yet?"
msgstr "...você já fez uma forja fria de uma cabeça de ferramenta de veio mineral?"
msgid "...have you cold-forged lode down completely yet?"
msgstr "...você já fez uma forja fria de um veio mineral?"
msgid "...have you cooled molten glass into crude glass yet?"
msgstr "...você já esfriou vidro derretido para que este virasse vidro cru?"
msgid "...have you cut down a tree yet?"
msgstr "...você já cortou uma árvore?"
msgid "...have you dug up a tree stump yet?"
msgstr "...você já desenterrou um toco de árvore?"
msgid "...have you dug up dirt yet?"
msgstr "...você já cavou terra?"
msgid "...have you dug up gravel yet?"
msgstr "...você já cavou cascalho?"
msgid "...have you dug up lode ore yet?"
msgstr "...você já desenterrou um veio mineral?"
msgid "...have you dug up sand yet?"
msgstr "...você já cavou areia?"
msgid "...have you dug up stone yet?"
msgstr "...você já cavou pedra?"
msgid "...have you found a lode stratum yet?"
msgstr "...você já encontrou um estrato de veio mineral?"
msgid "...have you found ash yet?"
msgstr "...você já encontrou cinzas?"
msgid "...have you found charcoal yet?"
msgstr "...você já encontrou carvão?"
msgid "...have you found deep stone strata yet?"
msgstr "...você já encontrou um estrato de pedra profunda?"
msgid "...have you found dry leaves yet?"
msgstr "...você já encontrou folhas secas?"
msgid "...have you found eggcorns yet?"
msgstr "...você já encontrou semente de carvalho?"
msgid "...have you found lode ore yet?"
msgstr "...você já encontrou um veio mineral?"
msgid "...have you found molten rock yet?"
msgstr "...você já encontrou pedra derretida (lava)?"
msgid "...have you found sponges yet?"
msgstr "...você já encontrou esponjas?"
msgid "...have you found sticks yet?"
msgstr "...você já encontrou gravetos?"
msgid "...have you made fire by rubbing sticks together yet?"
msgstr "...você já fez fogo esfregando gravetos?"
msgid "...have you melted down lode metal yet?"
msgstr "...você já derreteu um veio mineral?"
msgid "...have you melted sand into glass yet?"
msgstr "...você já transformou areia em vidro, derretendo a areia?"
msgid "...have you molded molten glass into clear glass yet?"
msgstr "...você já moldou vidro derretido em vidro transparente?"
msgid "...have you packed high-quality charcoal yet?"
msgstr "...você já juntou carvão de alta qualidade?"
msgid "...have you packed stone chips back into cobble yet?"
msgstr "...você já juntou pedaços de pedra para que virassem pedregulho?"
msgid "...have you planted an eggcorn yet?"
msgstr "...você já plantou uma semente de carvalho?"
msgid "...have you produced light from a lens yet?"
msgstr "...você já gerou luz a partir de uma lente?"
msgid "...have you put a stone tip onto a tool yet?"
msgstr "...você já colocou uma ponta de pedra em uma ferramenta?"
msgid "...have you quenched molten glass into chromatic glass yet?"
msgstr "...você já temperou vidro derretido para que virasse vidro cromático?"
msgid "...have you sintered glowing lode into a cube yet?"
msgstr "...você já moldou veio mineral incandescente em um cubo?"
msgid "...have you split a tree trunk into planks yet?"
msgstr "...você já fez tábuas quebrando troncos de madeira?"
msgid "...have you tempered a lode anvil yet?"
msgstr "...você já fez uma bigorna temperando veio mineral?"
msgid "...have you tempered a lode tool head yet?"
msgstr "...você já fez uma cabeça de ferramenta temperando veio mineral?"
msgid "...have you welded a lode pick and spade together yet?"
msgstr "...você já soldou uma picareta de veio mineral com uma pá de veio mineral?"
msgid "About"
msgstr "Sobre"
msgid "Active Lens"
msgstr "Lente Ativa"
msgid "Active Prism"
msgstr "Prisma Ativo"
msgid "Aggregate"
msgstr "Agregar"
msgid "Air"
msgstr "Ar"
msgid "Annealed Lode"
msgstr "Veio Mineral Recozido"
msgid "Annealed Lode Bar"
msgstr "Barra de Veio Mineral Recozida"
msgid "Annealed Lode Hatchet"
msgstr "Machado de Veio Mineral Recozida"
msgid "Annealed Lode Hatchet Head"
msgstr "Cabeça de Machado de Veio Mineral Recozida"
msgid "Annealed Lode Mallet"
msgstr "Marreta de Veio Mineral Recozida"
msgid "Annealed Lode Mallet Head"
msgstr "Cabeça de Marreta de Veio Mineral Recozida"
msgid "Annealed Lode Mattock"
msgstr "Enxada de Veio Mineral Recozida"
msgid "Annealed Lode Mattock Head"
msgstr "Cabeça de Enxada de Veio Mineral Recozida"
msgid "Annealed Lode Pick"
msgstr "Picareta de Veio Mineral Recozida"
msgid "Annealed Lode Pick Head"
msgstr "Cabeça de Picareta de Veio Mineral Recozida"
msgid "Annealed Lode Prill"
msgstr "Lascas de Veio Mineral Recozida"
msgid "Annealed Lode Rod"
msgstr "Vara de Veio Mineral Recozida"
msgid "Annealed Lode Spade"
msgstr "Pá de Veio Mineral Recozida"
msgid "Annealed Lode Spade Head"
msgstr "Cabeça de Pá de Veio Mineral Recozida"
msgid "Ash"
msgstr "Cinza"
msgid "Ash Lump"
msgstr "Nódulo de Cinzas"
msgid "Burning Embers"
msgstr "Brasa Quente"
msgid "Charcoal"
msgstr "Carvão Vegetal"
msgid "Charcoal Lump"
msgstr "Nódulo de Carvão Vegetal"
msgid "Chromatic Glass"
msgstr "Vidro Cromático"
msgid "Clear Glass"
msgstr "Vidro Transparente"
msgid "Cobble"
msgstr "Pedregulho"
msgid "Cobble Hinged Panel"
msgstr "Painel de Pedregulho Articulado"
msgid "Cobble Panel"
msgstr "Painel de Pedregulho"
msgid "Crude Glass"
msgstr "Vidro Bruto"
msgid "DEVELOPMENT VERSION"
msgstr "VERSÃO EM DESENVOLVIMENTO"
msgid "Dirt"
msgstr "Terra"
msgid "Discord: https://discord.gg/SHq2tkb"
msgstr "Discord: https://discord.gg/SHq2tkb"
msgid "Eggcorn"
msgstr "Semente de Carvalho"
msgid "Fire"
msgstr "Fogo"
msgid "Float Glass"
msgstr "Vidro Float"
msgid "GitLab: https://gitlab.com/sztest/nodecore"
msgstr "GitLab: https://gitlab.com/sztest/nodecore"
msgid "Glowing Lode"
msgstr "Veio Mineral Incandescente"
msgid "Glowing Lode Bar"
msgstr "Barra de Veio Mineral Incandescente"
msgid "Glowing Lode Hatchet"
msgstr "Machado de Veio Mineral Incandescente"
msgid "Glowing Lode Hatchet Head"
msgstr "Cabeça de Machado Veio Mineral Incandescente"
msgid "Glowing Lode Mallet"
msgstr "Marreta de Veio Mineral Incandescente"
msgid "Glowing Lode Mallet Head"
msgstr "Cabeça de Marreta Veio Mineral Incandescente"
msgid "Glowing Lode Mattock"
msgstr "Enxada de Veio Mineral Incandescente"
msgid "Glowing Lode Mattock Head"
msgstr "Cabeça de Enxada Veio Mineral Incandescente"
msgid "Glowing Lode Pick"
msgstr "Picareta de Veio Mineral Incandescente"
msgid "Glowing Lode Pick Head"
msgstr "Cabeça de Picareta de Veio Mineral Incandescente"
msgid "Glowing Lode Prill"
msgstr "Lascas de Veio Mineral Incandescente"
msgid "Glowing Lode Rod"
msgstr "Vara de Veio Mineral Incandescente"
msgid "Glowing Lode Spade"
msgstr "Pá de Veio Mineral Incandescente"
msgid "Glowing Lode Spade Head"
msgstr "Cabeça de Pá Veio Mineral Incandescente"
msgid "Grass"
msgstr "Grama"
msgid "Gravel"
msgstr "Cascalho"
msgid "Hints"
msgstr "Dicas"
msgid "Ignore"
msgstr "Ignorar"
msgid "Injury"
msgstr "Ferir"
msgid "Inventory"
msgstr "Inventário"
msgid "Leaves"
msgstr "Folhas"
msgid "Lens"
msgstr "Lente"
msgid "Living Sponge"
msgstr "Esponja Viva"
msgid "Lode Cobble"
msgstr "Veio de Pedregulho"
msgid "Lode Ore"
msgstr "Veio Mineral"
msgid "Loose Cobble"
msgstr "Pedregulho Solta"
msgid "Loose Dirt"
msgstr "Terra Solta"
msgid "Loose Gravel"
msgstr "Cascalho Solto"
msgid "Loose Leaves"
msgstr "Folhas Soltas"
msgid "Loose Lode Cobble"
msgstr "Veio de Pedregulho Solto"
msgid "Loose Sand"
msgstr "Areia Solta"
msgid "MIT License: http://www.opensource.org/licenses/MIT"
msgstr "Licensa MIT: http://www.opensource.org/licenses/MIT"
msgid "Molten Glass"
msgstr "Vidro Derretido"
msgid "Molten Rock"
msgstr "Pedra Derretida"
msgid "NodeCore"
msgstr "NodeCore"
msgid "Not all game content is covered by hints. Explore!"
msgstr "As dicas não cobrem todo o conteúdo do jogo. Explore!"
msgid "Player's Guide: Inventory Management"
msgstr "Guia do Jogador: Gerenciamento de Inventário"
msgid "Player's Guide: Pummeling Recipes"
msgstr "Guia do Jogador: Receitas por Esmurrada"
msgid "Prism"
msgstr "Prisma"
msgid "Progress: @1 complete, @2 current, @3 future"
msgstr "Progresso: @1 completo(s), @2 atual(is), @3 futuro(s)"
msgid "Pummel"
msgstr "Esmurrar"
msgid "Sand"
msgstr "Areia"
msgid "See included LICENSE file for full details and credits"
msgstr "Veja o arquivo de LICENSA incluso para créditos e maiores detalhes"
msgid "Shining Lens"
msgstr "Lente Brilhante"
msgid "Sponge"
msgstr "Esponja"
msgid "Staff"
msgstr "Bastão"
msgid "Stick"
msgstr "Graveto"
msgid "Stone"
msgstr "Pedra"
msgid "Stone Chip"
msgstr "Pedaço de Pedra"
msgid "Stone-Tipped Hatchet"
msgstr "Machado com Ponta de Pedra"
msgid "Stone-Tipped Mallet"
msgstr "Marreta com Ponta de Pedra"
msgid "Stone-Tipped Pick"
msgstr "Picareta com Ponta de Pedra"
msgid "Stone-Tipped Spade"
msgstr "Pá com Ponta de Pedra"
msgid "Stump"
msgstr "Toco"
msgid "Teleport to get unstuck (but you can't bring your items)"
msgstr "Teleporte para desprender-se (mas você perderá seus itens)"
msgid "Tempered Lode"
msgstr "Veio Mineral Temperado"
msgid "Tempered Lode Bar"
msgstr "Barra de Veio Mineral Temperado"
msgid "Tempered Lode Hatchet"
msgstr "Machado de Veio Mineral Temperado"
msgid "Tempered Lode Hatchet Head"
msgstr "Cabeça de Machado de Veio Mineral Temperado"
msgid "Tempered Lode Mallet"
msgstr "Marreta de Veio Mineral Temperado"
msgid "Tempered Lode Mallet Head"
msgstr "Cabeça de Marreta de Veio Mineral Temperado"
msgid "Tempered Lode Mattock"
msgstr "Enxada de Veio Mineral Temperado"
msgid "Tempered Lode Mattock Head"
msgstr "Cabeça de Enxada de Veio Mineral Temperado"
msgid "Tempered Lode Pick"
msgstr "Picareta de Veio Mineral Temperado"
msgid "Tempered Lode Pick Head"
msgstr "Cabeça de Picareta de Veio Mineral Temperado"
msgid "Tempered Lode Prill"
msgstr "Lascas de Veio Mineral Temperado"
msgid "Tempered Lode Rod"
msgstr "Vara de Veio Mineral Temperado"
msgid "Tempered Lode Spade"
msgstr "Pá de Veio Mineral Temperado"
msgid "Tempered Lode Spade Head"
msgstr "Cabeça de Enxada de Veio Mineral Temperado"
msgid "Tote (1 Slot)"
msgstr "Bolsa (1 Compartimento)"
msgid "Tote (2 Slots)"
msgstr "Bolsa (2 Compartimentos)"
msgid "Tote (3 Slots)"
msgstr "Bolsa (3 Compartimentos)"
msgid "Tote (4 Slots)"
msgstr "Bolsa (4 Compartimentos)"
msgid "Tote (5 Slots)"
msgstr "Bolsa (5 Compartimentos)"
msgid "Tote (6 Slots)"
msgstr "Bolsa (6 Compartimentos)"
msgid "Tote (7 Slots)"
msgstr "Bolsa (7 Compartimentos)"
msgid "Tote (8 Slots)"
msgstr "Bolsa (8 Compartimentos)"
msgid "Tote Handle"
msgstr "Alça de Bolsa"
msgid "Tree Trunk"
msgstr "Tronco de Árvore"
msgid "Unknown Item"
msgstr "Item Desconhecido"
msgid "Version"
msgstr "Versão"
msgid "Water"
msgstr "Água"
msgid "Wet Aggregate"
msgstr "Massa Úmida"
msgid "Wet Sponge"
msgstr "Esponja Molhada"
msgid "Wooden Adze"
msgstr "Enxó de Madeira"
msgid "Wooden Frame"
msgstr "Estrutura de Madeira"
msgid "Wooden Hatchet"
msgstr "Machado de Madeira"
msgid "Wooden Hatchet Head"
msgstr "Cabeça de Machado de Madeira"
msgid "Wooden Hinged Panel"
msgstr "Painel Articulado de Madeira"
msgid "Wooden Ladder"
msgstr "Escada de Madeira"
msgid "Wooden Mallet"
msgstr "Marreta de Madeira"
msgid "Wooden Mallet Head"
msgstr "Cabeça de Marreta de Madeira"
msgid "Wooden Panel"
msgstr "Painel de Madeira"
msgid "Wooden Pick"
msgstr "Picareta de Madeira"
msgid "Wooden Pick Head"
msgstr "Cabeça de Picareta de Madeira"
msgid "Wooden Plank"
msgstr "Tábua de Madeira"
msgid "Wooden Shelf"
msgstr "Estante de Madeira"
msgid "Wooden Spade"
msgstr "Pá de Madeira"
msgid "Wooden Spade Head"
msgstr "Cabeça de Pá de Madeira"
msgid "https://content.minetest.net/packages/Warr1024/nodecore/"
msgstr "https://content.minetest.net/packages/Warr1024/nodecore/"
msgid "(and @1 more hints)"
msgstr "(e mais @1 dicas)"
msgid "(and 1 more hint)"
msgstr "( e mais 1 dica)"

View File

@ -0,0 +1,627 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-09-12 14:44+0000\n"
"PO-Revision-Date: 2019-09-12 14:44+0000\n"
"Last-Translator: Weblate Admin <warr1024@gmail.com>\n"
"Language-Team: Portuguese (Brazil) <http://nodecore.mine.nu/trans/projects/"
"nodecore/core/pt_BR/>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.8\n"
msgid "(C)2018-2019 by Aaron Suen <warr1024@@gmail.com>"
msgstr "(C)2018-2019 por Aaron Suen <war1024@@gmail.com>"
msgid "- Crafting is done by building recipes in-world."
msgstr "- A Criação de Itens é feita construindo as receitas pelo mundo."
msgid "- Drop items onto ground to create stack nodes. They do not decay."
msgstr "- Solte itens no chão para criar um node de itens amontoados. Eles não desaparecem."
msgid "- If a recipe exists, you will see a special particle effect."
msgstr "- Se uma receita existe, você verá um efeito especial de partícula sair do node."
msgid "- Items picked up try to fit into the current selected slot first."
msgstr "- Os itens pegados são primeiramente armazenados no espaço atualmente selecionado."
msgid "- Order and specific face of placement may matter for crafting."
msgstr "- A ordem e a face em que os itens são colocados pode importar no processo de criação."
msgid "- Recipes are time-based, punching faster does not speed up."
msgstr "- Receitas são cronometradas, bater mais forte não afetará a velocidade delas."
msgid "- Sneak+drop to count out single items from stack."
msgstr "- Use os comandos de agachar e soltar juntos para soltar um só item."
msgid "- Some recipes require "pummeling" a node."
msgstr "- Algumas receitas necessitam que você "esmurre" um node."
msgid "- Stacks may be pummeled, exact item count may matter."
msgstr "- Amontoados de itens podem ser esmurrados, pode ser que precise de uma quantidade exata do item."
msgid "- There is NO inventory screen."
msgstr "- NÃO EXISTE tela de inventário."
msgid "- To pummel, punch a node repeatedly, WITHOUT digging."
msgstr "- Para esmurrar, bata num node repetidamente, SEM QUEBRÁ-LO."
msgid "- Wielded item, target face, and surrounding nodes may matter."
msgstr "- O item segurado, a face do objeto alvo e os nodes ao redor podem importar durante a criação de algo."
msgid "- You do not have to punch very fast (about 1 per second)."
msgstr "- Você não precisa bater muito rápido(basta 1 batida por segundo)."
msgid "...and 1 more hint..."
msgstr "...e mais 1 dica..."
msgid "...and @1 more hints..."
msgstr "...e mais @1 dicas..."
msgid "...have you activated a lens yet?"
msgstr "...você já ativou uma lente?"
msgid "...have you assembled a staff from sticks yet?"
msgstr "...você já montou um bastão usando gravetos?"
msgid "...have you assembled a wooden frame yet?"
msgstr "...você já montou um estrutura de madeira?"
msgid "...have you assembled a wooden ladder yet?"
msgstr "...você já montou uma escada de madeira?"
msgid "...have you assembled a wooden shelf yet?"
msgstr "...você já montou uma estante de madeira?"
msgid "...have you assembled a wooden tool yet?"
msgstr "...você já montou uma ferramenta de madeira?"
msgid "...have you assembled an adze out of sticks yet?"
msgstr "...você já montou um enxó usando gravetos?"
msgid "...have you assembled an annealed lode tote handle yet?"
msgstr "...você já montou uma alça de bolsa recozida?"
msgid "...have you bashed a plank into sticks yet?"
msgstr "...você já quebrou uma tábua em gravetos batendo nela?"
msgid "...have you broken cobble into chips yet?"
msgstr "...você já quebrou pedregulho em pedaços?"
msgid "...have you carved a wooden plank completely yet?"
msgstr "...você já entalhou completamente uma tábua de madeira?"
msgid "...have you carved wooden tool heads from planks yet?"
msgstr "...você já transformou uma tábua em cabeças de ferramentas, entalhando a madeira?"
msgid "...have you chipped chromatic glass into prisms yet?"
msgstr "...você já quebrou um vidro cromático em prismas, lascando o vidro?"
msgid "...have you chopped a lode cube into prills yet?"
msgstr "...você já quebrou um veio mineral em lascas, usando um machado?"
msgid "...have you chopped chromatic glass into lenses yet?"
msgstr "...você já quebrou vidro cromático em lentes, usando um machado?"
msgid "...have you chopped up charcoal yet?"
msgstr "...você já quebrou carvão usando um machado?"
msgid "...have you cold-forged an annealed lode tool head yet?"
msgstr "...você já fez uma forja fria de uma cabeça de ferramenta de veio mineral?"
msgid "...have you cold-forged lode down completely yet?"
msgstr "...você já fez uma forja fria de um veio mineral?"
msgid "...have you cooled molten glass into crude glass yet?"
msgstr "...você já esfriou vidro derretido para que este virasse vidro cru?"
msgid "...have you cut down a tree yet?"
msgstr "...você já cortou uma árvore?"
msgid "...have you dug up a tree stump yet?"
msgstr "...você já desenterrou um toco de árvore?"
msgid "...have you dug up dirt yet?"
msgstr "...você já cavou terra?"
msgid "...have you dug up gravel yet?"
msgstr "...você já cavou cascalho?"
msgid "...have you dug up lode ore yet?"
msgstr "...você já desenterrou um veio mineral?"
msgid "...have you dug up sand yet?"
msgstr "...você já cavou areia?"
msgid "...have you dug up stone yet?"
msgstr "...você já cavou pedra?"
msgid "...have you found a lode stratum yet?"
msgstr "...você já encontrou um estrato de veio mineral?"
msgid "...have you found ash yet?"
msgstr "...você já encontrou cinzas?"
msgid "...have you found charcoal yet?"
msgstr "...você já encontrou carvão?"
msgid "...have you found deep stone strata yet?"
msgstr "...você já encontrou um estrato de pedra profunda?"
msgid "...have you found dry leaves yet?"
msgstr "...você já encontrou folhas secas?"
msgid "...have you found eggcorns yet?"
msgstr "...você já encontrou semente de carvalho?"
msgid "...have you found lode ore yet?"
msgstr "...você já encontrou um veio mineral?"
msgid "...have you found molten rock yet?"
msgstr "...você já encontrou pedra derretida (lava)?"
msgid "...have you found sponges yet?"
msgstr "...você já encontrou esponjas?"
msgid "...have you found sticks yet?"
msgstr "...você já encontrou gravetos?"
msgid "...have you made fire by rubbing sticks together yet?"
msgstr "...você já fez fogo esfregando gravetos?"
msgid "...have you melted down lode metal yet?"
msgstr "...você já derreteu um veio mineral?"
msgid "...have you melted sand into glass yet?"
msgstr "...você já transformou areia em vidro, derretendo a areia?"
msgid "...have you molded molten glass into clear glass yet?"
msgstr "...você já moldou vidro derretido em vidro transparente?"
msgid "...have you packed high-quality charcoal yet?"
msgstr "...você já juntou carvão de alta qualidade?"
msgid "...have you packed stone chips back into cobble yet?"
msgstr "...você já juntou pedaços de pedra para que virassem pedregulho?"
msgid "...have you planted an eggcorn yet?"
msgstr "...você já plantou uma semente de carvalho?"
msgid "...have you produced light from a lens yet?"
msgstr "...você já gerou luz a partir de uma lente?"
msgid "...have you put a stone tip onto a tool yet?"
msgstr "...você já colocou uma ponta de pedra em uma ferramenta?"
msgid "...have you quenched molten glass into chromatic glass yet?"
msgstr "...você já temperou vidro derretido para que virasse vidro cromático?"
msgid "...have you sintered glowing lode into a cube yet?"
msgstr "...você já moldou veio mineral incandescente em um cubo?"
msgid "...have you split a tree trunk into planks yet?"
msgstr "...você já fez tábuas quebrando troncos de madeira?"
msgid "...have you tempered a lode anvil yet?"
msgstr "...você já fez uma bigorna temperando veio mineral?"
msgid "...have you tempered a lode tool head yet?"
msgstr "...você já fez uma cabeça de ferramenta temperando veio mineral?"
msgid "...have you welded a lode pick and spade together yet?"
msgstr "...você já soldou uma picareta de veio mineral com uma pá de veio mineral?"
msgid "About"
msgstr "Sobre"
msgid "Active Lens"
msgstr "Lente Ativa"
msgid "Active Prism"
msgstr "Prisma Ativo"
msgid "Aggregate"
msgstr "Agregar"
msgid "Air"
msgstr "Ar"
msgid "Annealed Lode"
msgstr "Veio Mineral Recozido"
msgid "Annealed Lode Bar"
msgstr "Barra de Veio Mineral Recozida"
msgid "Annealed Lode Hatchet"
msgstr "Machado de Veio Mineral Recozida"
msgid "Annealed Lode Hatchet Head"
msgstr "Cabeça de Machado de Veio Mineral Recozida"
msgid "Annealed Lode Mallet"
msgstr "Marreta de Veio Mineral Recozida"
msgid "Annealed Lode Mallet Head"
msgstr "Cabeça de Marreta de Veio Mineral Recozida"
msgid "Annealed Lode Mattock"
msgstr "Enxada de Veio Mineral Recozida"
msgid "Annealed Lode Mattock Head"
msgstr "Cabeça de Enxada de Veio Mineral Recozida"
msgid "Annealed Lode Pick"
msgstr "Picareta de Veio Mineral Recozida"
msgid "Annealed Lode Pick Head"
msgstr "Cabeça de Picareta de Veio Mineral Recozida"
msgid "Annealed Lode Prill"
msgstr "Lascas de Veio Mineral Recozida"
msgid "Annealed Lode Rod"
msgstr "Vara de Veio Mineral Recozida"
msgid "Annealed Lode Spade"
msgstr "Pá de Veio Mineral Recozida"
msgid "Annealed Lode Spade Head"
msgstr "Cabeça de Pá de Veio Mineral Recozida"
msgid "Ash"
msgstr "Cinza"
msgid "Ash Lump"
msgstr "Nódulo de Cinzas"
msgid "Burning Embers"
msgstr "Brasa Quente"
msgid "Charcoal"
msgstr "Carvão Vegetal"
msgid "Charcoal Lump"
msgstr "Nódulo de Carvão Vegetal"
msgid "Chromatic Glass"
msgstr "Vidro Cromático"
msgid "Clear Glass"
msgstr "Vidro Transparente"
msgid "Cobble"
msgstr "Pedregulho"
msgid "Cobble Hinged Panel"
msgstr "Painel de Pedregulho Articulado"
msgid "Cobble Panel"
msgstr "Painel de Pedregulho"
msgid "Crude Glass"
msgstr "Vidro Bruto"
msgid "DEVELOPMENT VERSION"
msgstr "VERSÃO EM DESENVOLVIMENTO"
msgid "Dirt"
msgstr "Terra"
msgid "Discord: https://discord.gg/SHq2tkb"
msgstr "Discord: https://discord.gg/SHq2tkb"
msgid "Eggcorn"
msgstr "Semente de Carvalho"
msgid "Fire"
msgstr "Fogo"
msgid "Float Glass"
msgstr "Vidro Float"
msgid "GitLab: https://gitlab.com/sztest/nodecore"
msgstr "GitLab: https://gitlab.com/sztest/nodecore"
msgid "Glowing Lode"
msgstr "Veio Mineral Incandescente"
msgid "Glowing Lode Bar"
msgstr "Barra de Veio Mineral Incandescente"
msgid "Glowing Lode Hatchet"
msgstr "Machado de Veio Mineral Incandescente"
msgid "Glowing Lode Hatchet Head"
msgstr "Cabeça de Machado Veio Mineral Incandescente"
msgid "Glowing Lode Mallet"
msgstr "Marreta de Veio Mineral Incandescente"
msgid "Glowing Lode Mallet Head"
msgstr "Cabeça de Marreta Veio Mineral Incandescente"
msgid "Glowing Lode Mattock"
msgstr "Enxada de Veio Mineral Incandescente"
msgid "Glowing Lode Mattock Head"
msgstr "Cabeça de Enxada Veio Mineral Incandescente"
msgid "Glowing Lode Pick"
msgstr "Picareta de Veio Mineral Incandescente"
msgid "Glowing Lode Pick Head"
msgstr "Cabeça de Picareta de Veio Mineral Incandescente"
msgid "Glowing Lode Prill"
msgstr "Lascas de Veio Mineral Incandescente"
msgid "Glowing Lode Rod"
msgstr "Vara de Veio Mineral Incandescente"
msgid "Glowing Lode Spade"
msgstr "Pá de Veio Mineral Incandescente"
msgid "Glowing Lode Spade Head"
msgstr "Cabeça de Pá Veio Mineral Incandescente"
msgid "Grass"
msgstr "Grama"
msgid "Gravel"
msgstr "Cascalho"
msgid "Hints"
msgstr "Dicas"
msgid "Ignore"
msgstr "Ignorar"
msgid "Injury"
msgstr "Ferir"
msgid "Inventory"
msgstr "Inventário"
msgid "Leaves"
msgstr "Folhas"
msgid "Lens"
msgstr "Lente"
msgid "Living Sponge"
msgstr "Esponja Viva"
msgid "Lode Cobble"
msgstr "Veio de Pedregulho"
msgid "Lode Ore"
msgstr "Veio Mineral"
msgid "Loose Cobble"
msgstr "Pedregulho Solta"
msgid "Loose Dirt"
msgstr "Terra Solta"
msgid "Loose Gravel"
msgstr "Cascalho Solto"
msgid "Loose Leaves"
msgstr "Folhas Soltas"
msgid "Loose Lode Cobble"
msgstr "Veio de Pedregulho Solto"
msgid "Loose Sand"
msgstr "Areia Solta"
msgid "MIT License: http://www.opensource.org/licenses/MIT"
msgstr "Licensa MIT: http://www.opensource.org/licenses/MIT"
msgid "Molten Glass"
msgstr "Vidro Derretido"
msgid "Molten Rock"
msgstr "Pedra Derretida"
msgid "NodeCore"
msgstr "NodeCore"
msgid "Not all game content is covered by hints. Explore!"
msgstr "As dicas não cobrem todo o conteúdo do jogo. Explore!"
msgid "Player's Guide: Inventory Management"
msgstr "Guia do Jogador: Gerenciamento de Inventário"
msgid "Player's Guide: Pummeling Recipes"
msgstr "Guia do Jogador: Receitas por Esmurrada"
msgid "Prism"
msgstr "Prisma"
msgid "Progress: @1 complete, @2 current, @3 future"
msgstr "Progresso: @1 completo(s), @2 atual(is), @3 futuro(s)"
msgid "Pummel"
msgstr "Esmurrar"
msgid "Sand"
msgstr "Areia"
msgid "See included LICENSE file for full details and credits"
msgstr "Veja o arquivo de LICENSA incluso para créditos e maiores detalhes"
msgid "Shining Lens"
msgstr "Lente Brilhante"
msgid "Sponge"
msgstr "Esponja"
msgid "Staff"
msgstr "Bastão"
msgid "Stick"
msgstr "Graveto"
msgid "Stone"
msgstr "Pedra"
msgid "Stone Chip"
msgstr "Pedaço de Pedra"
msgid "Stone-Tipped Hatchet"
msgstr "Machado com Ponta de Pedra"
msgid "Stone-Tipped Mallet"
msgstr "Marreta com Ponta de Pedra"
msgid "Stone-Tipped Pick"
msgstr "Picareta com Ponta de Pedra"
msgid "Stone-Tipped Spade"
msgstr "Pá com Ponta de Pedra"
msgid "Stump"
msgstr "Toco"
msgid "Teleport to get unstuck (but you can't bring your items)"
msgstr "Teleporte para desprender-se (mas você perderá seus itens)"
msgid "Tempered Lode"
msgstr "Veio Mineral Temperado"
msgid "Tempered Lode Bar"
msgstr "Barra de Veio Mineral Temperado"
msgid "Tempered Lode Hatchet"
msgstr "Machado de Veio Mineral Temperado"
msgid "Tempered Lode Hatchet Head"
msgstr "Cabeça de Machado de Veio Mineral Temperado"
msgid "Tempered Lode Mallet"
msgstr "Marreta de Veio Mineral Temperado"
msgid "Tempered Lode Mallet Head"
msgstr "Cabeça de Marreta de Veio Mineral Temperado"
msgid "Tempered Lode Mattock"
msgstr "Enxada de Veio Mineral Temperado"
msgid "Tempered Lode Mattock Head"
msgstr "Cabeça de Enxada de Veio Mineral Temperado"
msgid "Tempered Lode Pick"
msgstr "Picareta de Veio Mineral Temperado"
msgid "Tempered Lode Pick Head"
msgstr "Cabeça de Picareta de Veio Mineral Temperado"
msgid "Tempered Lode Prill"
msgstr "Lascas de Veio Mineral Temperado"
msgid "Tempered Lode Rod"
msgstr "Vara de Veio Mineral Temperado"
msgid "Tempered Lode Spade"
msgstr "Pá de Veio Mineral Temperado"
msgid "Tempered Lode Spade Head"
msgstr "Cabeça de Enxada de Veio Mineral Temperado"
msgid "Tote (1 Slot)"
msgstr "Bolsa (1 Compartimento)"
msgid "Tote (2 Slots)"
msgstr "Bolsa (2 Compartimentos)"
msgid "Tote (3 Slots)"
msgstr "Bolsa (3 Compartimentos)"
msgid "Tote (4 Slots)"
msgstr "Bolsa (4 Compartimentos)"
msgid "Tote (5 Slots)"
msgstr "Bolsa (5 Compartimentos)"
msgid "Tote (6 Slots)"
msgstr "Bolsa (6 Compartimentos)"
msgid "Tote (7 Slots)"
msgstr "Bolsa (7 Compartimentos)"
msgid "Tote (8 Slots)"
msgstr "Bolsa (8 Compartimentos)"
msgid "Tote Handle"
msgstr "Alça de Bolsa"
msgid "Tree Trunk"
msgstr "Tronco de Árvore"
msgid "Unknown Item"
msgstr "Item Desconhecido"
msgid "Version"
msgstr "Versão"
msgid "Water"
msgstr "Água"
msgid "Wet Aggregate"
msgstr "Massa Úmida"
msgid "Wet Sponge"
msgstr "Esponja Molhada"
msgid "Wooden Adze"
msgstr "Enxó de Madeira"
msgid "Wooden Frame"
msgstr "Estrutura de Madeira"
msgid "Wooden Hatchet"
msgstr "Machado de Madeira"
msgid "Wooden Hatchet Head"
msgstr "Cabeça de Machado de Madeira"
msgid "Wooden Hinged Panel"
msgstr "Painel Articulado de Madeira"
msgid "Wooden Ladder"
msgstr "Escada de Madeira"
msgid "Wooden Mallet"
msgstr "Marreta de Madeira"
msgid "Wooden Mallet Head"
msgstr "Cabeça de Marreta de Madeira"
msgid "Wooden Panel"
msgstr "Painel de Madeira"
msgid "Wooden Pick"
msgstr "Picareta de Madeira"
msgid "Wooden Pick Head"
msgstr "Cabeça de Picareta de Madeira"
msgid "Wooden Plank"
msgstr "Tábua de Madeira"
msgid "Wooden Shelf"
msgstr "Estante de Madeira"
msgid "Wooden Spade"
msgstr "Pá de Madeira"
msgid "Wooden Spade Head"
msgstr "Cabeça de Pá de Madeira"
msgid "https://content.minetest.net/packages/Warr1024/nodecore/"
msgstr "https://content.minetest.net/packages/Warr1024/nodecore/"

View File

@ -0,0 +1,51 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use JSON qw(from_json);
sub getlang {
my $lang = shift();
my %db;
open(my $fh, "-|", "curl", "https://nodecore.mine.nu/trans/api/translations/nodecore/core/$lang/file/") or die($!);
open(my $raw, ">", "src/$lang.txt") or die($!);
my $id;
while(<$fh>) {
print $raw $_;
m#^\s*msgid\s+"(.*)"\s*$# and $id = $1;
m#^\s*msgstr\s+"(.*)"\s*$# or next;
my $str = $1;
$str =~ m#\S# or next;
$db{$id} = $str;
}
close($fh);
close($raw);
return \%db;
}
sub savelang {
my $lang = shift();
my $en = shift();
my %db = %{getlang($lang)};
map { $en->{$_} and $db{$_} ne $_ or delete $db{$_} } keys %db;
%db or return;
open(my $fh, ">", "nc_api.$lang.tr") or die($!);
print $fh "# textdomain: nc_api\n";
print $fh map { "$_=$db{$_}\n" } sort keys %db;
close($fh);
warn("updated: $lang\n");
}
my $en = getlang("en");
my $page = "https://nodecore.mine.nu/trans/api/translations/?format=json";
while($page) {
open(my $fh, "-|", "curl", $page) or die($!);
my $json = from_json(do { local $/; <$fh> });
close($fh);
$page = $json->{next};
for my $r ( @{$json->{results}} ) {
$r->{component}->{slug} eq "core" or next;
$r->{component}->{project}->{slug} eq "nodecore" or next;
my $code = $r->{language}->{code};
$code eq 'en' or savelang($code, $en);
}
}

View File

@ -0,0 +1,41 @@
-- LUALOCALS < ---------------------------------------------------------
local VoxelArea, ipairs, math, minetest, nodecore, table
= VoxelArea, ipairs, math, minetest, nodecore, table
local math_floor, table_insert
= math.floor, table.insert
-- LUALOCALS > ---------------------------------------------------------
local mapgens = {}
nodecore.registered_mapgen_shared = mapgens
local prios = {}
function nodecore.register_mapgen_shared(func, prio)
prio = prio or 0
local min = 1
local max = #mapgens + 1
while max > min do
local try = math_floor((min + max) / 2)
local oldp = prios[try]
if prio < oldp then
min = try + 1
else
max = try
end
end
table_insert(mapgens, min, func)
table_insert(prios, min, prio)
end
minetest.register_on_generated(function(minp, maxp)
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
local data = vm:get_data()
local area = VoxelArea:new({MinEdge = emin, MaxEdge = emax})
for _, v in ipairs(mapgens) do
v(minp, maxp, area, data, vm, emin, emax)
end
vm:set_data(data)
vm:write_to_map()
end)

88
mods/nc_api/match.lua Normal file
View File

@ -0,0 +1,88 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, pairs, type
= minetest, nodecore, pairs, type
-- LUALOCALS > ---------------------------------------------------------
local match_skip = {
name = true,
param2 = true,
param = true,
groups = true,
stack = true,
count = true,
excess = true,
wear = true,
stacked = true,
any = true
}
function nodecore.match(thing, crit)
if not thing then return end
if type(crit) == "string" then crit = {name = crit} end
if crit.any then
for _, v in pairs(crit.any) do
local found = nodecore.match(thing, v)
if found then return found end
end
return
end
thing.count = thing.count or 1
thing = nodecore.underride({}, thing)
if thing.stack then
thing.name = thing.stack:get_name()
thing.count = thing.stack:get_count()
thing.wear = thing.stack:get_wear()
thing.stacked = true
end
if not thing.name then
thing = nodecore.underride(thing, minetest.get_node(thing))
end
local def = minetest.registered_items[thing.name]
if (not thing.stacked) and def and def.groups and def.groups.is_stack_only then
local stack = nodecore.stack_get(thing)
if stack and not stack:is_empty() then
thing.name = stack:get_name()
def = minetest.registered_items[thing.name]
thing.count = stack:get_count()
thing.wear = stack:get_wear()
end
thing.stacked = true
end
if crit.stacked and not thing.stacked then return end
if crit.stacked == false and thing.stacked then return end
if crit.name and thing.name ~= crit.name then return end
if crit.param2 and thing.param2 ~= crit.param2 then return end
if crit.param and thing.param ~= crit.param then return end
if crit.count and thing.count < crit.count then return end
if crit.count and (not crit.excess) and thing.count > crit.count then return end
if crit.count == nil and thing.count ~= 1 then return end
if crit.wear then
if crit.wear < 1 then crit.wear = crit.wear * 65535 end
if thing.wear > crit.wear then return end
end
if crit.groups then
if (not def) or (not def.groups) then return end
for k, v in pairs(crit.groups) do
if v == true then
if not def.groups[k] then return end
elseif v == false then
if def.groups[k] then return end
else
if def.groups[k] ~= v then return end
end
end
end
for k, v in pairs(crit) do
if not match_skip[k] then
if not def or def[k] ~= v then return end
end
end
return thing
end

1
mods/nc_api/mod.conf Normal file
View File

@ -0,0 +1 @@
name = nc_api

View File

@ -0,0 +1,65 @@
-- LUALOCALS < ---------------------------------------------------------
local math, minetest, nodecore
= math, minetest, nodecore
local math_random
= math.random
-- LUALOCALS > ---------------------------------------------------------
function nodecore.register_ambiance(def)
local max = def.queue_max or 100
local rate = 1 / (def.queue_rate or 20)
local seen = {}
local queue = {}
local total = 0
local batch
local time = 0
minetest.register_globalstep(function(dtime)
time = time + dtime
while time > rate do
if not batch then
if #queue < 1 then return end
batch = queue
queue = {}
total = 0
seen = {}
end
local opts = batch[#batch]
batch[#batch] = nil
if #batch < 1 then batch = nil end
opts.name = opts.name or def.sound_name
opts.gain = opts.gain or def.sound_gain
minetest.sound_play(opts.name, opts)
time = time - rate
end
end)
def.action = function(pos)
local hash = minetest.hash_node_position(pos)
if seen[hash] then return end
seen[hash] = true
local opts
if def.check then
opts = def.check(pos)
if not opts then return end
else
opts = {}
end
opts.pos = pos
if #queue < max then
queue[#queue + 1] = opts
else
local r = math_random(1, total + 1)
if r <= #queue then
queue[r] = opts
end
end
total = total + 1
end
return nodecore.register_limited_abm(def)
end

View File

@ -0,0 +1,74 @@
-- LUALOCALS < ---------------------------------------------------------
local math, minetest, nodecore, pairs, unpack
= math, minetest, nodecore, pairs, unpack
local math_random
= math.random
-- LUALOCALS > ---------------------------------------------------------
local genlabels = 0
function nodecore.register_limited_abm(def)
def = nodecore.underride(def, {
limited_queue = {},
limited_seen = {},
limited_qty = 0,
limited_max = 1000,
limited_interval = 1,
limited_jitter = 0.05,
limited_action = def.action or function() end,
catch_up = false
})
if not def.label then
def.label = minetest.get_current_modname() .. ":" .. genlabels
genlabels = genlabels + 1
end
def.limited_alert = def.limited_alert or def.limited_max
def.action = function(pos, ...)
local hash = minetest.hash_node_position(pos)
local seen = def.limited_seen
if seen[hash] then return end
seen[hash] = true
local q = def.limited_queue
local max = def.limited_max
local nqty = def.limited_qty + 1
if #q < max then
q[#q + 1] = {pos, ...}
else
local r = math_random(1, nqty)
if r <= #q then q[r] = {pos, ...} end
end
def.limited_qty = nqty
end
local function pumpq()
minetest.after(def.limited_interval
- def.limited_jitter
+ def.limited_jitter * math_random() * 2,
pumpq)
if def.limited_qty >= def.limited_alert then
minetest.log("limited abm \"" .. def.label .. "\" filled ("
.. def.limited_qty .. "/" .. def.limited_max .. ")")
end
local act = def.limited_action
for _, args in pairs(def.limited_queue) do
local pos = args[1]
local node = pos and args[2]
local nn = node and minetest.get_node_or_nil(pos)
if nn and nn.name == node.name then
act(unpack(args))
end
end
def.limited_queue = {}
def.limited_seen = {}
def.limited_qty = 0
end
pumpq()
return minetest.register_abm(def)
end

View File

@ -0,0 +1,34 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, pairs, string, table
= minetest, nodecore, pairs, string, table
local string_format, table_concat, table_sort
= string.format, table.concat, table.sort
-- LUALOCALS > ---------------------------------------------------------
nodecore.coremods = {}
function nodecore.amcoremod(v)
nodecore.coremods[minetest.get_current_modname()] = (v == nil) or v
end
nodecore.amcoremod()
for k, v in pairs(minetest.registered_chatcommands) do
if k == "mods" then
minetest.override_chatcommand(k, nodecore.underride({
func = function()
local mods = {}
for _, n in pairs(minetest.get_modnames()) do
if not nodecore.coremods[n] then
mods[#mods + 1] = n
end
end
table_sort(mods)
return true, string_format("%s(%s)%s%s",
nodecore.product,
nodecore.version or "DEV",
#mods > 0 and " + " or "",
table_concat(mods, ", "))
end
}, v))
end
end

View File

@ -0,0 +1,68 @@
-- LUALOCALS < ---------------------------------------------------------
local error, math, minetest, nodecore, type
= error, math, minetest, nodecore, type
local math_floor, math_sqrt
= math.floor, math.sqrt
-- LUALOCALS > ---------------------------------------------------------
function nodecore.register_soaking_abm(def)
def.qtyfield = def.qtyfield or "soakqty"
def.timefield = def.timefield or "soaktime"
def.soakinterval = def.soakinterval or ((def.interval or 1) * (def.chance or 1))
if not def.soakrate then error("soaking abm missing soakrate callback") end
if not def.soakcheck then error("soaking abm missing soakcheck callback") end
def.soakvary = def.soakvary or 0.25
if not def.soakrand then
if def.soakvary then
def.soakrand = function(rate, ticks)
return rate * (1 + def.soakvary * nodecore.boxmuller()
/ math_sqrt(ticks)) * ticks
end
else
def.soakrand = function(rate, ticks) return rate * ticks end
end
end
def.action = function(pos, ...)
local now = minetest.get_gametime()
local meta = minetest.get_meta(pos)
local total = meta:get_float(def.qtyfield) or 0
local start = meta:get_float(def.timefield)
start = start and start ~= 0 and start or now
local rate = 0
local delta = 0
if start <= now then
rate = def.soakrate(pos, ...)
if rate == false then
meta:set_string(def.qtyfield, "")
meta:set_string(def.timefield, "")
return
end
rate = rate or 0
local ticks = 1 + math_floor((now - start) / def.soakinterval)
delta = def.soakrand(rate, ticks)
total = total + delta
start = start + ticks * def.soakinterval
end
local set = def.soakcheck({
rate = rate,
delta = delta,
total = total
}, pos, ...)
if set == false then
meta:set_string(def.qtyfield, "")
meta:set_string(def.timefield, "")
return
end
meta:set_float(def.qtyfield, set and type(set) == "number" and set or total)
meta:set_float(def.timefield, start)
end
return nodecore.register_limited_abm(def)
end

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 B

View File

@ -0,0 +1,26 @@
-- LUALOCALS < ---------------------------------------------------------
local error, ipairs, minetest, nodecore
= error, ipairs, minetest, nodecore
-- LUALOCALS > ---------------------------------------------------------
function nodecore.ezschematic(key, yslices, init)
local size = {}
local data = {}
size.y = #yslices
for y, ys in ipairs(yslices) do
if size.z and size.z ~= #ys then error("inconsistent z size") end
size.z = #ys
for z, zs in ipairs(ys) do
if size.x and size.x ~= #zs then error("inconsistent x size") end
size.x = #zs
for x = 1, zs:len() do
data[(z - 1) * size.x * size.y + (y - 1) * size.x + x]
= key[zs:sub(x, x)]
end
end
end
init = init or {}
init.size = size
init.data = data
return minetest.register_schematic(init)
end

View File

@ -0,0 +1,58 @@
-- LUALOCALS < ---------------------------------------------------------
local nodecore, pairs, vector
= nodecore, pairs, vector
-- LUALOCALS > ---------------------------------------------------------
local alldirs = {}
for _, v in pairs(nodecore.dirs()) do
alldirs[v.n] = v
end
local facedirs = {
{"u", "w"},
{"u", "n"},
{"u", "e"},
{"n", "u"},
{"n", "w"},
{"n", "d"},
{"n", "e"},
{"s", "d"},
{"s", "w"},
{"s", "u"},
{"s", "e"},
{"e", "s"},
{"e", "u"},
{"e", "n"},
{"e", "d"},
{"w", "s"},
{"w", "d"},
{"w", "n"},
{"w", "u"},
{"d", "s"},
{"d", "e"},
{"d", "n"},
{"d", "w"},
[0] = {"u", "s"}
}
local function cross(a, b)
return {
x = a.y * b.z - a.z * b.y,
y = a.z * b.x - a.x * b.z,
z = a.x * b.y - a.y * b.x
}
end
for k, t in pairs(facedirs) do
t.id = k
t.t = alldirs[t[1]]
t.f = alldirs[t[2]]
t[2] = nil
t[1] = nil
t.l = cross(t.t, t.f)
t.r = vector.multiply(t.l, -1)
t.b = vector.multiply(t.t, -1)
t.k = vector.multiply(t.f, -1)
end
nodecore.facedirs = facedirs

View File

@ -0,0 +1,19 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, pairs
= minetest, nodecore, pairs
-- LUALOCALS > ---------------------------------------------------------
local queue
function nodecore.fallcheck(pos)
if not queue then
queue = {}
minetest.after(0, function()
for _, p in pairs(queue) do
minetest.check_for_falling(p)
end
queue = nil
end)
end
queue[minetest.pos_to_string(pos)] = pos
end

273
mods/nc_api/util_misc.lua Normal file
View File

@ -0,0 +1,273 @@
-- LUALOCALS < ---------------------------------------------------------
local ItemStack, ipairs, math, minetest, nodecore, pairs, type, unpack
= ItemStack, ipairs, math, minetest, nodecore, pairs, type, unpack
local math_cos, math_log, math_pi, math_random, math_sin, math_sqrt
= math.cos, math.log, math.pi, math.random, math.sin, math.sqrt
-- LUALOCALS > ---------------------------------------------------------
for k, v in pairs(minetest) do
if type(v) == "function" then
-- Late-bind in case minetest methods overridden.
nodecore[k] = function(...) return minetest[k](...) end
else
nodecore[k] = v
end
end
local function underride(t, u, u2, ...)
if u2 then underride(u, u2, ...) end
for k, v in pairs(u) do
if t[k] == nil then
t[k] = v
elseif type(t[k]) == "table" and type(v) == "table" then
underride(t[k], v)
end
end
return t
end
nodecore.underride = underride
function nodecore.mkreg()
local t = {}
local f = function(x) t[#t + 1] = x end
return f, t
end
function nodecore.memoize(func)
local cache
return function()
if cache then return cache[1] end
cache = {func()}
return cache[1]
end
end
function nodecore.dirs()
return {
{n = "e", x = 1, y = 0, z = 0},
{n = "w", x = -1, y = 0, z = 0},
{n = "u", x = 0, y = 1, z = 0},
{n = "d", x = 0, y = -1, z = 0},
{n = "n", x = 0, y = 0, z = 1},
{n = "s", x = 0, y = 0, z = -1}
}
end
function nodecore.pickrand(tbl, weight)
weight = weight or function() end
local t = {}
local max = 0
for k, v in pairs(tbl) do
local w = weight(v) or 1
if w > 0 then
max = max + w
t[#t + 1] = {w = w, k = k, v = v}
end
end
if max <= 0 then return end
max = math_random() * max
for _, v in ipairs(t) do
max = max - v.w
if max <= 0 then return v.v, v.k end
end
end
do
local saved
function nodecore.boxmuller()
local old = saved
if old then
saved = nil
return old
end
local r = math_sqrt(-2 * math_log(math_random()))
local t = 2 * math_pi * math_random()
saved = r * math_sin(t)
return r * math_cos(t)
end
end
function nodecore.extend_item(name, func)
local orig = minetest.registered_items[name] or {}
local copy = {}
for k, v in pairs(orig) do copy[k] = v end
copy = func(copy, orig) or copy
minetest.register_item(":" .. name, copy)
end
function nodecore.fixedbox(x, ...)
return {type = "fixed", fixed = {
x or {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
...
}}
end
function nodecore.interact(player)
if type(player) ~= "string" then
player = player:get_player_name()
end
return minetest.get_player_privs(player).interact
end
function nodecore.wieldgroup(who, group)
local wielded = who and who:get_wielded_item()
local nodedef = minetest.registered_nodes[wielded:get_name()]
if nodedef then return nodedef.groups and nodedef.groups[group] end
local caps = wielded and wielded:get_tool_capabilities()
return caps and caps.groupcaps and caps.groupcaps[group]
end
function nodecore.toolspeed(what, groups)
if not what then return end
local dg = what:get_tool_capabilities().groupcaps
local t
for gn, lv in pairs(groups) do
local gt = dg[gn]
gt = gt and gt.times
gt = gt and gt[lv]
if gt and (not t or t > gt) then t = gt end
end
if (not t) and (not what:is_empty()) then
return nodecore.toolspeed(ItemStack(""), groups)
end
return t
end
function nodecore.interval(after, func)
local function go()
minetest.after(after, go)
return func()
end
minetest.after(after, go)
end
function nodecore.wear_wield(player, groups, qty)
local wielded = player:get_wielded_item()
if wielded then
local wdef = wielded:get_definition()
local tp = wielded:get_tool_capabilities()
local dp = minetest.get_dig_params(groups, tp)
if wdef and wdef.after_use then
wielded = wdef.after_use(wielded, player, nil, dp) or wielded
else
if not minetest.settings:get_bool("creative_mode") then
wielded:add_wear(dp.wear * (qty or 1))
if wielded:get_count() <= 0 and wdef.sound
and wdef.sound.breaks then
minetest.sound_play(wdef.sound.breaks,
{object = player, gain = 0.5})
end
end
end
return player:set_wielded_item(wielded)
end
end
function nodecore.consume_wield(player, qty)
local wielded = player:get_wielded_item()
if wielded then
local wdef = wielded:get_definition()
if wdef.stack_max > 1 and qty then
local have = wielded:get_count() - qty
if have <= 0 then
wielded = ItemStack("")
else
wielded:set_count(have)
end
end
return player:set_wielded_item(wielded)
end
end
function nodecore.loaded_mods()
local t = {}
for _, v in pairs(minetest.get_modnames()) do
t[v] = true
end
return t
end
function nodecore.node_group(name, pos, node)
node = node or minetest.get_node(pos)
local def = minetest.registered_nodes[node.name] or {}
return def.groups and def.groups[name]
end
function nodecore.item_eject(pos, stack, speed, qty, vel)
stack = ItemStack(stack)
speed = speed or 0
vel = vel or {x = 0, y = 0, z = 0}
if speed == 0 and vel.x == 0 and vel.y == 0 and vel.z == 0
and nodecore.place_stack and minetest.get_node(pos).name == "air" then
stack:set_count(stack:get_count() * (qty or 1))
return nodecore.place_stack(pos, stack)
end
for _ = 1, (qty or 1) do
local v = {
x = vel.x + (math_random() - 0.5) * speed,
y = vel.y + math_random() * speed,
z = vel.z + (math_random() - 0.5) * speed,
}
local p = {
x = v.x > 0 and pos.x + 0.4 or v.x < 0 and pos.x - 0.4 or pos.x,
y = pos.y + 0.25,
z = v.z > 0 and pos.z + 0.4 or v.z < 0 and pos.z - 0.4 or pos.z,
}
local obj = minetest.add_item(p, stack)
if obj then obj:set_velocity(v) end
end
end
function nodecore.quenched(pos)
return #minetest.find_nodes_in_area(
{x = pos.x - 1, y = pos.y - 1, z = pos.z - 1},
{x = pos.x + 1, y = pos.y + 1, z = pos.z + 1},
{"group:coolant"}) > 0
end
function nodecore.node_spin_custom(...)
local arr = {...}
arr[0] = false
local lut = {}
for i = 1, #arr do
lut[arr[i - 1]] = arr[i]
end
lut[arr[#arr]] = arr[1]
local qty = #arr
return function(pos, node, clicker, itemstack)
node = node or minetest.get_node(pos)
node.param2 = lut[node.param2] or lut[false]
if clicker:is_player() then
minetest.log(clicker:get_player_name() .. " spins "
.. node.name .. " at " .. minetest.pos_to_string(pos)
.. " to param2 " .. node.param2 .. " ("
.. qty .. " total)")
end
minetest.swap_node(pos, node)
nodecore.node_sound(pos, "place")
local def = minetest.registered_items[node.name] or {}
if def.on_spin then def.on_spin(pos, node) end
return itemstack
end
end
function nodecore.node_spin_filtered(func)
local rots = {}
for i = 0, 23 do
local f = nodecore.facedirs[i]
local hit
for j = 1, #rots do
if not hit then
local o = nodecore.facedirs[rots[j]]
hit = hit or func(f, o)
end
end
if not hit then rots[#rots + 1] = f.id end
end
return nodecore.node_spin_custom(unpack(rots))
end
function nodecore.node_change(pos, node, newname)
if node.name == newname then return end
return minetest.set_node(pos, underride({name = newname}, node))
end

View File

@ -0,0 +1,13 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore
= minetest, nodecore
-- LUALOCALS > ---------------------------------------------------------
function nodecore.buildable_to(thing)
if not thing.name then
thing = nodecore.underride(thing, minetest.get_node(thing))
end
if thing.name == "ignore" then return end
local def = minetest.registered_items[thing.name] or {}
return def.buildable_to
end

View File

@ -0,0 +1,32 @@
-- LUALOCALS < ---------------------------------------------------------
local math, minetest, nodecore
= math, minetest, nodecore
local math_ceil
= math.ceil
-- LUALOCALS > ---------------------------------------------------------
local function getphealth(player)
return player:get_hp() + player:get_meta():get_float("dhp")
end
nodecore.getphealth = getphealth
local function setphealth(player, hp)
if hp > 20 then hp = 20 end
if hp < 0 then hp = 0 end
local whole = math_ceil(hp)
if whole == 0 then whole = 1 end
local dhp = hp - whole
player:get_meta():set_float("dhp", dhp)
return player:set_hp(whole)
end
nodecore.setphealth = setphealth
local function addphealth(player, hp)
return setphealth(player, getphealth(player) + hp)
end
nodecore.addphealth = addphealth
function nodecore.node_punch_hurt(pos, node, puncher, ...)
if puncher and puncher:is_player() then addphealth(puncher, -1) end
return minetest.node_punch(pos, node, puncher, ...)
end

View File

@ -0,0 +1,41 @@
-- LUALOCALS < ---------------------------------------------------------
local ipairs, math, minetest, nodecore, pairs, table
= ipairs, math, minetest, nodecore, pairs, table
local math_random, table_insert
= math.random, table.insert
-- LUALOCALS > ---------------------------------------------------------
local dirs = nodecore.dirs()
function nodecore.scan_flood(pos, range, func)
local q = {pos}
local seen = { }
for d = 0, range do
local nxt = {}
for _, p in ipairs(q) do
local res = func(p, d)
if res then return res end
if res == nil then
for _, v in pairs(dirs) do
local np = {
x = p.x + v.x,
y = p.y + v.y,
z = p.z + v.z
}
local nk = minetest.hash_node_position(np)
if not seen[nk] then
seen[nk] = true
np.dir = v
table_insert(nxt, np)
end
end
end
end
if #nxt < 1 then break end
for i = 1, #nxt do
local j = math_random(1, #nxt)
nxt[i], nxt[j] = nxt[j], nxt[i]
end
q = nxt
end
end

View File

@ -0,0 +1,76 @@
-- LUALOCALS < ---------------------------------------------------------
local ItemStack, ipairs, math, minetest, nodecore, pairs, type, unpack,
vector
= ItemStack, ipairs, math, minetest, nodecore, pairs, type, unpack,
vector
local math_exp, math_random, math_sin, math_sqrt
= math.exp, math.random, math.sin, math.sqrt
-- LUALOCALS > ---------------------------------------------------------
local oldplay = minetest.sound_play
function minetest.sound_play(name, spec, ...)
if spec and type(spec) == "table" and spec.pitch == nil then
spec.pitch = math_exp((math_random() - 0.5) * (spec.pitchvary or 0.05))
end
return oldplay(name, spec, ...)
end
function nodecore.windiness(y)
if y < 0 then return 0 end
if y > 512 then y = 512 end
return math_sqrt(y) * (1 + 0.5 * math_sin(minetest.get_gametime() / 5))
end
function nodecore.stack_sounds(pos, kind, stack)
stack = stack or nodecore.stack_get(pos)
stack = ItemStack(stack)
if stack:is_empty() then return end
local def = minetest.registered_items[stack:get_name()] or {}
if (not def.sounds) or (not def.sounds[kind]) then return end
local t = {}
for k, v in pairs(def.sounds[kind]) do t[k] = v end
t.pos = pos
return minetest.sound_play(t.name, t)
end
function nodecore.stack_sounds_delay(...)
local t = {...}
minetest.after(0, function()
nodecore.stack_sounds(unpack(t))
end)
end
function nodecore.sounds(name, gfoot, gdug, gplace)
return {
footstep = {name = name, gain = gfoot or 0.2},
dig = {name = name, gain = gdug or 0.5},
dug = {name = name, gain = gdug or 1},
place = {name = name, gain = gplace or 1}
}
end
function nodecore.sound_play_except(name, def, pname)
if not pname then
return minetest.sound_play(name, def)
end
if type(pname) ~= "string" then
pname = pname:get_player_name()
end
for _, p in ipairs(minetest.get_connected_players()) do
local pn = p:get_player_name()
if pn ~= pname and ((not def.pos)
or (vector.distance(p:get_pos(), def.pos) <= 32)) then
def.to_player = pn
minetest.sound_play(name, def)
end
end
end
function nodecore.node_sound(pos, kind, opts)
if nodecore.stack_sounds(pos, kind) then return end
local node = opts and opts.node or minetest.get_node(pos)
local def = minetest.registered_items[node.name] or {}
if (not def.sounds) or (not def.sounds[kind]) then return end
local t = {}
for k, v in pairs(def.sounds[kind]) do t[k] = v end
t.pos = pos
return nodecore.sound_play_except(t.name, t, opts and opts.except)
end

View File

@ -0,0 +1,79 @@
-- LUALOCALS < ---------------------------------------------------------
local ItemStack, ipairs, minetest, nodecore
= ItemStack, ipairs, minetest, nodecore
-- LUALOCALS > ---------------------------------------------------------
local function family(stack)
if stack:is_empty() then return "" end
local name = stack:get_name()
local def = minetest.registered_items[name]
return def and def.stackfamily or stack:to_string()
end
function nodecore.stack_merge(dest, src)
if dest:is_empty() then return dest:add_item(src) end
if family(src) ~= family(dest) then
return dest:add_item(src)
end
local o = src:get_name()
src:set_name(dest:get_name())
src = dest:add_item(src)
if not src:is_empty() then
src:set_name(o)
end
return src
end
function nodecore.node_inv(pos)
return minetest.get_meta(pos):get_inventory()
end
function nodecore.stack_get(pos)
return nodecore.node_inv(pos):get_stack("solo", 1)
end
local function update(pos, ...)
for _, v in ipairs(nodecore.visinv_update_ents(pos)) do
v:get_luaentity():itemcheck()
end
return ...
end
function nodecore.stack_set(pos, stack)
return update(pos, nodecore.node_inv(pos):set_stack("solo", 1, ItemStack(stack)))
end
function nodecore.stack_add(pos, stack)
local node = minetest.get_node(pos)
local def = minetest.registered_items[node.name] or {}
if def.stack_allow then
local ret = def.stack_allow(pos, node, stack)
if ret == false then return stack end
if ret and ret ~= true then return ret end
end
stack = ItemStack(stack)
local item = nodecore.stack_get(pos)
local left
if item:is_empty() then
left = nodecore.node_inv(pos):add_item("solo", stack)
else
left = nodecore.stack_merge(item, stack)
nodecore.stack_set(pos, item)
end
if left:get_count() ~= stack:get_count() then
nodecore.stack_sounds(pos, "place")
end
return update(pos, left)
end
function nodecore.stack_giveto(pos, player)
local stack = nodecore.stack_get(pos)
local qty = stack:get_count()
if qty < 1 then return true end
stack = player:get_inventory():add_item("main", stack)
if stack:get_count() == qty then return stack:is_empty() end
nodecore.stack_sounds(pos, "dug")
nodecore.stack_set(pos, stack)
return stack:is_empty()
end

View File

@ -0,0 +1,35 @@
-- LUALOCALS < ---------------------------------------------------------
local math, nodecore, pairs
= math, nodecore, pairs
local math_pow
= math.pow
-- LUALOCALS > ---------------------------------------------------------
local basetimes = {
cracky = 3,
thumpy = 2,
choppy = 2,
crumbly = 0.5,
snappy = 0.4,
}
function nodecore.toolcaps(opts)
if opts.uses == nil then opts.uses = 1 end
local gcaps = {}
for gn, bt in pairs(basetimes) do
local lv = opts[gn]
if lv then
local times = {}
for n = 1, lv do
local tt = math_pow(0.5, lv - n) * bt
if tt < 0.25 then tt = 0.25 end
times[n] = tt
end
gcaps[gn] = {
times = times,
uses = 5 * math_pow(3, lv) * opts.uses
}
end
end
return { groupcaps = gcaps, opts = opts }
end

View File

@ -0,0 +1,48 @@
-- LUALOCALS < ---------------------------------------------------------
local ipairs, minetest, nodecore, pairs, table, type
= ipairs, minetest, nodecore, pairs, table, type
local table_sort
= table.sort
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
local strings = {}
local strings_dirty
local prefix = minetest.translate(modname, "x")
prefix = prefix:sub(1, prefix:find(modname) - 1)
function nodecore.translate_inform(str)
if (not str) or (type(str) ~= "string") or (#str < 1)
or (str:sub(1, #prefix) == prefix) then return end
if not strings[str] then
strings[str] = true
strings_dirty = true
end
return true
end
function nodecore.translate(str, ...)
if not nodecore.translate_inform(str) then return str end
return minetest.translate(modname, str, ...)
end
minetest.register_globalstep(function()
if not strings_dirty then return end
strings_dirty = nil
local keys = {}
for k in pairs(strings) do keys[#keys + 1] = k end
table_sort(keys)
local data = "# textdomain: " .. modname .. "\n"
for _, k in ipairs(keys) do
data = data .. k .. "=" .. "\n"
end
local p = minetest.get_worldpath() .. "/" .. modname .. ".template.tr"
return minetest.safe_file_write(p, data)
end)

12
mods/nc_api/version.lua Normal file
View File

@ -0,0 +1,12 @@
-- LUALOCALS < ---------------------------------------------------------
local math, tonumber
= math, tonumber
local math_floor
= math.floor
-- LUALOCALS > ---------------------------------------------------------
local stamp = tonumber("$Format:%at$")
if not stamp then return end
stamp = math_floor((stamp - 1540612800) / 60)
stamp = ("00000000" .. stamp):sub(-8)
return stamp .. "-$Format:%h$"

View File

@ -0,0 +1,168 @@
-- LUALOCALS < ---------------------------------------------------------
local ItemStack, ipairs, minetest, nodecore, pairs, type
= ItemStack, ipairs, minetest, nodecore, pairs, type
-- LUALOCALS > ---------------------------------------------------------
local function addgroups(sum, pos)
local node = minetest.get_node(pos)
local def = minetest.registered_items[node.name] or {}
if not def.groups then return end
for k, v in pairs(def.groups) do
sum[k] = (sum[k] or 0) + v
end
end
local function craftcheck(recipe, pos, node, data, xx, xz, zx, zz)
local function rel(x, y, z)
return {
x = pos.x + xx * x + zx * z,
y = pos.y + y,
z = pos.z + xz * x + zz * z
}
end
data.rel = rel
data.wield = ItemStack(data.wield or data.crafter and data.crafter:get_wielded_item())
if recipe.check and not recipe.check(pos, data) then return end
if recipe.wield and (not data.wield or not nodecore.match(
{stack = data.wield}, recipe.wield)) then return end
if recipe.normal then
if data.pointed.type ~= "node" or
recipe.normal.y ~= data.pointed.above.y - data.pointed.under.y then return end
local rx = recipe.normal.x * xx + recipe.normal.z * zx
if rx ~= data.pointed.above.x - data.pointed.under.x then return end
local rz = recipe.normal.x * xz + recipe.normal.z * zz
if rz ~= data.pointed.above.z - data.pointed.under.z then return end
end
for _, v in pairs(recipe.nodes) do
if v ~= recipe.root and v.match then
local p = rel(v.x, v.y, v.z)
if not nodecore.match(p, v.match) then return end
end
end
if recipe.touchgroups then
local sum = {}
addgroups(sum, rel(1, 0, 0))
addgroups(sum, rel(-1, 0, 0))
addgroups(sum, rel(0, 1, 0))
addgroups(sum, rel(0, -1, 0))
addgroups(sum, rel(0, 0, 1))
addgroups(sum, rel(0, 0, -1))
for k, v in pairs(recipe.touchgroups) do
local w = sum[k] or 0
if v > 0 and w < v then return end
if v <= 0 and w > -v then return end
end
end
local mindur = recipe.duration or 0
if type(mindur) == "function" then mindur = mindur(recipe, pos, node, data) end
if recipe.toolgroups then
if not data.wield then return end
local dg = data.wield:get_tool_capabilities().groupcaps
local t
for gn, lv in pairs(recipe.toolgroups) do
local gt = dg[gn]
gt = gt and gt.times
gt = gt and gt[lv]
if gt and (not t or t > gt) then t = gt end
end
if not t then return end
mindur = mindur + t
end
if mindur > 0 then
if not data.duration then return end
local dur = data.duration
if type(dur) == "function" then dur = dur(pos, data) end
if not dur or dur < mindur then
if data.inprogress then data.inprogress(pos, data) end
return 1
end
end
if data.before then data.before(pos, data) end
if recipe.before then recipe.before(pos, data) end
for _, v in ipairs(recipe.nodes) do
if v.replace then
local p = rel(v.x, v.y, v.z)
local r = v.replace
while type(r) == "function" do
r = r(p, v)
end
if r and type(r) == "string" then
r = {name = r}
end
if v.match.excess then
local s = nodecore.stack_get(p)
local x = s:get_count() - (v.match.count or 1)
if x > 0 then
s:set_count(x)
nodecore.item_eject(p, s, 0.001)
end
nodecore.stack_set(p, ItemStack(""))
end
if r then
local n = minetest.get_node(p)
r.param2 = n.param2
minetest.set_node(p, r)
nodecore.node_sound(p, "place")
nodecore.fallcheck(p)
end
end
end
if recipe.items then
for _, v in pairs(recipe.items) do
nodecore.item_eject(rel(v.x or 0, v.y or 0, v.z or 0),
v.name, v.scatter, v.count, v.velocity)
end
end
if recipe.consumewield then
nodecore.consume_wield(data.crafter, recipe.consumewield)
elseif recipe.toolgroups and recipe.toolwear and data.crafter then
nodecore.wear_wield(data.crafter, recipe.toolgroups, recipe.toolwear)
end
if recipe.after then recipe.after(pos, data) end
if data.after then data.after(pos, data) end
if nodecore.player_stat_add then
nodecore.player_stat_add(1, data.crafter, "craft", recipe.label)
end
minetest.log((data.crafter and data.crafter:get_player_name() or "unknown")
.. " completed recipe \"" .. recipe.label .. "\" at " ..
minetest.pos_to_string(pos) .. " upon " .. node.name)
return true
end
local function tryall(rc, pos, node, data)
local function go(xx, xz, zx, zz)
return craftcheck(rc, pos, node, data, xx, xz, zx, zz)
end
local r = go(1, 0, 0, 1)
if r then return r end
if not rc.norotate then
r = go(0, -1, 1, 0)
or go(-1, 0, 0, -1)
or go(0, 1, -1, 0)
if r then return r end
if not rc.nomirror then
r = go(-1, 0, 0, 1)
or go(0, 1, 1, 0)
or go(1, 0, 0, -1)
or go(0, -1, -1, 0)
end
end
return r
end
function nodecore.craft_check(pos, node, data)
data = data or {}
node.x = pos.x
node.y = pos.y
node.z = pos.z
data.pos = pos
data.node = node
for _, rc in ipairs(nodecore.craft_recipes) do
if data.action == rc.action
and nodecore.match(node, rc.root.match) then
data.recipe = rc
local r = tryall(rc, pos, node, data)
if r then return r == true end
end
end
end

View File

@ -0,0 +1,41 @@
-- LUALOCALS < ---------------------------------------------------------
local math, minetest, nodecore, type
= math, minetest, nodecore, type
local math_random
= math.random
-- LUALOCALS > ---------------------------------------------------------
local smoking = {}
function nodecore.smokefx(pos, time, qty)
local now = minetest.get_us_time() / 1000000
local key = minetest.hash_node_position(pos)
local old = smoking[key]
if old and now < old.exp then minetest.delete_particlespawner(old.id) end
if (not time) or (time <= 0) then
smoking[key] = nil
return
end
if type(qty) ~= "number" then qty = 1 end
if qty < 1 then
if math_random() > qty then return end
qty = 1
end
smoking[key] = {
id = minetest.add_particlespawner({
texture = "nc_api_craft_smoke.png",
collisiondetection = true,
amount = (qty or 2) * time,
time = time,
minpos = {x = pos.x - 0.4, y = pos.y - 0.4, z = pos.z - 0.4},
maxpos = {x = pos.x + 0.4, y = pos.y + 0.4, z = pos.z + 0.4},
minvel = {x = -0.1, y = 0.3, z = -0.1},
maxvel = {x = 0.1, y = 0.7, z = 0.1},
minexptime = 1,
maxexptime = 5,
minsize = 1,
maxsize = 3
}),
exp = now + time
}
end

View File

@ -0,0 +1,13 @@
-- LUALOCALS < ---------------------------------------------------------
local include, nodecore
= include, nodecore
-- LUALOCALS > ---------------------------------------------------------
nodecore.amcoremod()
include("register_craft")
include("craft_check")
include("item_place_node")
include("on_punchnode")
include("fx_smoke")
include("register_cook_abm")

View File

@ -0,0 +1,25 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore
= minetest, nodecore
-- LUALOCALS > ---------------------------------------------------------
local old_place = minetest.item_place_node
function minetest.item_place_node(itemstack, placer, pointed_thing, ...)
local old_add = minetest.add_node
minetest.add_node = function(pos, node, ...)
local function helper2(...)
nodecore.craft_check(pos, node, {
action = "place",
crafter = placer,
pointed = pointed_thing
})
return ...
end
return helper2(old_add(pos, node, ...))
end
local function helper(...)
minetest.add_node = old_add
return ...
end
return helper(old_place(itemstack, placer, pointed_thing, ...))
end

View File

@ -0,0 +1,2 @@
name = nc_api_craft
depends = nc_api

View File

@ -0,0 +1,91 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, vector
= minetest, nodecore, vector
-- LUALOCALS > ---------------------------------------------------------
local function pummelparticles(_, data)
local pointed = data.pointed
local nodedef = data.nodedef
local pname = data.pname
local stack = nodecore.stack_get(data.node)
if stack and not stack:is_empty() then
nodedef = minetest.registered_items[stack:get_name()] or nodedef
end
local a = pointed.above
local b = pointed.under
local vel = vector.subtract(a, b)
local mid = vector.multiply(vector.add(a, b), 0.5)
local p1 = {x = vel.y, y = vel.z, z = vel.x}
local p2 = {x = vel.z, y = vel.x, z = vel.y}
local s1 = vector.add(vector.add(mid, vector.multiply(p1, 0.5)), vector.multiply(p2, 0.5))
local s2 = vector.add(vector.add(mid, vector.multiply(p1, -0.5)), vector.multiply(p2, -0.5))
vel = vector.multiply(vel, 0.5)
data.clearfx = nodecore.digparticles(nodedef, nodecore.underride(
nodecore.underride({}, data.recipe.pumparticles or {}),
{
amount = 8,
time = 1.5,
minpos = s1,
maxpos = s2,
minvel = vel,
maxvel = vel,
minexptime = 0.4,
maxexptime = 0.9,
minsize = 1,
maxsize = 5,
playername = pname
})
)
end
local pummeling = {}
minetest.register_on_punchnode(function(pos, node, puncher, pointed)
if not puncher:is_player() then return end
local pname = puncher:get_player_name()
if not nodecore.interact(pname) then return end
node = node or minetest.get_node(pos)
local def = minetest.registered_items[node.name] or {}
local now = minetest.get_us_time() / 1000000 * 3
local pum = {
action = "pummel",
crafter = puncher,
pname = pname,
pos = pos,
pointed = pointed,
node = node,
nodedef = def,
start = now,
wield = puncher:get_wielded_item():to_string(),
count = 0,
inprogress = pummelparticles
}
local old = pummeling[pname]
if old and old.clearfx then old.clearfx() end
local hash = minetest.hash_node_position
if old and hash(old.pos) == hash(pum.pos)
and hash(old.pointed.above) == hash(pum.pointed.above)
and hash(old.pointed.under) == hash(pum.pointed.under)
and pum.wield == old.wield
and old.last >= (now - 3)
then pum = old end
pum.count = pum.count + 1
pum.last = now
pum.duration = now - pum.start - 1
pummeling[pname] = pum
if pum.count < 2 then return end
if nodecore.craft_check(pos, node, nodecore.underride({}, pum)) then
pummeling[pname] = nil
return
end
end)

View File

@ -0,0 +1,81 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, type
= minetest, nodecore, type
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
local function getduration(_, data)
local meta = minetest.get_meta(data.node)
local md = meta:get_string(modname) or ""
md = (md ~= "") and minetest.deserialize(md) or {}
if md.label ~= data.recipe.label
or md.count ~= nodecore.stack_get(data.node):get_count()
or not md.start
then return 0 end
return minetest.get_gametime() - md.start
end
local function playcookfx(pos, cookfx, sound, smokeqty, smoketime)
if not cookfx then return end
if cookfx == true or cookfx and cookfx[sound] then
minetest.sound_play("nc_api_craft_" .. sound,
{gain = 1, pos = pos})
end
if cookfx == true or cookfx and cookfx.smoke then
if cookfx ~= true and type(cookfx.smoke) == "number" then
smokeqty = smokeqty * cookfx.smoke
end
nodecore.smokefx(pos, smoketime, smokeqty)
end
end
local function inprogress(pos, data)
local meta = minetest.get_meta(data.node)
local recipe = data.recipe
local md = meta:get_string(modname) or ""
md = (md ~= "") and minetest.deserialize(md) or {}
local count = nodecore.stack_get(data.node):get_count()
if md.label ~= recipe.label or md.count ~= count or not md.start then
md = {
label = recipe.label,
count = count,
start = minetest.get_gametime()
}
meta:set_string(modname, minetest.serialize(md))
end
data.progressing = true
return playcookfx(pos, recipe.cookfx, "sizzle", 2, 1)
end
local function cookdone(pos, data)
local meta = minetest.get_meta(pos)
local recipe = data.recipe
meta:set_float(recipe.label, 0)
return playcookfx(pos, recipe.cookfx, "hiss", 80, 0.2)
end
function nodecore.register_cook_abm(def)
def.interval = def.interval or 1
def.chance = def.chance or 1
def.action = function(pos, node)
local data = {
action = "cook",
duration = getduration,
inprogress = inprogress,
after = cookdone
}
nodecore.craft_check(pos, node, data)
if not data.progressing then
minetest.get_meta(pos):set_string(modname, "")
end
end
nodecore.register_limited_abm(def)
end

View File

@ -0,0 +1,69 @@
-- LUALOCALS < ---------------------------------------------------------
local error, math, nodecore, pairs, table, type
= error, math, nodecore, pairs, table, type
local math_floor, table_insert
= math.floor, table.insert
-- LUALOCALS > ---------------------------------------------------------
local craft_recipes = {}
nodecore.craft_recipes = craft_recipes
local id = 0
function nodecore.register_craft(recipe)
recipe.action = recipe.action or "place"
local canrot
recipe.nodes = recipe.nodes or {}
for _, v in pairs(recipe.nodes) do
v.x = v.x or 0
v.y = v.y or 0
v.z = v.z or 0
if type(v.match) == "table" and v.match.count then
v.match.excess = v.match.excess or true
end
canrot = canrot or v.x ~= 0 or v.z ~= 0
if v.x == 0 and v.y == 0 and v.z == 0 then
recipe.root = v
end
end
if not recipe.root or not recipe.root.match then
error "recipe.nodes must have a match for 0,0,0"
end
if not recipe.label then
id = id + 1
recipe.label = "unnamed " .. recipe.action .. " " .. id
end
if recipe.toolgroups and recipe.toolwear ~= false then
recipe.toolwear = 1
end
if not canrot then recipe.norotate = true end
if recipe.normal then
recipe.normal.x = recipe.normal.x or 0
recipe.normal.y = recipe.normal.y or 0
recipe.normal.z = recipe.normal.z or 0
end
if recipe.items then
for k, v in pairs(recipe.items) do
if type(v) == "string" then
recipe.items[k] = {name = v}
end
end
end
if recipe.wield and type(recipe.wield) == "table" then
recipe.wield.count = recipe.wield.count or false
end
local newp = recipe.priority or 0
local min = 1
local max = #craft_recipes + 1
while max > min do
local try = math_floor((min + max) / 2)
local oldp = craft_recipes[try].priority or 0
if newp < oldp then
min = try + 1
else
max = try
end
end
table_insert(craft_recipes, min, recipe)
end

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

View File

@ -0,0 +1,146 @@
-- LUALOCALS < ---------------------------------------------------------
local math, minetest, nodecore, pairs, vector
= math, minetest, nodecore, pairs, vector
local math_random
= math.random
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
local ashdirs = {
{x = 1, y = -1, z = 0},
{x = -1, y = -1, z = 0},
{x = 0, y = -1, z = 1},
{x = 0, y = -1, z = -1}
}
nodecore.register_craft({
label = "mix concrete (fail)",
action = "pummel",
priority = 2,
toolgroups = {thumpy = 1},
normal = {y = 1},
nodes = {
{
match = {groups = {gravel = true}}
},
{
x = 1,
y = -1,
match = {buildable_to = true}
},
{
y = -1,
match = "nc_fire:ash",
replace = "air"
}
},
after = function(pos)
local dirs = {}
for _, d in pairs(ashdirs) do
local p = vector.add(pos, d)
if nodecore.buildable_to(p) then
dirs[#dirs + 1] = {pos = p, qty = 0}
end
end
for _ = 1, 8 do
local p = dirs[math_random(1, #dirs)]
p.qty = p.qty + 1
end
for _, v in pairs(dirs) do
if v.qty > 0 then
nodecore.item_eject(v.pos, "nc_fire:lump_ash " .. v.qty)
end
end
end
})
nodecore.register_craft({
label = "mix concrete",
action = "pummel",
priority = 1,
toolgroups = {thumpy = 1},
normal = {y = 1},
nodes = {
{
match = {groups = {gravel = true}},
replace = "air"
},
{
y = -1,
match = "nc_fire:ash",
replace = modname .. ":aggregate"
}
}
})
local flow = modname .. ":wet_flowing"
local src = modname .. ":wet_source"
nodecore.register_limited_abm({
label = "Aggregate Wettening",
interval = 1,
chance = 2,
limited_max = 100,
nodenames = {modname .. ":aggregate"},
neighbors = {"group:water"},
action = function(pos)
minetest.set_node(pos, {name = src})
nodecore.node_sound(pos, "place")
end
})
nodecore.register_limited_abm({
label = "Aggregate Wandering",
interval = 4,
chance = 2,
limited_max = 100,
nodenames = {src},
neighbors = {flow},
action = function(pos, node)
local meta = minetest.get_meta(pos)
local gen = meta:get_int("agggen")
if gen >= 8 and math_random(1, 2) == 1 then
minetest.set_node(pos, {name = "nc_terrain:cobble"})
return nodecore.node_sound(pos, "place")
end
local miny = pos.y
local found = {}
nodecore.scan_flood(pos, 2, function(p)
local nn = minetest.get_node(p).name
if nn == src then return end
if nn ~= flow then return false end
if p.y > miny then return end
if p.y == miny then
found[#found + 1] = p
return
end
miny = p.y
found = {p}
end)
if #found < 1 then return end
local np = nodecore.pickrand(found)
nodecore.node_sound(pos, "dig")
minetest.set_node(np, node)
minetest.get_meta(np):set_int("agggen", gen + 1)
minetest.set_node(pos, {name = flow, param2 = 7})
end
})
nodecore.register_craft({
label = "aggregate curing",
action = "cook",
duration = 300,
cookfx = {smoke = 0.05},
check = function(pos)
return not minetest.find_node_near(pos, 1, {flow, "group:water"})
end,
nodes = {
{
match = src,
replace = "nc_terrain:stone"
}
}
})
nodecore.register_cook_abm({nodenames = {src}})

View File

@ -0,0 +1,9 @@
-- LUALOCALS < ---------------------------------------------------------
local include, nodecore
= include, nodecore
-- LUALOCALS > ---------------------------------------------------------
nodecore.amcoremod()
include("node")
include("crafting")

View File

@ -0,0 +1,2 @@
name = nc_concrete
depends = nc_api, nc_api_craft, nc_fire, nc_terrain

43
mods/nc_concrete/node.lua Normal file
View File

@ -0,0 +1,43 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore
= minetest, nodecore
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
minetest.register_node(modname .. ":aggregate", {
description = "Aggregate",
tiles = {"nc_terrain_gravel.png^(nc_fire_ash.png^[mask:nc_concrete_mask.png)"},
groups = {
crumbly = 2,
falling_node = 1,
falling_repose = 1
},
crush_damage = 1,
sounds = nodecore.sounds("nc_terrain_chompy")
})
local wettile = "nc_terrain_stone.png^(nc_fire_ash.png^[mask:nc_concrete_mask.png)"
local wetdef = {
description = "Wet Aggregate",
tiles = {wettile},
special_tiles = {wettile, wettile},
liquid_viscosity = 15,
liquid_renewable = false,
liquid_range = 1,
liquid_alternative_flowing = modname .. ":wet_flowing",
liquid_alternative_source = modname .. ":wet_source",
walkable = false,
diggable = false,
drowning = 1,
post_effect_color = {a = 240, r = 32, g = 32, b = 32},
sounds = nodecore.sounds("nc_terrain_chompy")
}
minetest.register_node(modname .. ":wet_source", nodecore.underride({
liquidtype = "source"
}, wetdef))
minetest.register_node(modname .. ":wet_flowing", nodecore.underride({
drawtype = "flowingliquid",
liquidtype = "flowing",
paramtype2 = "flowingliquid"
}, wetdef))

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

9
mods/nc_doors/init.lua Normal file
View File

@ -0,0 +1,9 @@
-- LUALOCALS < ---------------------------------------------------------
local include, nodecore
= include, nodecore
-- LUALOCALS > ---------------------------------------------------------
nodecore.amcoremod()
include("operate")
include("register")

2
mods/nc_doors/mod.conf Normal file
View File

@ -0,0 +1,2 @@
name = nc_doors
depends = nc_api, nc_api_craft, nc_fire, nc_lode, nc_terrain, nc_woodwork

107
mods/nc_doors/operate.lua Normal file
View File

@ -0,0 +1,107 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, pairs, vector
= minetest, nodecore, pairs, vector
-- LUALOCALS > ---------------------------------------------------------
local function hingeaxis(pos, node)
local fd = node and node.param2 or 0
fd = nodecore.facedirs[fd]
fd = vector.multiply(vector.add(fd.f, fd.r), 0.5)
return {
x = fd.x == 0 and 0 or pos.x + fd.x,
y = fd.y == 0 and 0 or pos.y + fd.y,
z = fd.z == 0 and 0 or pos.z + fd.z
}
end
local squelch = {}
minetest.register_globalstep(function() squelch = {} end)
local is_door = {groups = { door = true }}
function nodecore.operate_door(pos, node, dir)
if squelch[minetest.pos_to_string(pos)] then return end
node = node or minetest.get_node_or_nil(pos)
if (not node) or (not nodecore.match(node, is_door)) then return end
local fd = nodecore.facedirs[node.param2 or 0]
local rotdir
if vector.equals(dir, fd.k) or vector.equals(dir, fd.r) then
rotdir = "r"
elseif vector.equals(dir, fd.l) or vector.equals(dir, fd.f) then
rotdir = "f"
else return end
local found = {}
local hinge = hingeaxis(pos, node)
if nodecore.scan_flood(pos, 128, function(p)
local n = minetest.get_node_or_nil(p)
if not n then return true end
if (not nodecore.match(n, is_door))
or (not vector.equals(hingeaxis(p, n), hinge)) then return false end
found[minetest.pos_to_string(p)] = {pos = p, node = n}
end
) then return end
local toop = {}
for k, v in pairs(found) do
local ffd = nodecore.facedirs[v.node.param2 or 0]
local to = vector.add(v.pos, ffd[rotdir])
if (not found[minetest.pos_to_string(to)])
and (not nodecore.buildable_to(to))
then return end
local str = minetest.pos_to_string(to)
if squelch[str] then return end
v.str = str
v.to = to
v.fd = ffd
toop[k .. "l"] = {
pos = vector.add(v.pos, ffd.l),
dir = rotdir == "r" and ffd.k or ffd.f
}
toop[k .. "k"] = {
pos = vector.add(v.pos, ffd.k),
dir = rotdir == "r" and ffd.r or ffd.l
}
end
local toset = {}
for k, v in pairs(found) do
toset[k] = {pos = v.pos, name = "air"}
squelch[k] = true
squelch[v.str] = true
end
for _, v in pairs(found) do
for i, xfd in pairs(nodecore.facedirs) do
if vector.equals(xfd.t, v.fd.t)
and vector.equals(xfd.r, rotdir == "r" and v.fd.f or v.fd.k) then
toset[minetest.pos_to_string(v.to)] = {
pos = v.to,
name = v.node.name,
param2 = i
}
break
end
end
end
for _, v in pairs(toset) do
minetest.set_node(v.pos, v)
if v.name ~= "air" then
local p = vector.round(vector.multiply(v.pos, 0.25))
local k = "sfx" .. minetest.pos_to_string(p)
if not squelch[k] then
squelch[k] = true
minetest.sound_play("nc_doors_operate",
{pos = v.pos, gain = 0.5})
end
end
end
for _, v in pairs(toop) do
nodecore.operate_door(v.pos, nil, v.dir)
end
end

148
mods/nc_doors/register.lua Normal file
View File

@ -0,0 +1,148 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, pairs, vector
= minetest, nodecore, pairs, vector
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
local function doorop(pos, node, _, _, pointed)
if (not pointed.above) or (not pointed.under) then return end
local force = vector.subtract(pointed.under, pointed.above)
return nodecore.operate_door(pos, node, force)
end
local tilemods = {
{idx = 1, part = "end", tran = "R180"},
{idx = 2, part = "end", tran = "FX"},
{idx = 3, part = "side", tran = "I"},
{idx = 6, part = "side", tran = "R180"}
}
function nodecore.register_door(basemod, basenode, desc, pin)
local basefull = basemod .. ":" .. basenode
local basedef = minetest.registered_nodes[basefull]
local tiles = nodecore.underride({}, basedef.tiles)
while #tiles < 6 do tiles[#tiles + 1] = tiles[#tiles] end
for k, v in pairs(tiles) do tiles[k] = v.name or v end
for _, v in pairs(tilemods) do
tiles[v.idx] = tiles[v.idx] .. "^nc_doors_hinge_" .. v.part
.. "_base.png^[transform" .. v.tran
end
local paneldef = nodecore.underride({}, {
name = modname .. ":panel_" .. basenode,
description = (desc or basedef.description) .. " Panel",
tiles = tiles,
paramtype2 = "facedir",
silktouch = false,
on_rightclick = nodecore.node_spin_filtered(function(a, b)
return vector.equals(a.f, b.r)
and vector.equals(a.r, b.f)
end),
}, basedef)
paneldef.drop = nil
paneldef.alternate_loose = nil
paneldef.drop_in_place = nil
paneldef.after_dig_node = nil
minetest.register_node(paneldef.name, paneldef)
local t = minetest.registered_items[pin].tiles
t = t[3] or t[2] or t[1]
t = t.name or t
tiles = nodecore.underride({}, tiles)
for _, v in pairs(tilemods) do
tiles[v.idx] = tiles[v.idx] .. "^((" .. t .. ")^[mask:nc_doors_hinge_" .. v.part
.. "_mask.png^[transform" .. v.tran .. ")"
end
local groups = nodecore.underride({door = 1}, basedef.groups)
local doordef = nodecore.underride({
name = modname .. ":door_" .. basenode,
description = (desc or basedef.description) .. " Hinged Panel",
tiles = tiles,
drop = pin,
drop_in_place = paneldef.name,
on_rightclick = doorop,
groups = groups
}, paneldef)
minetest.register_node(doordef.name, doordef)
nodecore.register_craft({
label = "drill door " .. basenode:lower(),
action = "pummel",
toolgroups = {thumpy = 3},
normal = {y = 1},
nodes = {
{
match = "nc_lode:rod_tempered",
},
{
y = -1,
match = basefull,
replace = paneldef.name
}
}
})
nodecore.register_craft({
label = "lubricate door " .. basenode:lower(),
check = function(_, data)
return minetest.get_meta(data.rel(0, -1, 0))
:get_float("doorlube") ~= 1
end,
nodes = {
{
match = "nc_fire:lump_coal",
replace = "air"
},
{
y = -1,
match = paneldef.name,
}
},
after = function(pos, data)
minetest.get_meta(data.rel(0, -1, 0)):set_float("doorlube", 1)
return nodecore.digparticles(
minetest.registered_nodes["nc_fire:coal8"],
{
collisiondetection = true,
amount = 10,
time = 0.2,
minpos = {x = pos.x - 0.4, y = pos.y - 0.5, z = pos.z - 0.4},
maxpos = {x = pos.x + 0.4, y = pos.y - 0.45, z = pos.z + 0.4},
minexptime = 0.1,
maxexptime = 1,
minsize = 1,
maxsize = 3
}
)
end
})
nodecore.register_craft({
label = "door pin " .. basenode:lower(),
action = "pummel",
toolgroups = {thumpy = 1},
normal = {y = 1},
check = function(_, data)
return minetest.get_meta(data.rel(0, -1, 0))
:get_float("doorlube") == 1
end,
nodes = {
{
match = pin,
replace = "air"
},
{
y = -1,
match = paneldef.name,
replace = doordef.name
}
}
})
end
nodecore.register_door("nc_woodwork", "plank", "Wooden", "nc_woodwork:staff")
nodecore.register_door("nc_terrain", "cobble", "Cobble", "nc_lode:rod_tempered")

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 B

Some files were not shown because too many files have changed in this diff Show More