Compare commits

..

1 commit

Author SHA1 Message Date
Simon Brodtmann
53699b9a9c Add new enemies 2025-03-01 23:26:18 +01:00
23 changed files with 578 additions and 127 deletions

View file

@ -2,6 +2,8 @@ This mod extends the early game of Space Age by putting you on the moon "Lignumi
The duration of the stay on Lignumis will be rather short. The impact of the later game will still be substantial (once implemented).
**If you start a new game, check out the setting for adding Basic circuit boards.**
## Mod recommendations
The following mods can be a great addition for this mod:
@ -61,7 +63,6 @@ The following planet mods are tested for (at least technical) compatibility:
## Problematic / incompatible mods
* Mods that let you start on a different planet: They are supported, but you are missing half of the content of this mod.
* The combination of AAI Industry and Any planet start is currently not supported.
* Alien Biomes: Lignumis won't have any trees. It's playable, but not as intended.
* The rest of the Wooden Universe: I marked the ones incompatible that don't make sense to combine or that wouldn't add more that is not already included.
@ -114,6 +115,9 @@ If your modded lab is special and it should not support these science packs, use
- Add information in Factoriopedia
- Compatibility with [On Wayward Seas](https://mods.factorio.com/mod/wayward-seas)
- Compatibility with [Noble Metals](https://mods.factorio.com/mod/bzgold) once it's updated
- Check if creating a separate group for Lignumis recipes/items makes sense
- Only create 1 cutscene per game in multiplayer
- Think about moving Lumber mill to later and let it use electricity.
## Credits
@ -122,7 +126,7 @@ If your modded lab is special and it should not support these science packs, use
- Simplified chinese (zh-CN): cyx2015s
- Polish (pl): StarGazer
### Assets / Code
### Assets
[Hurricane](https://mods.factorio.com/user/Hurricane046)
@ -183,8 +187,3 @@ If your modded lab is special and it should not support these science packs, use
[Pixabay](https://pixabay.com)
- [AudioPapkin: Forest ambience](https://pixabay.com/sound-effects/forest-ambience-296528/)
[SafTheLamb](https://mods.factorio.com/user/SafTheLamb)
- [Early Agriculture](https://mods.factorio.com/mod/early-agriculture): Fix for trees not being plantable on Nauvis with Alien Biomes active.
- [Wooden Logistics](https://mods.factorio.com/mod/wood-logistics): Code for AAI Loader.

View file

@ -1,35 +1,4 @@
---------------------------------------------------------------------------------------------------
Version: 1.0.30
Date: 06.03.2025
Bug Fixes:
- Any planet start: Fix startup crash
---------------------------------------------------------------------------------------------------
Version: 1.0.29
Date: 05.03.2025
Breaking Changes:
- Nerf quality assembler to +25% quality
Changes:
- Set default for setting "Basic circuit boards" to true
- Alien Biomes: Add warning when the game starts that AB is not supported
Bug Fixes:
- Fix Burner agricultural tower not having a Nauvis recipe when "Basic circuit boards" is active
---------------------------------------------------------------------------------------------------
Version: 1.0.28
Date: 04.03.2025
Changes:
- Steam assembler technology should not ignore tech cost multiplier
Bug Fixes:
- AAI Loaders: Add missing translation
- Prevent possible errors on player initialization
---------------------------------------------------------------------------------------------------
Version: 1.0.27
Date: 02.03.2025
Changes:
- Add compatibility for "Any planet start"
- Add compatibility for "Lane splitters"
Bug Fixes:
- AAI Industry: Fix basic circuit board recipe unlock
---------------------------------------------------------------------------------------------------
Version: 1.0.26
Date: 28.02.2025
Bug Fixes:

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

View file

@ -1,6 +1,6 @@
{
"name": "lignumis",
"version": "1.0.30",
"version": "1.0.26",
"title": "Lignumis",
"description": "Dive into the world of Lignumis, a moon of Nauvis offering only the most basic technologies.",
"author": "cackling fiend",
@ -28,7 +28,6 @@
"?Diversitree",
"?aai-loaders",
"?atan-nuclear-science",
"?lane-splitters",
"!apm_power_ldinc",
"!wood-logistics",
"!early-agriculture",

View file

@ -45,7 +45,6 @@ basic-radar=Basic radar
active-noise-cancelling-tower=Active noise cancelling tower
quality-assembler=Quality assembler
aai-wood-loader=Wood loader
wood-lane-splitter=Wood lane splitter
[entity-description]
lumber-mill=Advanced machine to process wood.
@ -129,7 +128,6 @@ basic-repair-pack=Basic repair pack
basic-radar=Basic radar
active-noise-cancelling=Active noise cancelling
quality-assembler=Quality assembler
aai-wood-loader=Wood loader
[technology-description]
wood-science-pack=Allows research of basic technologies based on wood products.

View file

@ -5,12 +5,10 @@ if not mods["aai-industry"] then return end
data.raw.recipe["wood-science-pack"].allow_hand_crafting = true
local burner_mechanics = Technology:new("burner-mechanics")
burner_mechanics:addPrerequisite("iron-processing")
burner_mechanics:removeRecipe("burner-inserter")
burner_mechanics:removeRecipe("burner-mining-drill")
burner_mechanics:removeRecipe("burner-assembling-machine")
if not mods["planet-picker"] and not mods["any-planet-start"] then
burner_mechanics:addPrerequisite("iron-processing")
end
data.raw.recipe["burner-inserter"].enabled = true
data.raw.recipe["burner-mining-drill"].enabled = true
@ -31,8 +29,4 @@ if settings.startup["lignumis-basic-circuit-board"].value then
table.insert(data.raw["recipe"]["inserter"].ingredients, { type = "item", name = "basic-circuit-board", amount = 1 })
table.insert(data.raw["recipe"]["burner-lab"].ingredients, { type = "item", name = "basic-circuit-board", amount = 10 })
table.insert(data.raw["recipe"]["assembling-machine-1"].ingredients, { type = "item", name = "basic-circuit-board", amount = 5 })
-- AAI Industry messes with the basic circuit board recipe
Technology:new("electronics"):removeRecipe("basic-circuit-board")
data.raw.recipe["basic-circuit-board"].enabled = true
end

View file

@ -5,4 +5,3 @@ require("alien-biomes")
require("planet-picker")
require("aai-loaders")
require("nuclear-science")
require("lane-splitters")

View file

@ -1,32 +0,0 @@
if not mods["lane-splitters"] then return end
local lane_splitter = make_tier({
name = "wood-lane-splitter",
base_belt = "wood-transport-belt",
base_splitter = "wood-splitter",
health = 150,
next_upgrade = "lane-splitter",
})
lane_splitter.prototype.icon = Lignumis.graphics .. "icons/wood-lane-splitter.png"
lane_splitter.prototype.dying_explosion = "transport-belt-explosion"
lane_splitter.prototype.structure.east.filename = data.raw.splitter["wood-splitter"].structure.east.filename
lane_splitter.prototype.structure.south.filename = data.raw.splitter["wood-splitter"].structure.south.filename
lane_splitter.prototype.structure.west.filename = data.raw.splitter["wood-splitter"].structure.west.filename
lane_splitter.prototype.structure.north.filename = data.raw.splitter["wood-splitter"].structure.north.filename
lane_splitter.prototype.structure_patch.east.filename = data.raw.splitter["wood-splitter"].structure_patch.east.filename
lane_splitter.prototype.structure_patch.south.filename = data.raw.splitter["wood-splitter"].structure_patch.south.filename
lane_splitter.prototype.structure_patch.west.filename = data.raw.splitter["wood-splitter"].structure_patch.west.filename
lane_splitter.prototype.structure_patch.north.filename = data.raw.splitter["wood-splitter"].structure_patch.north.filename
lane_splitter.item.icon = Lignumis.graphics .. "icons/wood-lane-splitter.png"
data:extend({
lane_splitter.prototype,
lane_splitter.item,
lane_splitter.recipe,
})
table.insert(data.raw["technology"]["wood-logistics"].effects, {
type = "unlock-recipe",
recipe = "wood-lane-splitter"
})

View file

@ -51,11 +51,7 @@ data:extend({
}
})
if not mods["planet-picker"] and not mods["any-planet-start"] then
Technology:new("copper-processing"):addRecipe("basic-circuit-board-copper")
else
Technology:new("electronics"):addRecipe("basic-circuit-board-copper")
end
Technology:new("copper-processing"):addRecipe("basic-circuit-board-copper")
if settings.startup["lignumis-circuit-progression"].value then
table.insert(data.raw.recipe["electronic-circuit"].ingredients, { type = "item", name = "basic-circuit-board", amount = 1 })

View file

@ -1,5 +1,4 @@
local item_sounds = require("__base__.prototypes.item_sounds")
local Technology = require("__cf-lib__/data/Technology")
local basic_circuit_board = settings.startup["lignumis-basic-circuit-board"].value
local gfx = Lignumis.graphics .. "entity/burner-agricultural-tower/"
@ -110,30 +109,30 @@ tech.ignore_tech_cost_multiplier = true
data.raw.technology["fish-breeding"].prerequisites = { "agricultural-science-pack" }
data:extend({
if not basic_circuit_board then
data:extend({
{
type = "recipe",
name = "burner-agricultural-tower-copper",
name = "burner-agricultural-tower-electronic-circuit",
localised_name = { "entity-name.burner-agricultural-tower" },
icons = {
{ icon = Lignumis.graphics .. "icons/burner-agricultural-tower.png" },
{ icon = "__base__/graphics/icons/copper-plate.png", scale = 0.25, shift = { 8, 8 } }
{ icon = "__base__/graphics/icons/electronic-circuit.png", scale = 0.25, shift = { 8, 8 } }
},
energy_required = 10,
ingredients = {
{ type = "item", name = "stone-brick", amount = 5 },
{ type = "item", name = "wooden-gear-wheel", amount = 20 },
{ type = "item", name = "lumber", amount = 20 },
{ type = "item", name = "copper-plate", amount = 10 },
{ type = "item", name = basic_circuit_board and "basic-circuit-board" or "electronic-circuit", amount = 10 }
{ type = "item", name = "electronic-circuit", amount = 10 }
},
results = { { type = "item", name = "burner-agricultural-tower", amount = 1 } },
enabled = false
}
})
})
if not mods["planet-picker"] and not mods["any-planet-start"] then
Technology:new("copper-processing"):addRecipe("burner-agricultural-tower-copper")
else
Technology:new("electronics"):addRecipe("burner-agricultural-tower-copper")
table.insert(data.raw.technology["electronics"].effects, {
type = "unlock-recipe",
recipe = "burner-agricultural-tower-electronic-circuit"
})
end

View file

@ -29,6 +29,7 @@ require("active-noise-cancelling-tower")
require("quality-assembler")
require("decoratives")
require("wood-military")
require("basic-circuit-board")
require("basic-circuit-boards")
require("enemies")
require("noise")

View file

@ -0,0 +1,534 @@
local particle_animations = require("__space-age__/prototypes/particle-animations")
local base_sounds = require("__base__.prototypes.entity.sounds")
local space_age_sounds = require("__space-age__.prototypes.entity.sounds")
local simulations = require("__space-age__.prototypes.factoriopedia-simulations")
local enemy_autoplace = require("__base__.prototypes.entity.enemy-autoplace-utils")
local biter_ai_settings = require ("__base__.prototypes.entity.biter-ai-settings")
local blood_particles = {
"blood-particle-small",
}
for _, particle_name in ipairs(blood_particles) do
local new_particle = table.deepcopy(data.raw["optimized-particle"][particle_name])
local scale = new_particle.pictures.sheet.scale
local shift = new_particle.pictures.sheet.shift
new_particle.name = "lignumis-" .. particle_name
new_particle.pictures = {
sheet = {
filename = "__space-age__/graphics/particle/gleba-blood-particle/gleba-blood-particle.png",
line_length = 12,
width = 32,
height = 24,
frame_count = 12,
variation_count = 7,
scale = scale * 0.25,
shift = shift
}
}
data:extend({ new_particle })
end
function gleba_hit_effects(offset_deviation, offset)
local offset = offset or { 0, 0 }
return {
type = "create-entity",
entity_name = "gleba-enemy-damaged-explosion",
offset_deviation = offset_deviation or { { -0.5, -0.5 }, { 0.5, 0.5 } },
offsets = { offset },
damage_type_filters = "fire"
}
end
function wriggler_spritesheet(name, frames, speed, scale, tint, flag)
speed = speed or 1.0
local is_shadow = string.sub(name, -string.len("-shadow")) == "-shadow"
local is_decay = string.find(name, "decay")
if is_decay and is_shadow then return nil end
return util.sprite_load("__space-age__/graphics/entity/wriggler/wriggler-" .. name,
{
slice = 5,
frame_count = frames,
direction_count = 16,
scale = 0.5 * 1.2 * scale,
multiply_shift = scale,
animation_speed = speed,
draw_as_shadow = is_shadow,
tint_as_overlay = tint and true or nil,
tint = tint,
flags = (not is_shadow) and { flag } or nil,
surface = "gleba",
usage = "enemy"
}
)
end
function wriggler_corpse_spritesheet(name, frames, speed, scale, tint)
return wriggler_spritesheet(name, frames, speed, scale, tint, "corpse-decay")
end
local default_ended_in_water_trigger_effect = function()
return {
{
type = "create-particle",
probability = 1,
affects_target = false,
show_in_tooltip = false,
particle_name = "tintable-water-particle",
apply_tile_tint = "secondary",
offset_deviation = { { -0.05, -0.05 }, { 0.05, 0.05 } },
initial_height = 0,
initial_height_deviation = 0.02,
initial_vertical_speed = 0.05,
initial_vertical_speed_deviation = 0.05,
speed_from_center = 0.01,
speed_from_center_deviation = 0.006,
frame_speed = 1,
frame_speed_deviation = 0,
tail_length = 2,
tail_length_deviation = 1,
tail_width = 3
},
{
type = "create-particle",
repeat_count = 10,
repeat_count_deviation = 6,
probability = 0.03,
affects_target = false,
show_in_tooltip = false,
particle_name = "tintable-water-particle",
apply_tile_tint = "primary",
offsets = {
{ 0, 0 },
{ 0.01563, -0.09375 },
{ 0.0625, 0.09375 },
{ -0.1094, 0.0625 }
},
offset_deviation = { { -0.2969, -0.1992 }, { 0.2969, 0.1992 } },
initial_height = 0,
initial_height_deviation = 0.02,
initial_vertical_speed = 0.053,
initial_vertical_speed_deviation = 0.005,
speed_from_center = 0.02,
speed_from_center_deviation = 0.006,
frame_speed = 1,
frame_speed_deviation = 0,
tail_length = 9,
tail_length_deviation = 0,
tail_width = 1
},
{
type = "play-sound",
sound = base_sounds.small_splash
}
}
end
local make_particle = function(params)
if not params then error("No params given to make_particle function") end
local name = params.name or error("No name given")
local ended_in_water_trigger_effect = params.ended_in_water_trigger_effect or default_ended_in_water_trigger_effect()
if params.ended_in_water_trigger_effect == false then
ended_in_water_trigger_effect = nil
end
local particle = {
type = "optimized-particle",
name = name,
life_time = params.life_time or (60 * 15),
fade_away_duration = params.fade_away_duration,
render_layer = params.render_layer or "projectile",
render_layer_when_on_ground = params.render_layer_when_on_ground or "corpse",
regular_trigger_effect_frequency = params.regular_trigger_effect_frequency or 2,
regular_trigger_effect = params.regular_trigger_effect,
ended_in_water_trigger_effect = ended_in_water_trigger_effect,
pictures = params.pictures,
shadows = params.shadows,
draw_shadow_when_on_ground = params.draw_shadow_when_on_ground,
movement_modifier_when_on_ground = params.movement_modifier_when_on_ground,
movement_modifier = params.movement_modifier,
vertical_acceleration = params.vertical_acceleration,
mining_particle_frame_speed = params.mining_particle_frame_speed,
}
return particle
end
local function lerp_color(a, b, amount)
return {
a[1] + amount * (b[1] - a[1]),
a[2] + amount * (b[2] - a[2]),
a[3] + amount * (b[3] - a[3]),
a[4] + amount * (b[4] - a[4]),
}
end
function make_wriggler(prefix, scale, health, damage, tints, factoriopedia_simulation, factoriopedia_simulation_premature,
sounds)
-- Premature version loses health so that the swarm will get removed (more efficient).
-- Spawner-spawned versions are stable so that the area is not full of corpses.
local tint_mask = tints.mask
local tint_body = tints.body
local function attack_parameters(lifesteal)
local cooldown = 26
return {
ammo_category = "melee",
ammo_type = {
target_type = "entity",
action = {
type = "direct",
action_delivery = {
type = "instant",
source_effects = lifesteal and {
{
type = "damage",
damage = { amount = -health / 50 / 60 * cooldown * 1.1, type = "poison" } -- offsets negative regeneration when attacking
}
} or nil,
target_effects = {
{
type = "damage",
damage = { amount = 5 * damage, type = "physical" }
},
{
type = "damage",
damage = { amount = 5 * damage, type = "poison" }
}
}
}
}
},
animation = {
layers = {
wriggler_spritesheet("attack", 19, 0.48, scale, tint_body),
wriggler_spritesheet("attack-tint", 19, 0.48, scale, tint_mask),
wriggler_spritesheet("attack-shadow", 19, 0.48, scale),
}
},
cooldown = cooldown,
cooldown_deviation = 0.1,
range = 1.8 * scale,
range_mode = "bounding-box-to-bounding-box",
sound = sounds.attack_sound,
type = "projectile"
}
end
local wriggler = {
type = "unit",
name = prefix .. "wriggler-pentapod-premature",
icon = "__lignumis__/graphics/icons/" .. prefix .. "wriggler.png",
subgroup = "enemies",
order = "gleba-a-wriggler-" .. tostring(scale),
factoriopedia_simulation = factoriopedia_simulation_premature,
collision_box = { { -0.2 * scale, -0.2 * scale }, { 0.2 * scale, 0.2 * scale } },
sticker_box = { { -0.5 * scale, -0.5 * scale }, { 0.5 * scale, 0.5 * scale } },
selection_box = { { -0.9 * scale, -0.9 * scale }, { 0.9 * scale, 0.9 * scale } },
collision_mask = { layers = { player = true, train = true, is_object = true }, not_colliding_with_itself = true },
flags = { "placeable-player", "placeable-enemy", "placeable-off-grid", "not-repairable", "breaths-air" },
absorptions_to_join_attack = { noise = 1 },
ai_settings = biter_ai_settings,
attack_parameters = attack_parameters(true),
corpse = prefix .. "wriggler-pentapod-corpse",
damaged_trigger_effect = gleba_hit_effects(),
distance_per_frame = 0.125,
distraction_cooldown = 300,
dying_explosion = prefix .. "wriggler-die",
dying_sound = sounds.dying_sound,
healing_per_tick = -health / 50 / 60,
impact_category = "organic",
max_health = health,
max_pursue_distance = 50,
min_pursue_time = 600,
movement_speed = 0.2 * (1 + (scale - 1) / 2),
resistances = {
{
percent = 50,
type = "laser"
}
},
run_animation = {
layers = {
wriggler_spritesheet("run", 21, 0.48, scale, tint_body),
wriggler_spritesheet("run-tint", 21, 0.48, scale, tint_mask),
wriggler_spritesheet("run-shadow", 21, 0.48, scale),
}
},
running_sound_animation_positions = { 2 },
vision_distance = 20,
water_reflection = {
orientation_to_variation = false,
rotate = true,
pictures = {
filename = "__base__/graphics/entity/biter/biter-reflection.png",
height = 28,
priority = "extra-high",
scale = 2.5 * scale,
shift = { 0.15625, 0.46875 },
variation_count = 1,
width = 20
}
},
walking_sound = sounds.walking_sound,
working_sound = sounds.working_sound,
warcry = sounds.warcry,
}
local wriggler_stable = table.deepcopy(wriggler)
wriggler_stable.name = prefix .. "wriggler-pentapod"
wriggler_stable.factoriopedia_simulation = factoriopedia_simulation
wriggler_stable.healing_per_tick = health / 500 / 60
wriggler_stable.absorptions_to_join_attack = { noise = 1 }
wriggler_stable.attack_parameters = attack_parameters(false)
local wriggler_corpse = {
type = "corpse",
name = prefix .. "wriggler-pentapod-corpse",
icon = "__lignumis__/graphics/icons/" .. prefix .. "wriggler-corpse.png",
subgroup = "corpses",
order = "c[corpse]-d[gleba-enemies-corpses]-d[wriggler]" .. tostring(scale),
hidden_in_factoriopedia = true,
selection_box = { { -0.8, -0.8 }, { 0.8, 0.8 } },
selectable_in_game = false,
animation = {
layers = {
wriggler_corpse_spritesheet("death", 17, 0.48, scale, tint_body),
wriggler_corpse_spritesheet("death-tint", 17, 0.48, scale, tint_mask),
wriggler_corpse_spritesheet("death-shadow", 17, 0.48, scale),
}
},
decay_animation = {
layers = {
wriggler_corpse_spritesheet("decay", 9, nil, scale, tint_body),
wriggler_corpse_spritesheet("decay-tint", 9, nil, scale, tint_mask),
wriggler_corpse_spritesheet("decay-shadow", 9, nil, scale),
}
},
dying_speed = 0.015 / scale,
decay_frame_transition_duration = 150,
time_before_removed = 1 * 60 * 60, -- 1 minute
use_decay_layer = true,
direction_shuffle = { { 1, 2, 3, 16 }, { 4, 5, 6, 7 }, { 8, 9, 10, 11 }, { 12, 13, 14, 15 } },
shuffle_directions_at_frame = 0,
final_render_layer = "lower-object-above-shadow",
flags = {
"placeable-neutral",
"placeable-off-grid",
"building-direction-8-way",
"not-repairable",
"not-on-map"
},
ground_patch = {
sheet =
util.sprite_load("__space-age__/graphics/entity/wriggler/blood-puddle-var-main",
{
flags = { "low-object" },
variation_count = 4,
scale = 0.4 * scale,
multiply_shift = 0.125,
}
)
},
ground_patch_fade_in_delay = 20,
ground_patch_fade_in_speed = 0.002,
ground_patch_fade_out_duration = 50 * 60 / 7.5,
ground_patch_fade_out_start = 50 * 60 / 7.5,
ground_patch_render_layer = "decals"
}
local wrigger_explosion = {
type = "explosion",
name = prefix .. "wriggler-die",
scale = 0.25,
icon = "__space-age__/graphics/icons/medium-wriggler-corpse.png",
order = "a[corpse]-f[wriggler]",
flags = { "not-on-map" },
hidden = true,
subgroup = "enemy-death-explosions",
animations = util.empty_sprite(),
created_effect = {
type = "direct",
action_delivery = {
type = "instant",
target_effects = {
{
type = "create-particle",
repeat_count = 13,
repeat_count_deviation = 1,
probability = 1,
affects_target = false,
show_in_tooltip = false,
particle_name = "lignumis-blood-particle-small",
offsets = { { 0, 0 } },
offset_deviation = { { -0.5, -0.5 }, { 0.5, 0.5 } },
initial_height = 0.1,
initial_height_deviation = 0.1,
initial_vertical_speed = 0.009,
initial_vertical_speed_deviation = 0.009,
speed_from_center = 0.05,
speed_from_center_deviation = 0.05,
frame_speed = 1,
frame_speed_deviation = 0,
tail_length = 5,
tail_length_deviation = 5,
tail_width = 3,
rotate_offsets = false
},
{
type = "create-particle",
repeat_count = 12,
repeat_count_deviation = 3,
probability = 1,
affects_target = false,
show_in_tooltip = false,
particle_name = "lignumis-blood-particle-small",
offsets = {
{ 0, -0.4 },
{ 0, 0.5 },
{ 0, 0.6 }
},
offset_deviation = { { -0.25, -0.25 }, { 0.25, 0.25 } },
initial_height = 0.1,
initial_height_deviation = 0.1,
initial_vertical_speed = 0.055,
initial_vertical_speed_deviation = 0.075,
speed_from_center = 0.03,
speed_from_center_deviation = 0.03,
frame_speed = 1,
frame_speed_deviation = 0,
tail_length = 52,
tail_length_deviation = 25,
tail_width = 3,
rotate_offsets = false
},
--{
-- type = "create-particle",
-- repeat_count = 2,
-- repeat_count_deviation = 0,
-- probability = 1,
-- affects_target = false,
-- show_in_tooltip = false,
-- particle_name = "pentapod-entrails-particle-small",
-- offsets = {
-- { 0, -0.4 }
-- },
-- offset_deviation = { { -0.5, -0.5 }, { 0.5, 0.5 } },
-- initial_height = 0.1,
-- initial_height_deviation = 0.1,
-- initial_vertical_speed = 0.06,
-- initial_vertical_speed_deviation = 0.05,
-- speed_from_center = 0.07,
-- speed_from_center_deviation = 0,
-- frame_speed = 1,
-- frame_speed_deviation = 0,
-- rotate_offsets = false
--},
--{
-- type = "create-particle",
-- repeat_count = 10,
-- repeat_count_deviation = 0,
-- probability = 1,
-- affects_target = false,
-- show_in_tooltip = false,
-- particle_name = prefix .. "wriggler-skin-particle",
-- offsets = {
-- { 0, -0.4 }
-- },
-- offset_deviation = { { -0.5, -0.5 }, { 0.5, 0.5 } },
-- initial_height = 0.1,
-- initial_height_deviation = 0.1,
-- initial_vertical_speed = 0.05,
-- initial_vertical_speed_deviation = 0.02,
-- speed_from_center = 0.02,
-- speed_from_center_deviation = 0.1,
-- frame_speed = 1,
-- frame_speed_deviation = 0,
-- rotate_offsets = false
--},
{
type = "play-sound",
sound = base_sounds.medium_gore
},
}
}
}
}
data:extend {
--wriggler,
wriggler_stable,
wriggler_corpse,
wrigger_explosion,
make_particle
{
name = prefix .. "wriggler-skin-particle",
life_time = 300,
pictures = particle_animations.get_pentpod_skin_particles_small({ scale = 1 * scale, tint = lerp_color(tint_mask, { 255, 255, 255, 255 }, 0.7) }),
shadows = particle_animations.get_pentpod_skin_particles_small({ scale = 1 * scale, tint = shadowtint(), shift = util.by_pixel(1, 0) }),
ended_in_water_trigger_effect = default_ended_in_water_trigger_effect(),
render_layer_when_on_ground = "lower-object-above-shadow"
},
}
end
local function fade(tint, amount) -- fades to minimal opacity grey. Low opacity is good for the mask to let the base layer show htough (instead of having a grey mask)
return lerp_color(tint, { 1, 1, 1, 2 }, amount)
end
local function grey_overlay(tint, amount) -- fades to opaque grey. Full opacity is required for body.
return lerp_color(tint, { 127, 127, 127, 255 }, amount)
end
-- mask tint is vibrant and only on the mask
-- body tint applies to the whole body and should be near 127 grey, just adds a hint of saturation
local gleba_small_mask_tint = { 103, 151, 11, 255 }
local gleba_small_body_tint = { 125, 124, 111, 255 }
make_wriggler("lignumis-small-", 0.2, 20, 0.1,
{
mask = fade(lerp_color(gleba_small_mask_tint, { 255, 200, 0, 255 }, 0.2), 0.2),
body = grey_overlay(lerp_color(gleba_small_body_tint, { 255, 0, 0, 255 }, 0.2), 0.2)
},
simulations.factoriopedia_gleba_enemy_small_wriggler,
simulations.factoriopedia_gleba_enemy_small_wriggler_premature,
space_age_sounds.wriggler_pentapod.small
)
make_wriggler("lignumis-medium-", 0.4, 40, 0.2,
{
mask = fade(lerp_color(gleba_small_mask_tint, { 255, 200, 0, 255 }, 0.4), 0.2),
body = grey_overlay(lerp_color(gleba_small_body_tint, { 255, 0, 0, 255 }, 0.4), 0.2)
},
simulations.factoriopedia_gleba_enemy_small_wriggler,
simulations.factoriopedia_gleba_enemy_small_wriggler_premature,
space_age_sounds.wriggler_pentapod.small
)
local spawner = table.deepcopy(data.raw["unit-spawner"]["gleba-spawner-small"])
table.assign(spawner, {
name = "lignumis-spawner-small",
result_units = {
{ "lignumis-small-wriggler-pentapod", { { 0.0, 0.9 }, { 0.5, 0.9 }, { 0.6, 0.5 } } },
{ "lignumis-medium-wriggler-pentapod", { { 0.1, 0 }, { 0.4, 0 }, { 1, 0.9 } } }
},
max_count_of_owned_units = 7,
max_friends_around_to_spawn = 5,
spawning_cooldown = { 360, 150 },
spawning_radius = 10,
spawning_spacing = 3,
max_spawn_shift = 0,
max_richness_for_spawn_shift = 100,
call_for_help_radius = 50,
--spawning_cooldown = { 60, 20 },
--spawning_radius = 4,
--call_for_help_radius = 20,
autoplace = enemy_autoplace.enemy_spawner_autoplace("enemy_autoplace_base(0, 6)"),
absorptions_per_second = { noise = { absolute = 20, proportional = 0.01 } },
})
spawner.collision_mask = nil
spawner.loot = nil
spawner.dying_trigger_effect[1].entity_name = "lignumis-small-wriggler-pentapod"
data:extend({ spawner })

View file

@ -77,7 +77,7 @@ QualityAssembler.EntityBuilder:new()
crafting_speed = 4,
module_slots = 6,
allowed_effects = { "pollution", "quality" },
effect_receiver = { base_effect = { quality = 2.5 } }
effect_receiver = { base_effect = { quality = 10 } }
})
QualityAssembler.ItemBuilder:new():apply()

View file

@ -106,6 +106,6 @@ data:extend({
ingredients = { { "wood-science-pack", 1 } },
time = 15
},
ignore_tech_cost_multiplier = false
ignore_tech_cost_multiplier = true
}
})

View file

@ -22,10 +22,10 @@ end
-- Teleport to Lignumis and give some starting items
local function init_player(event)
local player = game.get_player(event.player_index)
if not player.character then return end
local surface = storage.surface or game.planets["lignumis"].surface
if not player.character or not surface then return end
player.teleport(surface.find_non_colliding_position("character", { 0, 0 }, 0, 1), "lignumis")
player.character.destructible = false
local main_inventory = player.character.get_main_inventory()
@ -80,11 +80,6 @@ Init.events[defines.events.on_player_created] = function(event)
if storage.init[event.player_index] then return end
storage.init[event.player_index] = true
if script.active_mods["alien-biomes"] then
game.print("While Alien Biomes is playable with Lignumis, it is not recommended as it prevents trees from being generated on Lignumis.")
end
init_player(event)
init_freeplay(event)
end

View file

@ -31,7 +31,7 @@ data:extend({
type = "bool-setting",
name = "lignumis-basic-circuit-board",
setting_type = "startup",
default_value = true,
default_value = false,
order = "e"
},
{

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB