mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2024-12-26 22:56:43 +02:00
Initial chrono port
This commit is contained in:
parent
2b2a05c263
commit
eba6e052d2
@ -1,8 +1,8 @@
|
||||
local Chrono_table = require 'maps.chronosphere.table'
|
||||
local Balance = require 'maps.chronosphere.balance'
|
||||
local Difficulty = require 'modules.difficulty_vote'
|
||||
local Rand = require 'maps.chronosphere.random'
|
||||
local Raffle = require 'maps.chronosphere.raffles'
|
||||
local AI = require 'utils.functions.AI'
|
||||
local Public = {}
|
||||
|
||||
local random = math.random
|
||||
@ -24,83 +24,6 @@ local fish_area = { left_top = { -1100, -400 }, right_bottom = { 1100, 400 } }
|
||||
|
||||
-----------commands-----------
|
||||
|
||||
local function move_to(position)
|
||||
local command = {
|
||||
type = defines.command.go_to_location,
|
||||
destination = position,
|
||||
distraction = defines.distraction.by_anything
|
||||
}
|
||||
return command
|
||||
end
|
||||
|
||||
local function attack_target(target)
|
||||
if not target.valid then
|
||||
return
|
||||
end
|
||||
local command = {
|
||||
type = defines.command.attack,
|
||||
target = target,
|
||||
distraction = defines.distraction.by_anything
|
||||
}
|
||||
return command
|
||||
end
|
||||
|
||||
local function attack_area(position, radius)
|
||||
local command = {
|
||||
type = defines.command.attack_area,
|
||||
destination = position,
|
||||
radius = radius or 25,
|
||||
distraction = defines.distraction.by_anything
|
||||
}
|
||||
return command
|
||||
end
|
||||
|
||||
local function attack_obstacles(surface, position)
|
||||
local commands = {}
|
||||
local obstacles = surface.find_entities_filtered { position = position, radius = 25, type = { 'simple-entity', 'tree', 'simple-entity-with-owner' }, limit = 100 }
|
||||
if obstacles then
|
||||
Rand.shuffle(obstacles)
|
||||
Rand.shuffle_distance(obstacles, position)
|
||||
for i = 1, #obstacles, 1 do
|
||||
if obstacles[i].valid then
|
||||
commands[#commands + 1] = {
|
||||
type = defines.command.attack,
|
||||
target = obstacles[i],
|
||||
distraction = defines.distraction.by_anything
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
commands[#commands + 1] = move_to(position)
|
||||
local command = {
|
||||
type = defines.command.compound,
|
||||
structure_type = defines.compound_command.return_last,
|
||||
commands = commands
|
||||
}
|
||||
return command
|
||||
end
|
||||
|
||||
local function multicommand(group, commands)
|
||||
if #commands > 0 then
|
||||
local command = {
|
||||
type = defines.command.compound,
|
||||
structure_type = defines.compound_command.return_last,
|
||||
commands = commands
|
||||
}
|
||||
group.set_command(command)
|
||||
end
|
||||
end
|
||||
|
||||
local function multi_attack(surface, target)
|
||||
surface.set_multi_command(
|
||||
{
|
||||
command = attack_target(target),
|
||||
unit_count = 16 + random(1, floor(1 + game.forces['enemy'].evolution_factor * 100)) * Difficulty.get().difficulty_vote_value,
|
||||
force = 'enemy',
|
||||
unit_search_distance = 1024
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
------------------------misc functions----------------------
|
||||
|
||||
@ -141,13 +64,13 @@ local function generate_side_attack_target(surface, position, area)
|
||||
goto retry
|
||||
end
|
||||
end
|
||||
entities = Rand.shuffle(entities)
|
||||
entities = Rand.shuffle_distance(entities, position)
|
||||
table.shuffle_table(entities)
|
||||
table.shuffle_by_distance(entities, position)
|
||||
local weights = {}
|
||||
for index, _ in pairs(entities) do
|
||||
weights[#weights + 1] = 1 + floor((#entities - index) / 2)
|
||||
end
|
||||
return Rand.raffle(entities, weights)
|
||||
return table.get_random_weighted_t(entities, weights)
|
||||
end
|
||||
|
||||
local function generate_main_attack_target()
|
||||
@ -173,13 +96,13 @@ local function get_random_close_spawner(surface)
|
||||
if not spawners[1] then
|
||||
return false
|
||||
end
|
||||
spawners = Rand.shuffle(spawners)
|
||||
spawners = Rand.shuffle_distance(spawners, objective.locomotive.position)
|
||||
table.shuffle_table(spawners)
|
||||
table.shuffle_by_distance(spawners, objective.locomotive.position)
|
||||
local weights = {}
|
||||
for index, _ in pairs(spawners) do
|
||||
weights[#weights + 1] = 1 + floor((#spawners - index) / 2)
|
||||
end
|
||||
return Rand.raffle(spawners, weights), area
|
||||
return table.get_random_weighted_t(spawners, weights), area
|
||||
end
|
||||
|
||||
local function is_biter_inactive(biter)
|
||||
@ -189,10 +112,10 @@ local function is_biter_inactive(biter)
|
||||
if not biter.entity.valid then
|
||||
return true
|
||||
end
|
||||
if not biter.entity.unit_group then
|
||||
if not biter.entity.commandable then
|
||||
return true
|
||||
end
|
||||
if not biter.entity.unit_group.valid then
|
||||
if not biter.entity.commandable.valid then
|
||||
return true
|
||||
end
|
||||
if game.tick - biter.active_since > 162000 then
|
||||
@ -258,10 +181,10 @@ local function select_units_around_spawner(spawner, size)
|
||||
local local_pollution =
|
||||
math.min(
|
||||
spawner.surface.get_pollution(spawner.position),
|
||||
400 * game.map_settings.pollution.enemy_attack_pollution_consumption_modifier * game.forces.enemy.evolution_factor
|
||||
400 * game.map_settings.pollution.enemy_attack_pollution_consumption_modifier * game.forces.enemy.get_evolution_factor(spawner.surface)
|
||||
)
|
||||
spawner.surface.pollute(spawner.position, -local_pollution)
|
||||
game.pollution_statistics.on_flow('biter-spawner', -local_pollution)
|
||||
game.get_pollution_statistics(spawner.surface).on_flow('biter-spawner', -local_pollution)
|
||||
if local_pollution < 1 then
|
||||
break
|
||||
end
|
||||
@ -290,7 +213,7 @@ local function pollution_requirement(surface, position, main)
|
||||
end
|
||||
if pollution > multiplier * pollution_to_eat then
|
||||
surface.pollute(position, -pollution_to_eat)
|
||||
game.pollution_statistics.on_flow('small-biter', -pollution_to_eat)
|
||||
game.get_pollution_statistics(surface).on_flow('small-biter', -pollution_to_eat)
|
||||
return true
|
||||
end
|
||||
return false
|
||||
@ -343,14 +266,14 @@ end
|
||||
local function colonize(group)
|
||||
--if _DEBUG then game.print(game.tick ..": colonizing") end
|
||||
local surface = group.surface
|
||||
local evo = group.force.evolution_factor
|
||||
local evo = group.force.get_evolution_factor(surface)
|
||||
local nests = random(1 + floor(evo * 20), 2 + floor(evo * 20) * 2)
|
||||
local commands = {}
|
||||
local biters = surface.find_entities_filtered { position = group.position, radius = 30, name = Raffle.biters, force = 'enemy' }
|
||||
local goodbiters = {}
|
||||
if #biters > 1 then
|
||||
for i = 1, #biters, 1 do
|
||||
if biters[i].unit_group == group then
|
||||
if biters[i].commandable == group then
|
||||
goodbiters[#goodbiters + 1] = biters[i]
|
||||
end
|
||||
end
|
||||
@ -381,7 +304,7 @@ local function colonize(group)
|
||||
end
|
||||
else
|
||||
commands = {
|
||||
attack_obstacles(surface, group.position)
|
||||
AI.command_attack_obstacles(surface, group.position)
|
||||
}
|
||||
end
|
||||
end
|
||||
@ -395,7 +318,7 @@ local function colonize(group)
|
||||
end
|
||||
if #commands > 0 then
|
||||
--game.print("Attacking [gps=" .. commands[1].target.position.x .. "," .. commands[1].target.position.y .. "]")
|
||||
multicommand(group, commands)
|
||||
AI.multicommand(group, commands)
|
||||
end
|
||||
end
|
||||
|
||||
@ -412,7 +335,7 @@ local function send_near_biters_to_objective()
|
||||
if _DEBUG then
|
||||
game.print(game.tick .. ': sending objective wave')
|
||||
end
|
||||
multi_attack(target.surface, target)
|
||||
AI.multi_attack(target.surface, target, game.forces.enemy)
|
||||
end
|
||||
end
|
||||
|
||||
@ -420,16 +343,16 @@ local function attack_check(group, target, main)
|
||||
local commands
|
||||
if pollution_requirement(group.surface, target.position, main) then
|
||||
commands = {
|
||||
attack_target(target),
|
||||
attack_area(target.position, 32)
|
||||
AI.command_attack_target(target),
|
||||
AI.command_attack_area(target.position, 32)
|
||||
}
|
||||
else
|
||||
local position = generate_expansion_position(group.position)
|
||||
commands = {
|
||||
attack_obstacles(group.surface, position)
|
||||
AI.command_attack_obstacles(group.surface, position)
|
||||
}
|
||||
end
|
||||
multicommand(group, commands)
|
||||
AI.multicommand(group, commands)
|
||||
end
|
||||
|
||||
local function give_new_orders(group)
|
||||
@ -442,10 +365,10 @@ local function give_new_orders(group)
|
||||
return
|
||||
end
|
||||
local commands = {
|
||||
attack_target(target),
|
||||
attack_area(target.position, 32)
|
||||
AI.command_attack_target(target),
|
||||
AI.command_attack_area(target.position, 32)
|
||||
}
|
||||
multicommand(group, commands)
|
||||
AI.multicommand(group, commands)
|
||||
end
|
||||
|
||||
------------------------- tick minute functions--------------------
|
||||
@ -453,7 +376,7 @@ end
|
||||
local function destroy_inactive_biters()
|
||||
local bitertable = Chrono_table.get_biter_table()
|
||||
for unit_number, biter in pairs(bitertable.active_biters) do
|
||||
if is_biter_inactive(biter, unit_number) then
|
||||
if is_biter_inactive(biter) then
|
||||
bitertable.active_biters[unit_number] = nil
|
||||
bitertable.free_biters = bitertable.free_biters + 1
|
||||
end
|
||||
|
@ -235,24 +235,24 @@ Public.dayspeed_weights = {
|
||||
}
|
||||
function Public.market_offers()
|
||||
return {
|
||||
{price = {{'coin', 40}}, offer = {type = 'give-item', item = 'raw-fish'}},
|
||||
{price = {{'coin', 40}}, offer = {type = 'give-item', item = 'wood', count = 50}},
|
||||
{price = {{'coin', 100}}, offer = {type = 'give-item', item = 'iron-ore', count = 50}},
|
||||
{price = {{'coin', 100}}, offer = {type = 'give-item', item = 'copper-ore', count = 50}},
|
||||
{price = {{'coin', 100}}, offer = {type = 'give-item', item = 'stone', count = 50}}, -- needed?
|
||||
{price = {{'coin', 100}}, offer = {type = 'give-item', item = 'coal', count = 50}},
|
||||
{price = {{'coin', 400}}, offer = {type = 'give-item', item = 'uranium-ore', count = 50}},
|
||||
{price = {{'coin', 50}, {'empty-barrel', 1}}, offer = {type = 'give-item', item = 'crude-oil-barrel', count = 1}},
|
||||
{price = {{'coin', 500}, {'steel-plate', 20}, {'electronic-circuit', 20}}, offer = {type = 'give-item', item = 'loader', count = 1}},
|
||||
{price = {{name = 'coin', count = 40}}, offer = {type = 'give-item', item = 'raw-fish'}},
|
||||
{price = {{name = 'coin', count = 40}}, offer = {type = 'give-item', item = 'wood', count = 50}},
|
||||
{price = {{name = 'coin', count = 100}}, offer = {type = 'give-item', item = 'iron-ore', count = 50}},
|
||||
{price = {{name = 'coin', count = 100}}, offer = {type = 'give-item', item = 'copper-ore', count = 50}},
|
||||
{price = {{name = 'coin', count = 100}}, offer = {type = 'give-item', item = 'stone', count = 50}}, -- needed?
|
||||
{price = {{name = 'coin', count = 100}}, offer = {type = 'give-item', item = 'coal', count = 50}},
|
||||
{price = {{name = 'coin', count = 400}}, offer = {type = 'give-item', item = 'uranium-ore', count = 50}},
|
||||
{price = {{name = 'coin', count = 50}, {name = 'barrel', count = 1}}, offer = {type = 'give-item', item = 'crude-oil-barrel', count = 1}},
|
||||
{price = {{name = 'coin', count = 500}, {name = 'steel-plate', count = 20}, {name = 'electronic-circuit', count = 20}}, offer = {type = 'give-item', item = 'loader', count = 1}},
|
||||
{
|
||||
price = {{'coin', 1000}, {'steel-plate', 40}, {'advanced-circuit', 10}, {'loader', 1}},
|
||||
price = {{name = 'coin', count = 1000}, {name = 'steel-plate', count = 40}, {name = 'advanced-circuit', count = 10}, {name = 'loader', count = 1}},
|
||||
offer = {type = 'give-item', item = 'fast-loader', count = 1}
|
||||
},
|
||||
{
|
||||
price = {{'coin', 3000}, {'express-transport-belt', 10}, {'fast-loader', 1}},
|
||||
price = {{name = 'coin', count = 3000}, {name = 'express-transport-belt', count = 10}, {name = 'fast-loader', count = 1}},
|
||||
offer = {type = 'give-item', item = 'express-loader', count = 1}
|
||||
},
|
||||
{price = {{'coin', 2}, {'steel-plate', 1}, {'explosives', 10}}, offer = {type = 'give-item', item = 'land-mine', count = 1}}
|
||||
{price = {{name = 'coin', count = 2}, {name = 'steel-plate', count = 1}, {name = 'explosives', count = 10}}, offer = {type = 'give-item', item = 'land-mine', count = 1}}
|
||||
}
|
||||
end
|
||||
function Public.initial_cargo_boxes()
|
||||
@ -262,7 +262,7 @@ function Public.initial_cargo_boxes()
|
||||
{name = 'coal', count = math_random(32, 64)},
|
||||
{name = 'iron-ore', count = math_random(32, 128)},
|
||||
{name = 'copper-ore', count = math_random(32, 128)},
|
||||
{name = 'empty-barrel', count = math_random(16, 32)},
|
||||
{name = 'barrel', count = math_random(16, 32)},
|
||||
{name = 'submachine-gun', count = 1},
|
||||
{name = 'submachine-gun', count = 1},
|
||||
{name = 'shotgun', count = 1},
|
||||
@ -324,7 +324,7 @@ function Public.scrap()
|
||||
['processing-unit'] = {amount = 2, chance = 1},
|
||||
['used-up-uranium-fuel-cell'] = {amount = 1, chance = 4},
|
||||
['uranium-fuel-cell'] = {amount = 0.3, chance = 1},
|
||||
['rocket-control-unit'] = {amount = 0.3, chance = 1},
|
||||
--['rocket-control-unit'] = {amount = 0.3, chance = 1},
|
||||
['low-density-structure'] = {amount = 0.5, chance = 2},
|
||||
['heat-pipe'] = {amount = 1, chance = 1},
|
||||
['engine-unit'] = {amount = 3, chance = 3},
|
||||
@ -353,7 +353,7 @@ function Public.scrap()
|
||||
['rocket-fuel'] = {amount = 0.3, chance = 8},
|
||||
['grenade'] = {amount = 0.3, chance = 40},
|
||||
['solid-fuel'] = {amount = 0.4, chance = 50},
|
||||
['empty-barrel'] = {amount = 0.1, chance = 50},
|
||||
['barrel'] = {amount = 0.1, chance = 50},
|
||||
['crude-oil-barrel'] = {amount = 0.1, chance = 70},
|
||||
['lubricant-barrel'] = {amount = 0.1, chance = 40},
|
||||
['petroleum-gas-barrel'] = {amount = 0.1, chance = 60},
|
||||
@ -375,8 +375,8 @@ function Public.scrap()
|
||||
table.insert(second_raffle, {name = k, amount = t.amount})
|
||||
end
|
||||
end
|
||||
Rand.shuffle(scrap_raffle)
|
||||
Rand.shuffle(second_raffle)
|
||||
table.shuffle_table(scrap_raffle)
|
||||
table.shuffle_table(second_raffle)
|
||||
|
||||
return {main = scrap_raffle, second = second_raffle}
|
||||
end
|
||||
|
@ -11,22 +11,28 @@ local Server = require 'utils.server'
|
||||
local math_random = math.random
|
||||
local math_max = math.max
|
||||
|
||||
function Public.get_map_gen_settings()
|
||||
function Public.get_map_gen_settings(planet_name)
|
||||
local seed = math_random(1, 1000000)
|
||||
local map_gen_settings = {
|
||||
['seed'] = seed,
|
||||
['width'] = 960,
|
||||
['height'] = 960,
|
||||
['water'] = 0.1,
|
||||
['starting_area'] = 1,
|
||||
['cliff_settings'] = {cliff_elevation_interval = 0, cliff_elevation_0 = 0},
|
||||
['default_enable_all_autoplace_controls'] = true,
|
||||
['autoplace_settings'] = {
|
||||
['entity'] = {treat_missing_as_default = false},
|
||||
['tile'] = {treat_missing_as_default = true},
|
||||
['decorative'] = {treat_missing_as_default = true}
|
||||
}
|
||||
}
|
||||
local map_gen_settings = prototypes.space_location['nauvis'].map_gen_settings
|
||||
-- if planet_name then
|
||||
-- map_gen_settings = prototypes.space_location[planet_name].map_gen_settings
|
||||
-- else
|
||||
-- map_gen_settings = {
|
||||
-- ['water'] = 0.1,
|
||||
-- ['default_enable_all_autoplace_controls'] = true,
|
||||
-- ['autoplace_settings'] = {
|
||||
-- ['entity'] = {treat_missing_as_default = false},
|
||||
-- ['tile'] = {treat_missing_as_default = true},
|
||||
-- ['decorative'] = {treat_missing_as_default = true}
|
||||
-- }
|
||||
-- }
|
||||
-- end
|
||||
map_gen_settings.seed = seed
|
||||
map_gen_settings.width = 960
|
||||
map_gen_settings.height = 960
|
||||
map_gen_settings.starting_area = 1
|
||||
map_gen_settings.cliff_settings = {name = 'cliff', cliff_elevation_interval = 0, cliff_elevation_0 = 0, cliff_smoothing = 0.5, richness = 0}
|
||||
map_gen_settings.default_enable_all_autoplace_controls = false
|
||||
return map_gen_settings
|
||||
end
|
||||
|
||||
@ -115,9 +121,9 @@ function Public.restart_settings()
|
||||
for _, player in pairs(game.connected_players) do
|
||||
playertable.flame_boots[player.index] = {fuel = 1, steps = {}}
|
||||
end
|
||||
global.friendly_fire_history = {}
|
||||
global.landfill_history = {}
|
||||
global.mining_history = {}
|
||||
storage.friendly_fire_history = {}
|
||||
storage.landfill_history = {}
|
||||
storage.mining_history = {}
|
||||
get_score.score_table = {}
|
||||
|
||||
game.difficulty_settings.technology_price_multiplier = Balance.Tech_price_multiplier
|
||||
@ -150,18 +156,18 @@ function Public.restart_settings()
|
||||
game.map_settings.path_finder.long_cache_size = 100
|
||||
game.map_settings.unit_group.max_gathering_unit_groups = 10
|
||||
game.forces.neutral.character_inventory_slots_bonus = 500
|
||||
game.forces.enemy.evolution_factor = 0.0001
|
||||
game.forces.enemy.set_evolution_factor(0.0001)
|
||||
game.forces.scrapyard.set_friend('enemy', true)
|
||||
game.forces.enemy.set_friend('scrapyard', true)
|
||||
game.forces.enemy.set_ammo_damage_modifier('rocket', -0.5)
|
||||
game.forces.player.technologies['land-mine'].enabled = false
|
||||
game.forces.player.technologies['landfill'].enabled = false
|
||||
game.forces.player.technologies['cliff-explosives'].enabled = false
|
||||
game.forces.player.technologies['fusion-reactor-equipment'].enabled = false
|
||||
game.forces.player.technologies['fission-reactor-equipment'].enabled = false
|
||||
game.forces.player.technologies['power-armor-mk2'].enabled = false
|
||||
game.forces.player.technologies['railway'].researched = true
|
||||
game.forces.player.recipes['pistol'].enabled = false
|
||||
game.forces.player.ghost_time_to_live = 15 * 60 * 60
|
||||
--game.forces.player.ghost_time_to_live = 15 * 60 * 60
|
||||
end
|
||||
|
||||
function Public.set_difficulty_settings()
|
||||
@ -331,10 +337,11 @@ function Public.post_jump()
|
||||
local difficulty = Difficulty.get().difficulty_vote_value
|
||||
|
||||
game.forces.enemy.reset_evolution()
|
||||
local surface = game.get_surface(objective.active_surface_index)
|
||||
if objective.chronojumps + objective.overstaycount <= 40 and objective.world.id ~= 7 then
|
||||
game.forces.enemy.evolution_factor = 0 + 0.025 * (objective.chronojumps + objective.overstaycount)
|
||||
game.forces.enemy.set_evolution_factor(0 + 0.025 * (objective.chronojumps + objective.overstaycount), surface)
|
||||
else
|
||||
game.forces.enemy.evolution_factor = 1
|
||||
game.forces.enemy.set_evolution_factor(1, surface)
|
||||
end
|
||||
if objective.world.id == 7 then
|
||||
objective.locomotive_cargo[1].insert({name = 'space-science-pack', count = 1000})
|
||||
@ -367,7 +374,7 @@ function Public.post_jump()
|
||||
game.forces.enemy.set_ammo_damage_modifier('melee', 0.1 * objective.overstaycount)
|
||||
game.forces.enemy.set_ammo_damage_modifier('biological', 0.1 * objective.overstaycount)
|
||||
game.map_settings.pollution.enemy_attack_pollution_consumption_modifier = Balance.defaultai_attack_pollution_consumption_modifier(difficulty)
|
||||
game.map_settings.pollution.max_unit_group_size = Balance.max_new_attack_group_size(difficulty)
|
||||
--game.map_settings.pollution.max_unit_group_size = Balance.max_new_attack_group_size(difficulty)
|
||||
|
||||
if objective.chronojumps == 1 then
|
||||
if difficulty < 1 then
|
||||
@ -403,7 +410,7 @@ local function create_chunk_list(surface)
|
||||
chunks[#chunks + 1] = {pos = {x, y}, generated = surface.is_chunk_generated({x, y}), distance = math.sqrt(x * x + y * y)}
|
||||
end
|
||||
end
|
||||
for k, v in Rand.spairs(
|
||||
for k, v in table.spairs(
|
||||
chunks,
|
||||
function(t, a, b)
|
||||
return t[b].distance > t[a].distance
|
||||
|
@ -4,6 +4,7 @@ local math_random = math.random
|
||||
local Rand = require 'maps.chronosphere.random'
|
||||
local Balance = require 'maps.chronosphere.balance'
|
||||
local Difficulty = require 'modules.difficulty_vote'
|
||||
local FT = require 'utils.functions.flying_texts'
|
||||
local Public = {}
|
||||
|
||||
local texts = {
|
||||
@ -294,6 +295,15 @@ local texts = {
|
||||
}
|
||||
}
|
||||
|
||||
local function get_comfylatron_kind()
|
||||
local SA = script.active_mods['space-travel']
|
||||
if SA then
|
||||
return 'small-strafer-pentapod'
|
||||
else
|
||||
return 'behemoth-biter'
|
||||
end
|
||||
end
|
||||
|
||||
local function set_comfy_speech_bubble(text)
|
||||
local objective = Chrono_table.get_table()
|
||||
if objective.comfybubble then
|
||||
@ -365,7 +375,7 @@ local function visit_player()
|
||||
end
|
||||
local player = players[math_random(1, #players)]
|
||||
|
||||
objective.comfylatron.set_command(
|
||||
objective.comfylatron.commandable.set_command(
|
||||
{
|
||||
type = defines.command.go_to_location,
|
||||
destination_entity = player.character,
|
||||
@ -509,16 +519,16 @@ local function desync(event)
|
||||
)
|
||||
end
|
||||
local blocked = false
|
||||
if not objective.comfylatron.surface.find_non_colliding_position('compilatron', objective.comfylatron.position, 0.5, 0.1) then
|
||||
if not objective.comfylatron.surface.find_non_colliding_position(get_comfylatron_kind(), objective.comfylatron.position, 0.5, 0.1) then
|
||||
blocked = true
|
||||
end
|
||||
if not event or blocked or math_random(1, 5) == 1 then
|
||||
objective.comfylatron.surface.create_entity({name = 'medium-explosion', position = objective.comfylatron.position})
|
||||
objective.comfylatron.surface.create_entity({name = 'flying-text', position = objective.comfylatron.position, text = 'desync', color = {r = 150, g = 0, b = 0}})
|
||||
FT.flying_text(nil, objective.comfylatron.surface, objective.comfylatron.position, 'desync', {r = 150, g = 0, b = 0})
|
||||
objective.comfylatron.destroy()
|
||||
objective.comfylatron = nil
|
||||
else
|
||||
objective.comfylatron.surface.create_entity({name = 'flying-text', position = objective.comfylatron.position, text = 'desync evaded', color = {r = 0, g = 150, b = 0}})
|
||||
FT.flying_text(nil, objective.comfylatron.surface, objective.comfylatron.position, 'desync evaded', {r = 0, g = 150, b = 0})
|
||||
if event.cause then
|
||||
if event.cause.valid and event.cause.player then
|
||||
game.print({'chronosphere.message_comfylatron_desync', event.cause.player.name}, {r = 200, g = 0, b = 0})
|
||||
@ -547,7 +557,8 @@ local function alone()
|
||||
end
|
||||
|
||||
local analyze_blacklist = {
|
||||
['compilatron'] = true,
|
||||
['small-strafer-pentapod'] = true,
|
||||
['behemoth-biter'] = true,
|
||||
['car'] = true,
|
||||
['compi-speech-bubble'] = true,
|
||||
['entity-ghost'] = true,
|
||||
@ -572,7 +583,7 @@ local function analyze_random_nearby_entity()
|
||||
if not entities[1] then
|
||||
return false
|
||||
end
|
||||
entities = Rand.shuffle(entities)
|
||||
table.shuffle_table(entities)
|
||||
local entity = false
|
||||
for _, e in pairs(entities) do
|
||||
if not analyze_blacklist[e.name] then
|
||||
@ -603,7 +614,7 @@ local function analyze_random_nearby_entity()
|
||||
set_comfy_speech_bubble(str)
|
||||
|
||||
if not objective.comfylatron_greet_player_index then
|
||||
objective.comfylatron.set_command(
|
||||
objective.comfylatron.commandable.set_command(
|
||||
{
|
||||
type = defines.command.go_to_location,
|
||||
destination_entity = entity,
|
||||
@ -640,7 +651,7 @@ local function go_to_some_location()
|
||||
objective.comfylatron_greet_player_index = nil
|
||||
return false
|
||||
end
|
||||
objective.comfylatron.set_command(
|
||||
objective.comfylatron.commandable.set_command(
|
||||
{
|
||||
type = defines.command.go_to_location,
|
||||
destination_entity = player.character,
|
||||
@ -655,14 +666,14 @@ local function go_to_some_location()
|
||||
)
|
||||
else
|
||||
local p = {x = objective.comfylatron.position.x + (-96 + math_random(0, 192)), y = objective.comfylatron.position.y + (-96 + math_random(0, 192))}
|
||||
local target = objective.comfylatron.surface.find_non_colliding_position('compilatron', p, 8, 1)
|
||||
local target = objective.comfylatron.surface.find_non_colliding_position(get_comfylatron_kind(), p, 8, 1)
|
||||
if not target then
|
||||
return false
|
||||
end
|
||||
if not is_target_inside_habitat(target, objective.comfylatron.surface) then
|
||||
return false
|
||||
end
|
||||
objective.comfylatron.set_command(
|
||||
objective.comfylatron.commandable.set_command(
|
||||
{
|
||||
type = defines.command.go_to_location,
|
||||
destination = target,
|
||||
@ -707,7 +718,7 @@ local function spawn_comfylatron(surface_index, x, y)
|
||||
objective.comfylatron =
|
||||
surface.create_entity(
|
||||
{
|
||||
name = 'compilatron',
|
||||
name = get_comfylatron_kind(),
|
||||
position = {x, y + math_random(0, 256)},
|
||||
force = 'player',
|
||||
create_build_effect_smoke = false
|
||||
|
@ -8,6 +8,7 @@ local Public = {}
|
||||
local tick_tack_trap = require 'utils.functions.tick_tack_trap'
|
||||
local unearthing_worm = require 'utils.functions.unearthing_worm'
|
||||
local unearthing_biters = require 'utils.functions.unearthing_biters'
|
||||
local FT = require 'utils.functions.flying_texts'
|
||||
|
||||
local math_random = math.random
|
||||
local math_floor = math.floor
|
||||
@ -59,17 +60,6 @@ local function reward_ores(amount, mined_loot, surface, player, entity)
|
||||
end
|
||||
end
|
||||
|
||||
local function flying_text(surface, position, text, color)
|
||||
surface.create_entity(
|
||||
{
|
||||
name = 'flying-text',
|
||||
position = {position.x, position.y - 0.5},
|
||||
text = text,
|
||||
color = color
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
function Public.biters_chew_rocks_faster(event)
|
||||
if not event.cause then
|
||||
return
|
||||
@ -123,7 +113,7 @@ end
|
||||
function Public.lava_planet(event)
|
||||
local playertable = Chrono_table.get_player_table()
|
||||
local player = game.get_player(event.player_index)
|
||||
if not player.character then
|
||||
if not player or not player.character then
|
||||
return
|
||||
end
|
||||
if player.character.driving then
|
||||
@ -159,7 +149,7 @@ function Public.lava_planet(event)
|
||||
end
|
||||
|
||||
function Public.shred_simple_entities(entity)
|
||||
if game.forces.enemy.evolution_factor < 0.25 then
|
||||
if game.forces.enemy.get_evolution_factor(entity.surface) < 0.25 then
|
||||
return
|
||||
end
|
||||
local simple_entities = entity.surface.find_entities_filtered({type = {'simple-entity', 'tree'}, area = {{entity.position.x - 3, entity.position.y - 3}, {entity.position.x + 3, entity.position.y + 3}}})
|
||||
@ -175,7 +165,7 @@ function Public.spawner_loot(surface, position)
|
||||
local objective = Chrono_table.get_table()
|
||||
local count = math_random(1, 1 + objective.chronojumps)
|
||||
objective.research_tokens.weapons = objective.research_tokens.weapons + count
|
||||
flying_text(surface, position, {'chronosphere.token_weapons_add', count}, {r = 0.8, g = 0.8, b = 0.8})
|
||||
FT.flying_text(nil, surface, position, {'chronosphere.token_weapons_add', count}, {r = 0.8, g = 0.8, b = 0.8})
|
||||
script.raise_event(Chrono_table.events['update_upgrades_gui'], {})
|
||||
end
|
||||
end
|
||||
@ -217,7 +207,7 @@ function Public.choppy_loot(event)
|
||||
local main_item = choppy_entity_yield[entity.name][math_random(1, #choppy_entity_yield[entity.name])]
|
||||
local text = '+' .. amount .. ' [item=' .. main_item .. '] +' .. second_item_amount .. ' [item=' .. second_item .. ']'
|
||||
local player = game.get_player(event.player_index)
|
||||
flying_text(entity.surface, entity.position, text, {r = 0.8, g = 0.8, b = 0.8})
|
||||
FT.flying_text(player, entity.surface, entity.position, text, {r = 0.8, g = 0.8, b = 0.8})
|
||||
reward_ores(amount, main_item, entity.surface, player, player)
|
||||
reward_ores(second_item_amount, second_item, entity.surface, player, player)
|
||||
end
|
||||
@ -225,11 +215,12 @@ end
|
||||
|
||||
function Public.rocky_loot(event)
|
||||
local player = game.get_player(event.player_index)
|
||||
if not player or not player.valid then return end
|
||||
local amount = math_ceil(get_ore_amount(false))
|
||||
local rock_mining = {'iron-ore', 'iron-ore', 'iron-ore', 'iron-ore', 'copper-ore', 'copper-ore', 'copper-ore', 'stone', 'stone', 'coal', 'coal'}
|
||||
local mined_loot = rock_mining[math_random(1, #rock_mining)]
|
||||
local text = '+' .. amount .. ' [item=' .. mined_loot .. ']'
|
||||
flying_text(player.surface, player.position, text, {r = 0.98, g = 0.66, b = 0.22})
|
||||
FT.flying_text(player, player.surface, player.position, text, {r = 0.98, g = 0.66, b = 0.22})
|
||||
reward_ores(amount, mined_loot, player.surface, player, player)
|
||||
reward_ores(math_random(1, 3), 'raw-fish', player.surface, player, player)
|
||||
end
|
||||
@ -242,13 +233,14 @@ function Public.scrap_loot(event)
|
||||
local amount = math_ceil(get_ore_amount(true) * scrap.amount)
|
||||
local amount2 = math_ceil(get_ore_amount(true) * scrap2.amount)
|
||||
local player = game.get_player(event.player_index)
|
||||
if not player or not player.valid then return end
|
||||
local text = '+' .. amount .. ' [item=' .. scrap.name .. '] + ' .. amount2 .. ' [item=' .. scrap2.name .. ']'
|
||||
flying_text(player.surface, player.position, text, {r = 0.98, g = 0.66, b = 0.22})
|
||||
FT.flying_text(player, player.surface, player.position, text, {r = 0.98, g = 0.66, b = 0.22})
|
||||
reward_ores(amount, scrap.name, player.surface, player, player)
|
||||
reward_ores(amount2, scrap2.name, player.surface, player, player)
|
||||
if math_random(1, 50) == 1 then
|
||||
objective.research_tokens.tech = objective.research_tokens.tech + 1
|
||||
flying_text(player.surface, {x = player.position.x, y = player.position.y - 0.5}, {'chronosphere.token_tech_add', 1}, {r = 0.8, g = 0.8, b = 0.8})
|
||||
FT.flying_text(player, player.surface, {x = player.position.x, y = player.position.y - 0.5}, {'chronosphere.token_tech_add', 1}, {r = 0.8, g = 0.8, b = 0.8})
|
||||
end
|
||||
end
|
||||
|
||||
@ -284,7 +276,7 @@ function Public.swamp_loot(event)
|
||||
local mined_loot = rock_mining[math_random(1, #rock_mining)]
|
||||
reward_ores(amount, mined_loot, surface, nil, event.entity)
|
||||
local text = '+' .. amount .. ' [img=item/' .. mined_loot .. ']'
|
||||
flying_text(surface, event.entity.position, text, {r = 0.7, g = 0.8, b = 0.4})
|
||||
FT.flying_text(nil, surface, event.entity.position, text, {r = 0.7, g = 0.8, b = 0.4})
|
||||
end
|
||||
|
||||
function Public.biter_loot(event)
|
||||
@ -308,8 +300,8 @@ function Public.danger_silo(entity)
|
||||
objective.dangers[i].solar.destroy()
|
||||
objective.dangers[i].acu.destroy()
|
||||
objective.dangers[i].pole.destroy()
|
||||
rendering.destroy(objective.dangers[i].text)
|
||||
rendering.destroy(objective.dangers[i].timer)
|
||||
objective.dangers[i].text.destroy()
|
||||
objective.dangers[i].timer.destroy()
|
||||
objective.dangers[i].text = -1
|
||||
objective.dangers[i].timer = -1
|
||||
end
|
||||
@ -426,12 +418,12 @@ function Public.on_technology_effects_reset(event)
|
||||
|
||||
local fake_event = {}
|
||||
Public.mining_buffs(nil)
|
||||
for tech, bonuses in pairs(mining_researches) do
|
||||
tech = force.technologies[tech]
|
||||
if tech.researched == true or bonuses.infinite == true then
|
||||
fake_event.research = tech
|
||||
if bonuses.infinite and bonuses.infinite_level and tech.level > bonuses.infinite_level then
|
||||
for i = bonuses.infinite_level, tech.level - 1 do
|
||||
for name, bonuses in pairs(mining_researches) do
|
||||
technology = force.technologies[name]
|
||||
if technology.researched == true or bonuses.infinite == true then
|
||||
fake_event.research = technology
|
||||
if bonuses.infinite and bonuses.infinite_level and technology.level > bonuses.infinite_level then
|
||||
for i = bonuses.infinite_level, technology.level - 1 do
|
||||
Public.mining_buffs(fake_event)
|
||||
end
|
||||
else
|
||||
@ -462,8 +454,11 @@ function Public.render_train_hp()
|
||||
rendering.draw_text {
|
||||
text = {'chronosphere.train_HP', objective.health, objective.max_health},
|
||||
surface = surface,
|
||||
target = objective.locomotive,
|
||||
target_offset = {0, -2.5},
|
||||
target = {
|
||||
entity = objective.locomotive,
|
||||
offset = {0, -2.5},
|
||||
position = objective.locomotive.position
|
||||
},
|
||||
color = objective.locomotive.color,
|
||||
scale = 1.40,
|
||||
font = 'default-game',
|
||||
@ -474,8 +469,11 @@ function Public.render_train_hp()
|
||||
rendering.draw_text {
|
||||
text = {'chronosphere.train_name'},
|
||||
surface = surface,
|
||||
target = objective.locomotive,
|
||||
target_offset = {0, -4.25},
|
||||
target = {
|
||||
entity = objective.locomotive,
|
||||
offset = {0, -4.25},
|
||||
position = objective.locomotive.position
|
||||
},
|
||||
color = objective.locomotive.color,
|
||||
scale = 1.80,
|
||||
font = 'default-game',
|
||||
@ -500,7 +498,7 @@ function Public.set_objective_health(final_damage_amount)
|
||||
if objective.health < objective.max_health / 2 and final_damage_amount > 0 then
|
||||
Upgrades.trigger_poison()
|
||||
end
|
||||
rendering.set_text(objective.health_text, {'chronosphere.train_HP', objective.health, objective.max_health})
|
||||
objective.health_text.text = {'chronosphere.train_HP', objective.health, objective.max_health}
|
||||
end
|
||||
|
||||
function Public.nuclear_artillery(entity, cause)
|
||||
|
@ -40,8 +40,7 @@ local function create_gui(player)
|
||||
label.style.minimal_width = 10
|
||||
label.style.font_color = {r = 255, g = 200, b = 200}
|
||||
|
||||
local progressbar = frame.add({type = 'progressbar', name = 'progressbar', value = 0})
|
||||
progressbar.style = 'achievement_progressbar'
|
||||
local progressbar = frame.add({type = 'progressbar', name = 'progressbar', value = 0, style = 'achievement_progressbar'})
|
||||
progressbar.style.minimal_width = 96
|
||||
progressbar.style.maximal_width = 96
|
||||
progressbar.style.top_padding = 1
|
||||
@ -238,7 +237,7 @@ local function update_world_gui(player)
|
||||
local difficulty = Difficulty.get().difficulty_vote_value
|
||||
local overstay_jump = Balance.jumps_until_overstay_is_on(difficulty) or 3
|
||||
local world = objective.world
|
||||
local evolution = game.forces['enemy'].evolution_factor
|
||||
local evolution = game.forces['enemy'].get_evolution_factor(game.get_surface(objective.active_surface_index))
|
||||
local evo_color = {
|
||||
r = math_floor(255 * 1 * math_max(0, math_min(1, 1.2 - evolution * 2))),
|
||||
g = math_floor(255 * 1 * math_max(math_abs(0.5 - evolution * 1.5), 1 - evolution * 4)),
|
||||
@ -254,7 +253,7 @@ local function update_world_gui(player)
|
||||
frame['world_ores']['uranium-ore'].number = world.variant.u
|
||||
frame['world_ores']['oil'].number = world.variant.o
|
||||
frame['richness'].caption = {'chronosphere.gui_world_2', world.ores.name}
|
||||
frame['world_biters'].caption = {'chronosphere.gui_world_3', math_floor(evolution * 100, 1)}
|
||||
frame['world_biters'].caption = {'chronosphere.gui_world_3', math_floor(evolution * 100)}
|
||||
frame['world_biters'].style.font_color = evo_color
|
||||
|
||||
frame['world_biters3'].caption = {'chronosphere.gui_world_4_1', objective.overstaycount * 2.5, objective.overstaycount * 10}
|
||||
@ -291,7 +290,7 @@ local function world_gui(player)
|
||||
end
|
||||
local objective = Chrono_table.get_table()
|
||||
local world = objective.world
|
||||
local evolution = game.forces['enemy'].evolution_factor
|
||||
local evolution = game.forces['enemy'].get_evolution_factor(game.get_surface(objective.active_surface_index))
|
||||
local frame = player.gui.screen.add {type = 'frame', name = 'gui_world', caption = {'chronosphere.gui_world_button'}, direction = 'vertical'}
|
||||
frame.location = {x = 650, y = 45}
|
||||
frame.style.minimal_height = 300
|
||||
@ -310,7 +309,7 @@ local function world_gui(player)
|
||||
frame.add({type = 'label', name = 'richness', caption = {'chronosphere.gui_world_2', world.ores.name}})
|
||||
frame.add({type = 'label', name = 'world_time', caption = {'chronosphere.gui_world_5', world.dayspeed.name}})
|
||||
frame.add({type = 'line'})
|
||||
frame.add({type = 'label', name = 'world_biters', caption = {'chronosphere.gui_world_3', math_floor(evolution * 100, 1)}})
|
||||
frame.add({type = 'label', name = 'world_biters', caption = {'chronosphere.gui_world_3', math_floor(evolution * 100)}})
|
||||
frame.add({type = 'label', name = 'world_biters2', caption = {'chronosphere.gui_world_4'}})
|
||||
frame.add({type = 'label', name = 'world_biters3', caption = {'chronosphere.gui_world_4_1', objective.overstaycount * 2.5, objective.overstaycount * 10}})
|
||||
frame.add({type = 'line'})
|
||||
|
@ -43,10 +43,11 @@ local function reset_map()
|
||||
Worlds.determine_world(nil)
|
||||
local world = objective.world
|
||||
if not objective.active_surface_index then
|
||||
objective.active_surface_index = game.create_surface('chronosphere', Chrono.get_map_gen_settings()).index
|
||||
objective.active_surface_index = game.create_surface('chronosphere', Chrono.get_map_gen_settings(world.planet_name)).index
|
||||
--/c game.create_surface("pizza", prototypes.space_location["gleba"].map_gen_settings)
|
||||
else
|
||||
game.forces.player.set_spawn_position({12, 10}, game.surfaces[objective.active_surface_index])
|
||||
objective.active_surface_index = Reset.soft_reset_map(game.surfaces[objective.active_surface_index], Chrono.get_map_gen_settings(), Balance.starting_items).index
|
||||
objective.active_surface_index = Reset.soft_reset_map(game.surfaces[objective.active_surface_index], Chrono.get_map_gen_settings(world.planet_name), Balance.starting_items).index
|
||||
end
|
||||
|
||||
local surface = game.surfaces[objective.active_surface_index]
|
||||
@ -110,7 +111,8 @@ local function chronojump(choice)
|
||||
end
|
||||
end
|
||||
scheduletable.lab_cells = {}
|
||||
objective.active_surface_index = game.create_surface('chronosphere' .. objective.chronojumps, Chrono.get_map_gen_settings()).index
|
||||
Worlds.determine_world(nil)
|
||||
objective.active_surface_index = game.create_surface('chronosphere' .. objective.chronojumps, Chrono.get_map_gen_settings(objective.world.planet_name)).index
|
||||
local surface = game.surfaces[objective.active_surface_index]
|
||||
|
||||
generate_overworld(surface, choice)
|
||||
|
@ -34,7 +34,7 @@ function Public.on_player_mined_entity(event)
|
||||
Event_functions.trap(entity, false)
|
||||
Event_functions.choppy_loot(event)
|
||||
end
|
||||
elseif entity.name == 'rock-huge' or entity.name == 'rock-big' or entity.name == 'sand-rock-big' then
|
||||
elseif entity.name == 'huge-rock' or entity.name == 'big-rock' or entity.name == 'big-sand-rock' then
|
||||
if objective.world.id == 3 then --rocky worlds
|
||||
event.buffer.clear()
|
||||
-- elseif objective.world.id == 5 then --maze worlds
|
||||
@ -51,7 +51,7 @@ end
|
||||
function Public.pre_player_mined_item(event)
|
||||
local objective = Chrono_table.get_table()
|
||||
if objective.world.id == 3 then --rocky worlds
|
||||
if event.entity.name == 'rock-huge' or event.entity.name == 'rock-big' or event.entity.name == 'sand-rock-big' then
|
||||
if event.entity.name == 'huge-rock' or event.entity.name == 'big-rock' or event.entity.name == 'big-sand-rock' then
|
||||
Event_functions.trap(event.entity, false)
|
||||
event.entity.destroy()
|
||||
Event_functions.rocky_loot(event)
|
||||
@ -62,6 +62,7 @@ end
|
||||
function Public.on_pre_player_left_game(event)
|
||||
local playertable = Chrono_table.get_player_table()
|
||||
local player = game.get_player(event.player_index)
|
||||
if not player or not player.valid then return end
|
||||
if player.controller_type == defines.controllers.editor then
|
||||
player.toggle_map_editor()
|
||||
end
|
||||
@ -74,6 +75,7 @@ function Public.on_player_joined_game(event)
|
||||
local objective = Chrono_table.get_table()
|
||||
local playertable = Chrono_table.get_player_table()
|
||||
local player = game.get_player(event.player_index)
|
||||
if not player or not player.valid then return end
|
||||
if not playertable.flame_boots[event.player_index] then
|
||||
playertable.flame_boots[event.player_index] = {}
|
||||
end
|
||||
@ -85,7 +87,7 @@ function Public.on_player_joined_game(event)
|
||||
local surface = game.surfaces[objective.active_surface_index]
|
||||
|
||||
if player.online_time == 0 then
|
||||
player.teleport(surface.find_non_colliding_position('character', game.forces.player.get_spawn_position(surface), 32, 0.5), surface)
|
||||
player.teleport(surface.find_non_colliding_position('character', player.force.get_spawn_position(surface), 32, 0.5) or {0, 0}, surface)
|
||||
for item, amount in pairs(Balance.starting_items) do
|
||||
player.insert({name = item, count = amount})
|
||||
end
|
||||
@ -95,16 +97,16 @@ function Public.on_player_joined_game(event)
|
||||
player.character = nil
|
||||
player.set_controller({type = defines.controllers.god})
|
||||
player.create_character()
|
||||
player.teleport(surface.find_non_colliding_position('character', game.forces.player.get_spawn_position(surface), 32, 0.5), surface)
|
||||
player.teleport(surface.find_non_colliding_position('character', player.force.get_spawn_position(surface), 32, 0.5) or {0, 0}, surface)
|
||||
for item, amount in pairs(Balance.starting_items) do
|
||||
player.insert({name = item, count = amount})
|
||||
end
|
||||
end
|
||||
|
||||
local tile = surface.get_tile(player.position)
|
||||
local tile = surface.get_tile(player.position.x, player.position.y)
|
||||
if tile.valid then
|
||||
if tile.name == 'out-of-map' then
|
||||
player.teleport(surface.find_non_colliding_position('character', game.forces.player.get_spawn_position(surface), 32, 0.5), surface)
|
||||
player.teleport(surface.find_non_colliding_position('character', player.force.get_spawn_position(surface), 32, 0.5) or {0, 0}, surface)
|
||||
end
|
||||
end
|
||||
Minimap.update_surface(player)
|
||||
@ -113,6 +115,7 @@ end
|
||||
|
||||
function Public.on_player_changed_surface(event)
|
||||
local player = game.get_player(event.player_index)
|
||||
if not player or not player.valid then return end
|
||||
Minimap.toggle_button(player)
|
||||
if not player.is_cursor_empty() then
|
||||
if player.cursor_stack and player.cursor_stack.valid_for_read then
|
||||
@ -134,9 +137,54 @@ function Public.on_player_changed_surface(event)
|
||||
|
||||
end
|
||||
|
||||
local function try_destroy_platform(entity, cause)
|
||||
local pos = entity.position
|
||||
local surface = entity.surface
|
||||
if surface.platform then return end
|
||||
local asteroids = {
|
||||
['small-metallic-asteroid'] = {size = 1, amount = 1},
|
||||
['medium-metallic-asteroid'] = {size = 2, amount = 2},
|
||||
['big-metallic-asteroid'] = {size = 3, amount = 4},
|
||||
['huge-metallic-asteroid'] = {size = 6, amount = 6},
|
||||
['small-carbonic-asteroid'] = {size = 1, amount = 1},
|
||||
['medium-carbonic-asteroid'] = {size = 2, amount = 2},
|
||||
['big-carbonic-asteroid'] = {size = 3, amount = 4},
|
||||
['huge-carbonic-asteroid'] = {size = 6, amount = 6},
|
||||
['small-oxide-asteroid'] = {size = 1, amount = 1},
|
||||
['medium-oxide-asteroid'] = {size = 2, amount = 2},
|
||||
['big-oxide-asteroid'] = {size = 3, amount = 4},
|
||||
['huge-oxide-asteroid'] = {size = 6, amount = 6},
|
||||
['small-interstellar-asteroid'] = {size = 1, amount = 1},
|
||||
['medium-interstellar-asteroid'] = {size = 2, amount = 2},
|
||||
['big-interstellar-asteroid'] = {size = 3, amount = 4},
|
||||
['huge-interstellar-asteroid'] = {size = 6, amount = 6},
|
||||
}
|
||||
local stone = asteroids[entity.name]
|
||||
if cause then
|
||||
for i = stone.amount, 0, -1 do
|
||||
--register some loot or something. Can't spawn chunks outside the actual space platform!
|
||||
end
|
||||
return
|
||||
end
|
||||
local tiles = {}
|
||||
local size = stone.size
|
||||
for x = -size, size, 1 do
|
||||
for y = -size, size, 1 do
|
||||
local tile = entity.surface.get_tile(pos.x + x,pos.y + y)
|
||||
if tile and tile.valid and tile.name == 'space-platform-foundation' then
|
||||
tiles[#tiles+1] = {position = {x = pos.x + x, y = pos.y + y}, name = 'empty-space'}
|
||||
end
|
||||
end
|
||||
end
|
||||
entity.surface.set_tiles(tiles)
|
||||
end
|
||||
|
||||
function Public.on_entity_died(event)
|
||||
local objective = Chrono_table.get_table()
|
||||
local entity = event.entity
|
||||
if entity.type == 'asteroid' then
|
||||
try_destroy_platform(entity, event.cause)
|
||||
end
|
||||
if entity.type == 'tree' and objective.world.id == 4 then --choppy planet
|
||||
if event.cause then
|
||||
if event.cause.valid then
|
||||
@ -248,9 +296,9 @@ function Public.on_built_entity(event)
|
||||
return
|
||||
end
|
||||
local objective = Chrono_table.get_table()
|
||||
if entity.type == 'entity-ghost' then
|
||||
--[[ if entity.type == 'entity-ghost' then
|
||||
entity.time_to_live = game.forces.player.ghost_time_to_live
|
||||
end
|
||||
end ]]
|
||||
if entity.name == 'spidertron' then
|
||||
if objective.world.id ~= 7 or entity.surface.name == 'cargo_wagon' then
|
||||
entity.destroy()
|
||||
@ -263,6 +311,7 @@ end
|
||||
|
||||
function Public.on_pre_player_died(event)
|
||||
local player = game.get_player(event.player_index)
|
||||
if not player or not player.valid then return end
|
||||
local surface = player.surface
|
||||
local poisons = surface.count_entities_filtered {position = player.position, radius = 10, name = 'poison-cloud'}
|
||||
if poisons > 0 then
|
||||
@ -277,7 +326,13 @@ end
|
||||
function Public.script_raised_revive(event)
|
||||
local entity = event.entity
|
||||
if not entity or not entity.valid then return end
|
||||
if entity.force.name == "player" then return end
|
||||
if entity.force.name == "player" then
|
||||
entity.minable = false
|
||||
entity.destructible = false
|
||||
if entity.name == 'solar-panel' or entity.name == 'substation' then
|
||||
entity.operable = false
|
||||
end
|
||||
end
|
||||
if entity.force.name == "scrapyard" then
|
||||
if entity.name == "gun-turret" then
|
||||
local objective = Chrono_table.get_table()
|
||||
|
@ -1,10 +1,10 @@
|
||||
local Chrono_table = require 'maps.chronosphere.table'
|
||||
local Rand = require 'maps.chronosphere.random'
|
||||
local Balance = require 'maps.chronosphere.balance'
|
||||
local Difficulty = require 'modules.difficulty_vote'
|
||||
|
||||
local Public = {}
|
||||
local List = require 'maps.chronosphere.production_list'
|
||||
local FT = require 'utils.functions.flying_texts'
|
||||
|
||||
local function roll_assembler()
|
||||
local objective = Chrono_table.get_table()
|
||||
@ -15,7 +15,7 @@ local function roll_assembler()
|
||||
table.insert(choices.weights, item.weight)
|
||||
end
|
||||
end
|
||||
return Rand.raffle(choices.types, choices.weights)
|
||||
return table.get_random_weighted_t(choices.types, choices.weights)
|
||||
end
|
||||
|
||||
function Public.calculate_factory_level(xp, whole_level)
|
||||
@ -53,13 +53,14 @@ local function produce(factory, train)
|
||||
factory.progress = factory.progress - (1 + multi) * List[id].base_time * 60
|
||||
local inserted = factory.entity.get_output_inventory().insert {name = List[id].name, count = 1 + multi}
|
||||
factory.produced = factory.produced + inserted
|
||||
factory.entity.surface.pollute(factory.entity.position, inserted * pollution_coef)
|
||||
local surface = factory.entity.surface
|
||||
surface.pollute(factory.entity.position, inserted * pollution_coef)
|
||||
if train then
|
||||
game.pollution_statistics.on_flow('cargo-wagon', inserted * pollution_coef)
|
||||
game.forces.player.item_production_statistics.on_flow(List[id].name, inserted)
|
||||
game.get_pollution_statistics(surface).on_flow('cargo-wagon', inserted * pollution_coef)
|
||||
game.forces.player.get_item_production_statistics(surface).on_flow(List[id].name, inserted)
|
||||
factory.entity.products_finished = factory.entity.products_finished + inserted
|
||||
else
|
||||
game.pollution_statistics.on_flow('item-on-ground', inserted * pollution_coef)
|
||||
game.get_pollution_statistics(surface).on_flow('item-on-ground', inserted * pollution_coef)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -84,17 +85,6 @@ local function levelup_train_factory(id)
|
||||
production.train_assemblers[id].tier = level
|
||||
end
|
||||
|
||||
local function flying_text(surface, position, text, color)
|
||||
surface.create_entity(
|
||||
{
|
||||
name = 'flying-text',
|
||||
position = {position.x, position.y - 0.5},
|
||||
text = text,
|
||||
color = color
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
function Public.produce_assemblers()
|
||||
local production = Chrono_table.get_production_table()
|
||||
for _, factory in pairs(production.assemblers) do
|
||||
@ -159,10 +149,10 @@ function Public.check_activity()
|
||||
local count = surface.count_entities_filtered {position = entity.position, radius = 10, force = 'player'}
|
||||
if count > 10 then
|
||||
factory.active = true
|
||||
flying_text(surface, entity.position, 'Active', {r = 0, g = 0.98, b = 0})
|
||||
FT.flying_text(nil, surface, entity.position, 'Active', {r = 0, g = 0.98, b = 0})
|
||||
else
|
||||
factory.active = false
|
||||
flying_text(surface, entity.position, 'Not Active', {r = 0.98, g = 0, b = 0})
|
||||
FT.flying_text(nil, surface, entity.position, 'Not Active', {r = 0.98, g = 0, b = 0})
|
||||
end
|
||||
::continue::
|
||||
end
|
||||
|
@ -44,7 +44,7 @@ List[6] = {
|
||||
id = 6,
|
||||
jump_min = 6,
|
||||
name = 'light-oil-barrel',
|
||||
recipe_override = 'fill-light-oil-barrel',
|
||||
recipe_override = 'light-oil-barrel',
|
||||
kind = 'fluid-assembler',
|
||||
base_time = 8,
|
||||
weight = 3
|
||||
@ -60,7 +60,7 @@ List[7] = {
|
||||
List[8] = {
|
||||
id = 8,
|
||||
jump_min = 4,
|
||||
name = 'empty-barrel',
|
||||
name = 'barrel',
|
||||
kind = 'assembler',
|
||||
base_time = 10,
|
||||
weight = 3
|
||||
|
@ -12,27 +12,27 @@ Public.biters = {
|
||||
}
|
||||
|
||||
Public.rocks = {
|
||||
'sand-rock-big',
|
||||
'sand-rock-big',
|
||||
'rock-big',
|
||||
'rock-big',
|
||||
'rock-big',
|
||||
'rock-big',
|
||||
'rock-big',
|
||||
'rock-big',
|
||||
'rock-big',
|
||||
'rock-huge'
|
||||
'big-sand-rock',
|
||||
'big-sand-rock',
|
||||
'big-rock',
|
||||
'big-rock',
|
||||
'big-rock',
|
||||
'big-rock',
|
||||
'big-rock',
|
||||
'big-rock',
|
||||
'big-rock',
|
||||
'huge-rock'
|
||||
}
|
||||
|
||||
Public.rock_decoratives = {
|
||||
'rock-medium',
|
||||
'rock-small',
|
||||
'rock-small',
|
||||
'rock-tiny',
|
||||
'rock-tiny',
|
||||
'rock-tiny',
|
||||
'sand-rock-medium',
|
||||
'sand-rock-small'
|
||||
'medium-rock',
|
||||
'small-rock',
|
||||
'small-rock',
|
||||
'tiny-rock',
|
||||
'tiny-rock',
|
||||
'tiny-rock',
|
||||
'medium-sand-rock',
|
||||
'small-sand-rock'
|
||||
}
|
||||
|
||||
Public.ores = {
|
||||
|
@ -1,73 +0,0 @@
|
||||
local math_random = math.random
|
||||
local Public = {}
|
||||
|
||||
function Public.shuffle(tbl)
|
||||
local size = #tbl
|
||||
for i = size, 1, -1 do
|
||||
local rand = math_random(size)
|
||||
tbl[i], tbl[rand] = tbl[rand], tbl[i]
|
||||
end
|
||||
return tbl
|
||||
end
|
||||
|
||||
local function is_closer(pos1, pos2, pos)
|
||||
return ((pos1.x - pos.x) ^ 2 + (pos1.y - pos.y) ^ 2) < ((pos2.x - pos.x) ^ 2 + (pos2.y - pos.y) ^ 2)
|
||||
end
|
||||
|
||||
function Public.shuffle_distance(tbl, position)
|
||||
local size = #tbl
|
||||
for i = size, 1, -1 do
|
||||
local rand = math_random(size)
|
||||
if is_closer(tbl[i].position, tbl[rand].position, position) and i > rand then
|
||||
tbl[i], tbl[rand] = tbl[rand], tbl[i]
|
||||
end
|
||||
end
|
||||
return tbl
|
||||
end
|
||||
|
||||
function Public.raffle(values, weights) --arguments of the form {[a] = A, [b] = B, ...} and {[a] = a_weight, [b] = b_weight, ...} or just {a,b,c,...} and {1,2,3...}
|
||||
local total_weight = 0
|
||||
for k, w in pairs(weights) do
|
||||
assert(values[k])
|
||||
if w > 0 then
|
||||
total_weight = total_weight + w
|
||||
end
|
||||
-- negative weights treated as zero
|
||||
end
|
||||
assert(total_weight > 0)
|
||||
|
||||
local cumulative_probability = 0
|
||||
local rng = math_random()
|
||||
for k, v in pairs(values) do
|
||||
assert(weights[k])
|
||||
cumulative_probability = cumulative_probability + (weights[k] / total_weight)
|
||||
if rng <= cumulative_probability then
|
||||
return v
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function Public.spairs(t, order)
|
||||
-- collect the keys
|
||||
local keys = {}
|
||||
for k in pairs(t) do keys[#keys+1] = k end
|
||||
|
||||
-- if order function given, sort by it by passing the table and keys a, b,
|
||||
-- otherwise just sort the keys
|
||||
if order then
|
||||
table.sort(keys, function(a,b) return order(t, a, b) end)
|
||||
else
|
||||
table.sort(keys)
|
||||
end
|
||||
|
||||
-- return the iterator function
|
||||
local i = 0
|
||||
return function()
|
||||
i = i + 1
|
||||
if keys[i] then
|
||||
return keys[i], t[keys[i]]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return Public
|
@ -132,7 +132,7 @@ function Public.reset_table()
|
||||
chronosphere.research_tokens.tech = 0
|
||||
chronosphere.research_tokens.ecology = 0
|
||||
chronosphere.research_tokens.weapons = 0
|
||||
chronosphere.laser_battery = 0
|
||||
chronosphere.laser_battery = nil
|
||||
chronosphere.last_artillery_event = 0
|
||||
chronosphere.poison_mastery_unlocked = 0
|
||||
chronosphere.gen_speed = 2
|
||||
|
@ -22,8 +22,11 @@ function Public.danger_event(surface, left_top)
|
||||
rendering.draw_text {
|
||||
text = 'Nuclear silo',
|
||||
surface = surface,
|
||||
target = pole,
|
||||
target_offset = {5, -2.5},
|
||||
target = {
|
||||
entity = pole,
|
||||
offset = {5, -2.5},
|
||||
position = pole.position
|
||||
},
|
||||
color = {r = 0.98, g = 0, b = 0},
|
||||
scale = 1.00,
|
||||
font = 'default-game',
|
||||
@ -35,17 +38,20 @@ function Public.danger_event(surface, left_top)
|
||||
rendering.draw_text {
|
||||
text = ' ',
|
||||
surface = surface,
|
||||
target = pole,
|
||||
target_offset = {5, -1.5},
|
||||
target = {
|
||||
entity = pole,
|
||||
offset = {5, -1.5},
|
||||
position = pole.position
|
||||
},
|
||||
color = {r = 0.98, g = 0, b = 0},
|
||||
scale = 1.00,
|
||||
font = 'default-game',
|
||||
alignment = 'center',
|
||||
scale_with_zoom = false
|
||||
}
|
||||
silo.get_module_inventory().insert('effectivity-module-3')
|
||||
silo.get_module_inventory().insert('efficiency-module-3')
|
||||
silo.rocket_parts = 100
|
||||
--silo.get_module_inventory().insert("effectivity-module-3")
|
||||
--silo.get_module_inventory().insert("efficiency-module-3")
|
||||
local combinator =
|
||||
surface.create_entity({name = 'constant-combinator', position = {x = left_top.x + 11, y = left_top.y + 10}, force = 'player', create_build_effect_smoke = false})
|
||||
local speaker =
|
||||
@ -59,7 +65,7 @@ function Public.danger_event(surface, left_top)
|
||||
alert_parameters = {show_alert = true, show_on_map = true, icon_signal_id = {type = 'item', name = 'atomic-bomb'}, alert_message = 'Nuclear missile silo detected!'}
|
||||
}
|
||||
)
|
||||
combinator.connect_neighbour({wire = defines.wire_type.green, target_entity = speaker})
|
||||
combinator.get_wire_connector(defines.wire_connector_id.circuit_green, true).connect_to(speaker.get_wire_connector(defines.wire_connector_id.circuit_green, true), false)
|
||||
local rules = combinator.get_or_create_control_behavior()
|
||||
local rules2 = speaker.get_or_create_control_behavior()
|
||||
rules.set_signal(1, {signal = {type = 'virtual', name = 'signal-A'}, count = 1})
|
||||
@ -100,8 +106,11 @@ function Public.fish_market(surface, left_top)
|
||||
rendering.draw_text {
|
||||
text = 'Fish Market',
|
||||
surface = surface,
|
||||
target = market,
|
||||
target_offset = {0, -2.5},
|
||||
target = {
|
||||
entity = market,
|
||||
offset = {0, -2.5},
|
||||
position = market.position
|
||||
},
|
||||
color = objective.locomotive.color,
|
||||
scale = 1.00,
|
||||
font = 'default-game',
|
||||
@ -116,8 +125,11 @@ function Public.fish_market(surface, left_top)
|
||||
rendering.draw_text {
|
||||
text = 'Deposit fish here',
|
||||
surface = surface,
|
||||
target = fishchest,
|
||||
target_offset = {0, -2.5},
|
||||
target = {
|
||||
entity = fishchest,
|
||||
offset = {0, -2.5},
|
||||
position = fishchest.position
|
||||
},
|
||||
color = objective.locomotive.color,
|
||||
scale = 0.75,
|
||||
font = 'default-game',
|
||||
|
@ -79,8 +79,9 @@ function Public.train_pollution(source, interior_pollution)
|
||||
elseif source == 'wagons' then
|
||||
pollution = interior_pollution * Balance.machine_pollution_transfer_from_inside_factor(difficulty, objective.upgrades[2])
|
||||
end
|
||||
game.surfaces[objective.active_surface_index].pollute(pos, pollution)
|
||||
game.pollution_statistics.on_flow(stat_target, pollution - interior_pollution)
|
||||
local surface = game.surfaces[objective.active_surface_index]
|
||||
surface.pollute(pos, pollution)
|
||||
game.get_pollution_statistics(surface).on_flow(stat_target, pollution - interior_pollution)
|
||||
end
|
||||
|
||||
function Public.transfer_pollution()
|
||||
@ -101,12 +102,12 @@ function Public.ramp_evolution()
|
||||
objective.passivetimer * objective.passive_chronocharge_rate > objective.chronochargesneeded * 0.50 and
|
||||
objective.chronojumps >= Balance.jumps_until_overstay_is_on(Difficulty.get().difficulty_vote_value)
|
||||
then
|
||||
local evolution = game.forces.enemy.evolution_factor
|
||||
local evolution = game.forces.enemy.get_evolution_factor(game.get_surface(objective.active_surface_index))
|
||||
evolution = evolution * Balance.evoramp50_multiplier_per_10s(difficulty)
|
||||
if evolution > 1 then
|
||||
evolution = 1
|
||||
end
|
||||
game.forces.enemy.evolution_factor = evolution
|
||||
game.forces.enemy.set_evolution_factor(evolution, game.get_surface(objective.active_surface_index))
|
||||
end
|
||||
end
|
||||
|
||||
@ -327,7 +328,7 @@ function Public.dangertimer()
|
||||
objective.dangers[i].silo.launch_rocket()
|
||||
objective.dangers[i].silo.rocket_parts = 100
|
||||
end
|
||||
rendering.set_text(objective.dangers[i].timer, math_floor(timer / 60) .. ' min, ' .. timer % 60 .. ' s')
|
||||
objective.dangers[i].timer.text = math_floor(timer / 60) .. ' min, ' .. timer % 60 .. ' s'
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -372,7 +373,7 @@ function Public.offline_players()
|
||||
player_inv[4] = game.players[players[i].index].get_inventory(defines.inventory.character_ammo)
|
||||
player_inv[5] = game.players[players[i].index].get_inventory(defines.inventory.character_trash)
|
||||
local e = surface.create_entity({name = 'character', position = game.forces.player.get_spawn_position(surface), force = 'neutral'})
|
||||
local inv = e.get_inventory(defines.inventory.character_main)
|
||||
local inv = e and e.get_inventory(defines.inventory.character_main)
|
||||
for ii = 1, 5, 1 do
|
||||
if player_inv[ii].valid then
|
||||
for iii = 1, #player_inv[ii], 1 do
|
||||
@ -384,14 +385,18 @@ function Public.offline_players()
|
||||
end
|
||||
if #items > 0 then
|
||||
for item = 1, #items, 1 do
|
||||
if items[item].valid then
|
||||
if items[item].valid and inv and inv.valid then
|
||||
inv.insert(items[item])
|
||||
end
|
||||
end
|
||||
game.print({'chronosphere.message_accident'}, {r = 0.98, g = 0.66, b = 0.22})
|
||||
e.die('neutral')
|
||||
if e and e.valid then
|
||||
e.die('neutral')
|
||||
end
|
||||
else
|
||||
e.destroy()
|
||||
if e and e.valid then
|
||||
e.destroy()
|
||||
end
|
||||
end
|
||||
|
||||
for ii = 1, 5, 1 do
|
||||
@ -512,7 +517,7 @@ function Public.giftmas_lights()
|
||||
[4] = {r = 63, g = 49, b = 255, a = 1}, --modrá
|
||||
}
|
||||
for _ = 1, 5, 1 do
|
||||
rendering.set_color(lights[math_random(1, nr)], colors[math_random(1, 4)])
|
||||
lights[math_random(1, nr)].color = colors[math_random(1, 4)]
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
local Chrono_table = require 'maps.chronosphere.table'
|
||||
local Rand = require 'maps.chronosphere.random'
|
||||
local Balance = require 'maps.chronosphere.balance'
|
||||
local Difficulty = require 'modules.difficulty_vote'
|
||||
local math_random = math.random
|
||||
@ -36,8 +35,8 @@ local function treasure_chest_loot(difficulty, world)
|
||||
{3, 0, 1, false, 'small-lamp', 8, 32},
|
||||
{2, 0, 1, false, 'electric-mining-drill', 2, 4},
|
||||
{3, 0, 1, false, 'long-handed-inserter', 4, 16},
|
||||
{0.5, 0, 1, false, 'filter-inserter', 2, 12},
|
||||
{0.2, 0, 1, false, 'stack-filter-inserter', 2, 6},
|
||||
--{0.5, 0, 1, false, 'filter-inserter', 2, 12},
|
||||
--{0.2, 0, 1, false, 'stack-filter-inserter', 2, 6},
|
||||
{0.2, 0, 1, false, 'slowdown-capsule', 2, 4},
|
||||
{0.2, 0, 1, false, 'destroyer-capsule', 2, 4},
|
||||
{0.2, 0, 1, false, 'defender-capsule', 2, 4},
|
||||
@ -47,7 +46,7 @@ local function treasure_chest_loot(difficulty, world)
|
||||
{1, 0.15, 1, false, 'pump', 1, 2},
|
||||
{2, 0.15, 1, false, 'pumpjack', 1, 3},
|
||||
{0.02, 0.15, 1, false, 'oil-refinery', 1, 2},
|
||||
{3, 0, 1, false, 'effectivity-module', 1, 4},
|
||||
{3, 0, 1, false, 'efficiency-module', 1, 4},
|
||||
{3, 0, 1, false, 'speed-module', 1, 4},
|
||||
{3, 0, 1, false, 'productivity-module', 1, 4},
|
||||
--shotgun meta:
|
||||
@ -149,7 +148,7 @@ local function treasure_chest_loot(difficulty, world)
|
||||
-- super late-game:
|
||||
--{9, 0.8, 1.2, false, "railgun-dart", 12, 20},
|
||||
{1, 0.9, 1.1, true, 'power-armor-mk2', 1, 1},
|
||||
{1, 0.8, 1.2, true, 'fusion-reactor-equipment', 1, 1}
|
||||
{1, 0.8, 1.2, true, 'fission-reactor-equipment', 1, 1}
|
||||
|
||||
--{2, 0, 1, , "computer", 1, 1},
|
||||
--{1, 0.2, 1, , "railgun", 1, 1},
|
||||
@ -178,7 +177,7 @@ local function treasure_chest_loot(difficulty, world)
|
||||
{2, 0.2, 1.6, true, 'nuclear-reactor', 1, 1},
|
||||
{2, 0.2, 1, false, 'centrifuge', 1, 1},
|
||||
{1, 0.25, 1.75, true, 'nuclear-fuel', 1, 1},
|
||||
{1, 0.5, 1.5, true, 'fusion-reactor-equipment', 1, 1},
|
||||
{1, 0.5, 1.5, true, 'fission-reactor-equipment', 1, 1},
|
||||
{1, 0.5, 1.5, true, 'atomic-bomb', 1, 1}
|
||||
}
|
||||
end
|
||||
@ -186,14 +185,14 @@ local function treasure_chest_loot(difficulty, world)
|
||||
--[[
|
||||
if world.id == 7 then --biterwrld
|
||||
specialised_loot_raw = {
|
||||
{4, 0, 1, false, "effectivity-module", 1, 4},
|
||||
{4, 0, 1, false, "efficiency-module", 1, 4},
|
||||
{4, 0, 1, false, "productivity-module", 1, 4},
|
||||
{4, 0, 1, false, "speed-module", 1, 4},
|
||||
{2, 0, 1, false, "beacon", 1, 1},
|
||||
{0.5, 0, 1, false, "effectivity-module-2", 1, 4},
|
||||
{0.5, 0, 1, false, "efficiency-module-2", 1, 4},
|
||||
{0.5, 0, 1, false, "productivity-module-2", 1, 4},
|
||||
{0.5, 0, 1, false, "speed-module-2", 1, 4},
|
||||
{0.1, 0, 1, false, "effectivity-module-3", 1, 4},
|
||||
{0.1, 0, 1, false, "efficiency-module-3", 1, 4},
|
||||
{0.1, 0, 1, false, "productivity-module-3", 1, 4},
|
||||
{0.1, 0, 1, false, "speed-module-3", 1, 4},
|
||||
|
||||
@ -321,7 +320,7 @@ function Public.treasure_chest(surface, position, container_name)
|
||||
e.minable = false
|
||||
local inv = e.get_inventory(defines.inventory.chest)
|
||||
for _ = 1, math_random(2, 6), 1 do
|
||||
local loot = Rand.raffle(loot_types, loot_weights)
|
||||
local loot = table.get_random_weighted_t(loot_types, loot_weights)
|
||||
local difficulty_scaling = Balance.treasure_quantity_difficulty_scaling(difficulty)
|
||||
if objective.chronojumps == 0 then
|
||||
difficulty_scaling = 1
|
||||
|
@ -77,7 +77,7 @@ function Public.upgrade2(coin_scaling)
|
||||
local difficulty = Difficulty.get().difficulty_vote_value
|
||||
local upgrade = {
|
||||
name = {'chronosphere.upgrade_filter'},
|
||||
sprite = 'recipe/effectivity-module',
|
||||
sprite = 'recipe/efficiency-module',
|
||||
max_level = 9,
|
||||
type = 'train',
|
||||
enabled = true,
|
||||
@ -182,9 +182,9 @@ function Public.upgrade5(coin_scaling)
|
||||
item3 = {name = 'iron-chest', tt = 'entity-name', sprite = 'item/iron-chest', count = math_max(0, 250 - math_abs(objective.upgrades[5] - 1) * 250)},
|
||||
item4 = {name = 'steel-chest', tt = 'entity-name', sprite = 'item/steel-chest', count = math_max(0, 250 - math_abs(objective.upgrades[5] - 2) * 250)},
|
||||
item5 = {
|
||||
name = 'logistic-chest-storage',
|
||||
name = 'storage-chest',
|
||||
tt = 'entity-name',
|
||||
sprite = 'item/logistic-chest-storage',
|
||||
sprite = 'item/storage-chest',
|
||||
count = math_max(0, 250 - math_abs(objective.upgrades[5] - 3) * 250)
|
||||
}
|
||||
},
|
||||
@ -267,7 +267,7 @@ function Public.upgrade9(coin_scaling)
|
||||
local objective = Chrono_table.get_table()
|
||||
local upgrade = {
|
||||
name = {'chronosphere.upgrade_storage'},
|
||||
sprite = 'item/logistic-chest-storage',
|
||||
sprite = 'item/storage-chest',
|
||||
max_level = 4,
|
||||
type = 'train',
|
||||
enabled = true,
|
||||
@ -285,9 +285,9 @@ function Public.upgrade9(coin_scaling)
|
||||
item3 = {name = 'iron-chest', tt = 'entity-name', sprite = 'item/iron-chest', count = math_max(0, 250 - math_abs(objective.upgrades[9] - 1) * 250)},
|
||||
item4 = {name = 'steel-chest', tt = 'entity-name', sprite = 'item/steel-chest', count = math_max(0, 250 - math_abs(objective.upgrades[9] - 2) * 250)},
|
||||
item5 = {
|
||||
name = 'logistic-chest-storage',
|
||||
name = 'storage-chest',
|
||||
tt = 'entity-name',
|
||||
sprite = 'item/logistic-chest-storage',
|
||||
sprite = 'item/storage-chest',
|
||||
count = math_max(0, 250 - math_abs(objective.upgrades[9] - 3) * 250)
|
||||
}
|
||||
},
|
||||
@ -318,10 +318,10 @@ function Public.upgrade10(coin_scaling)
|
||||
return upgrade
|
||||
end
|
||||
|
||||
function Public.upgrade11()
|
||||
function Public.upgrade11(_coin_scaling)
|
||||
local upgrade = {
|
||||
name = {'chronosphere.upgrade_fusion'},
|
||||
sprite = 'recipe/fusion-reactor-equipment',
|
||||
sprite = 'recipe/fission-reactor-equipment',
|
||||
max_level = 999,
|
||||
type = 'player',
|
||||
enabled = true,
|
||||
@ -340,7 +340,7 @@ function Public.upgrade11()
|
||||
return upgrade
|
||||
end
|
||||
|
||||
function Public.upgrade12()
|
||||
function Public.upgrade12(_coin_scaling)
|
||||
local upgrade = {
|
||||
name = {'chronosphere.upgrade_mk2'},
|
||||
sprite = 'recipe/power-armor-mk2',
|
||||
@ -410,7 +410,7 @@ function Public.upgrade15(coin_scaling)
|
||||
local objective = Chrono_table.get_table()
|
||||
local upgrade = {
|
||||
name = {'chronosphere.upgrade_computer3'},
|
||||
sprite = 'item/rocket-control-unit',
|
||||
sprite = 'item/utility-science-pack',
|
||||
max_level = 10,
|
||||
type = 'quest',
|
||||
enabled = objective.upgrades[14] == 1,
|
||||
@ -420,7 +420,7 @@ function Public.upgrade15(coin_scaling)
|
||||
cost = {
|
||||
item1 = {name = 'coin', tt = 'item-name', sprite = 'item/coin', count = 2000 * coin_scaling},
|
||||
item2 = {name = 'low-density-structure', tt = 'item-name', sprite = 'item/low-density-structure', count = 100},
|
||||
item3 = {name = 'rocket-control-unit', tt = 'item-name', sprite = 'item/rocket-control-unit', count = 100},
|
||||
item3 = {name = 'utility-science-pack', tt = 'item-name', sprite = 'item/utility-science-pack', count = 100},
|
||||
item4 = {name = 'uranium-fuel-cell', tt = 'item-name', sprite = 'item/uranium-fuel-cell', count = 50}
|
||||
},
|
||||
virtual_cost = {
|
||||
@ -430,11 +430,11 @@ function Public.upgrade15(coin_scaling)
|
||||
return upgrade
|
||||
end
|
||||
|
||||
function Public.upgrade16()
|
||||
function Public.upgrade16(_coin_scaling)
|
||||
local objective = Chrono_table.get_table()
|
||||
local upgrade = {
|
||||
name = {'chronosphere.upgrade_computer4'},
|
||||
sprite = 'item/satellite',
|
||||
sprite = 'item/space-science-pack',
|
||||
max_level = 1,
|
||||
type = 'quest',
|
||||
enabled = objective.upgrades[15] == 10,
|
||||
@ -443,7 +443,7 @@ function Public.upgrade16()
|
||||
jump_limit = 25,
|
||||
cost = {
|
||||
item1 = {name = 'rocket-silo', tt = 'entity-name', sprite = 'item/rocket-silo', count = 1},
|
||||
item2 = {name = 'satellite', tt = 'item-name', sprite = 'item/satellite', count = 1},
|
||||
item2 = {name = 'space-science-pack', tt = 'item-name', sprite = 'item/space-science-pack', count = 1},
|
||||
item3 = {name = 'spidertron', tt = 'entity-name', sprite = 'item/spidertron', count = 2}
|
||||
},
|
||||
virtual_cost = {
|
||||
@ -476,7 +476,7 @@ function Public.upgrade17(coin_scaling)
|
||||
return upgrade
|
||||
end
|
||||
|
||||
function Public.upgrade18()
|
||||
function Public.upgrade18(_coin_scaling)
|
||||
local objective = Chrono_table.get_table()
|
||||
local upgrade = {
|
||||
name = {'chronosphere.upgrade_researchspeed'},
|
||||
@ -562,7 +562,7 @@ function Public.upgrade20(coin_scaling)
|
||||
return upgrade
|
||||
end
|
||||
|
||||
function Public.upgrade21()
|
||||
function Public.upgrade21(_coin_scaling)
|
||||
local objective = Chrono_table.get_table()
|
||||
local difficulty = Difficulty.get().difficulty_vote_value
|
||||
local upgrade = {
|
||||
@ -634,8 +634,8 @@ function Public.upgrade23(coin_scaling)
|
||||
item2 = {name = 'artillery-turret', tt = 'entity-name', sprite = 'item/artillery-turret', count = 10},
|
||||
item3 = {name = 'military-science-pack', tt = 'item-name', sprite = 'item/military-science-pack', count = 1000},
|
||||
item4 = {name = 'atomic-bomb', tt = 'item-name', sprite = 'item/atomic-bomb', count = 20},
|
||||
item5 = {name = 'rocket-control-unit', tt = 'item-name', sprite = 'item/rocket-control-unit', count = 50},
|
||||
item6 = {name = 'satellite', tt = 'item-name', sprite = 'item/satellite', count = 1}
|
||||
item5 = {name = 'utility-science-pack', tt = 'item-name', sprite = 'item/utility-science-pack', count = 50},
|
||||
item6 = {name = 'space-science-pack', tt = 'item-name', sprite = 'item/space-science-pack', count = 1}
|
||||
},
|
||||
virtual_cost = {
|
||||
virtual1 = {type = 'tech', name = Public.tokens.tech.name, tt = 'chronosphere', sprite = Public.tokens.tech.sprite, count = 200}
|
||||
@ -644,7 +644,7 @@ function Public.upgrade23(coin_scaling)
|
||||
return upgrade
|
||||
end
|
||||
|
||||
function Public.upgrade24()
|
||||
function Public.upgrade24(_coin_scaling)
|
||||
local objective = Chrono_table.get_table()
|
||||
local upgrade = {
|
||||
name = {'chronosphere.upgrade_nuclear_artillery_ammo'},
|
||||
@ -665,7 +665,7 @@ function Public.upgrade24()
|
||||
return upgrade
|
||||
end
|
||||
|
||||
function Public.upgrade25()
|
||||
function Public.upgrade25(_coin_scaling)
|
||||
local objective = Chrono_table.get_table()
|
||||
local upgrade = {
|
||||
name = {'chronosphere.upgrade_poison_mastery'},
|
||||
|
@ -36,7 +36,7 @@ end
|
||||
local function upgrade_hp()
|
||||
local objective = Chrono_table.get_table()
|
||||
objective.max_health = 10000 + 2500 * objective.upgrades[1]
|
||||
rendering.set_text(objective.health_text, 'HP: ' .. objective.health .. ' / ' .. objective.max_health)
|
||||
objective.health_text.text = 'HP: ' .. objective.health .. ' / ' .. objective.max_health
|
||||
end
|
||||
|
||||
local function spawn_accumulators()
|
||||
@ -90,14 +90,18 @@ local function upgrade_out()
|
||||
local positions = {{-16, -62}, {15, -62}, {-16, 66}, {15, 66}}
|
||||
for i = 1, 4, 1 do
|
||||
local e = game.surfaces['cargo_wagon'].create_entity({name = 'blue-chest', position = positions[i], force = 'player'})
|
||||
if not e or not e.valid then break end
|
||||
e.destructible = false
|
||||
e.minable = false
|
||||
objective.outchests[i] = e
|
||||
rendering.draw_text {
|
||||
text = 'Output',
|
||||
surface = e.surface,
|
||||
target = e,
|
||||
target_offset = {0, -1.5},
|
||||
target = {
|
||||
entity = e,
|
||||
offset = {0, -1.5},
|
||||
position = e.position
|
||||
},
|
||||
color = objective.locomotive.color,
|
||||
scale = 0.80,
|
||||
font = 'default-game',
|
||||
|
@ -70,7 +70,7 @@ local function get_replacement_tile(surface, position)
|
||||
table.shuffle_table(vectors)
|
||||
for k, v in pairs(vectors) do
|
||||
local tile = surface.get_tile(position.x + v[1], position.y + v[2])
|
||||
if not tile.collides_with('resource') then
|
||||
if tile and tile.valid and not tile.collides_with('resource') then
|
||||
return tile.name
|
||||
end
|
||||
end
|
||||
@ -97,7 +97,7 @@ function Public.replace_water(surface, left_top)
|
||||
local p = { x = left_top.x + x, y = left_top.y + y }
|
||||
local tile = surface.get_tile(p)
|
||||
if tile.hidden_tile then
|
||||
surface.set_hidden_tile(p, get_replacement_tile(surface, p).name)
|
||||
surface.set_hidden_tile(p, get_replacement_tile(surface, p))
|
||||
elseif tile.collides_with('resource') then
|
||||
tiles[#tiles + 1] = { name = get_replacement_tile(surface, p), position = p }
|
||||
end
|
||||
@ -220,15 +220,16 @@ function Public.process_labyrinth_cell(pos, seed)
|
||||
end
|
||||
|
||||
function Public.build_blueprint(surface, position, id, force)
|
||||
local item = surface.create_entity { name = "item-on-ground", position = position, stack = { name = "blueprint", count = 1 } }
|
||||
local success = item.stack.import_stack(Blueprints[id])
|
||||
local nauvis = game.get_surface(1)
|
||||
local item = nauvis and nauvis.create_entity { name = "item-on-ground", position = position, stack = { name = "blueprint", count = 1 } }
|
||||
local success = item and item.stack.import_stack(Blueprints[id])
|
||||
if success <= 0 then
|
||||
local ghosts = item.stack.build_blueprint { surface = surface, force = force, position = position, build_mode = defines.build_mode.forced }
|
||||
local ghosts = item and item.stack.build_blueprint { surface = surface, force = force, position = position, build_mode = defines.build_mode.forced } or {}
|
||||
for _, ghost in pairs(ghosts) do
|
||||
ghost.silent_revive({ raise_revive = true })
|
||||
end
|
||||
end
|
||||
if item.valid then item.destroy() end
|
||||
if item and item.valid then item.destroy() end
|
||||
end
|
||||
|
||||
return Public
|
||||
|
@ -1,7 +1,6 @@
|
||||
local Chrono_table = require 'maps.chronosphere.table'
|
||||
local Balance = require 'maps.chronosphere.balance'
|
||||
local Difficulty = require 'modules.difficulty_vote'
|
||||
local Rand = require 'maps.chronosphere.random'
|
||||
local random = math.random
|
||||
local Public = {}
|
||||
local Worlds = {}
|
||||
@ -10,17 +9,18 @@ Worlds[1] = {
|
||||
world_id = 1,
|
||||
map = require 'maps.chronosphere.worlds.basic',
|
||||
variants = {
|
||||
[1] = {id = 1, min = 1, weight = 1, name = {'chronosphere.map_1_1'}, fe = 6, cu = 1, c = 1, s = 1, u = 0, o = 1, biters = 16, moisture = -0.2, fa = 1},
|
||||
[2] = {id = 2, min = 1, weight = 1, name = {'chronosphere.map_1_2'}, fe = 1, cu = 6, c = 1, s = 1, u = 0, o = 1, biters = 16, moisture = 0.2, fa = 1},
|
||||
[3] = {id = 3, min = 2, weight = 1, name = {'chronosphere.map_1_3'}, fe = 1, cu = 1, c = 1, s = 6, u = 0, o = 1, biters = 16, moisture = -0.2, fa = 1},
|
||||
[4] = {id = 4, min = 4, weight = 1, name = {'chronosphere.map_1_4'}, fe = 1, cu = 1, c = 1, s = 1, u = 0, o = 6, biters = 16, moisture = 0.1, fa = 1},
|
||||
[5] = {id = 5, min = 6, weight = 1, name = {'chronosphere.map_1_5'}, fe = 1, cu = 1, c = 1, s = 1, u = 6, o = 1, biters = 16, moisture = -0.2, fa = 1},
|
||||
[6] = {id = 6, min = 2, weight = 1, name = {'chronosphere.map_1_6'}, fe = 1, cu = 1, c = 6, s = 1, u = 0, o = 1, biters = 16, moisture = 0, fa = 1},
|
||||
[7] = {id = 7, min = 4, weight = 1, name = {'chronosphere.map_1_7'}, fe = 2, cu = 2, c = 2, s = 2, u = 4, o = 3, biters = 40, moisture = 0.2, fa = 0},
|
||||
[8] = {id = 8, min = 2, weight = 1, name = {'chronosphere.map_1_8'}, fe = 1, cu = 1, c = 1, s = 1, u = 0, o = 0, biters = 16, moisture = 0.1, fa = 4},
|
||||
[9] = {id = 9, min = 1, weight = 1, name = {'chronosphere.map_1_9'}, fe = 2, cu = 2, c = 2, s = 2, u = 0, o = 2, biters = 10, moisture = 0, fa = 1},
|
||||
[10] = {id = 10, min = 0, weight = 0, name = {'chronosphere.map_1_10'}, fe = 4, cu = 3, c = 4, s = 2, u = 0, o = 0, biters = 1, moisture = -0.3, fa = 0},
|
||||
[11] = {id = 11, min = 6, weight = 1, name = {'chronosphere.map_1_11'}, fe = 3, cu = 3, c = 2, s = 3, u = 0, o = 0, biters = 6, moisture = -0.5, fa = 4}
|
||||
[1] = {id = 1, min = 1, weight = 1, name = {'chronosphere.map_1_1'}, pl = 'nauvis', fe = 6, cu = 1, c = 1, s = 1, u = 0, o = 1, biters = 16, moisture = -0.2, fa = 1},
|
||||
[2] = {id = 2, min = 1, weight = 1, name = {'chronosphere.map_1_2'}, pl = 'nauvis',fe = 1, cu = 6, c = 1, s = 1, u = 0, o = 1, biters = 16, moisture = 0.2, fa = 1},
|
||||
[3] = {id = 3, min = 2, weight = 1, name = {'chronosphere.map_1_3'}, pl = 'nauvis',fe = 1, cu = 1, c = 1, s = 6, u = 0, o = 1, biters = 16, moisture = -0.2, fa = 1},
|
||||
[4] = {id = 4, min = 4, weight = 1, name = {'chronosphere.map_1_4'}, pl = 'nauvis',fe = 1, cu = 1, c = 1, s = 1, u = 0, o = 6, biters = 16, moisture = 0.1, fa = 1},
|
||||
[5] = {id = 5, min = 6, weight = 1, name = {'chronosphere.map_1_5'}, pl = 'nauvis',fe = 1, cu = 1, c = 1, s = 1, u = 6, o = 1, biters = 16, moisture = -0.2, fa = 1},
|
||||
[6] = {id = 6, min = 2, weight = 1, name = {'chronosphere.map_1_6'}, pl = 'nauvis',fe = 1, cu = 1, c = 6, s = 1, u = 0, o = 1, biters = 16, moisture = 0, fa = 1},
|
||||
[7] = {id = 7, min = 4, weight = 1, name = {'chronosphere.map_1_7'}, pl = 'nauvis',fe = 2, cu = 2, c = 2, s = 2, u = 4, o = 3, biters = 40, moisture = 0.2, fa = 0},
|
||||
[8] = {id = 8, min = 2, weight = 1, name = {'chronosphere.map_1_8'}, pl = 'nauvis',fe = 1, cu = 1, c = 1, s = 1, u = 0, o = 0, biters = 16, moisture = 0.1, fa = 4},
|
||||
[9] = {id = 9, min = 1, weight = 1, name = {'chronosphere.map_1_9'}, pl = 'nauvis',fe = 2, cu = 2, c = 2, s = 2, u = 0, o = 2, biters = 10, moisture = 0, fa = 1},
|
||||
[10] = {id = 10, min = 0, weight = 0, name = {'chronosphere.map_1_10'}, pl = 'nauvis',fe = 4, cu = 3, c = 4, s = 2, u = 0, o = 0, biters = 1, moisture = -0.3, fa = 0},
|
||||
[11] = {id = 11, min = 6, weight = 1, name = {'chronosphere.map_1_11'}, pl = 'nauvis',fe = 3, cu = 3, c = 2, s = 3, u = 0, o = 0, biters = 6, moisture = -0.5, fa = 4},
|
||||
--[12] = {id = 12, min = 1, weight = 100, name = {'chronosphere.map_1_11'}, pl = 'vulcanus',fe = 3, cu = 3, c = 2, s = 3, u = 0, o = 0, biters = 0, moisture = -0.5, fa = 4}
|
||||
},
|
||||
modifiers = {},
|
||||
default_tile = 'grass-1'
|
||||
@ -173,10 +173,11 @@ end
|
||||
function Public.determine_world(optional_choice)
|
||||
local objective = Chrono_table.get_table()
|
||||
local difficulty = Difficulty.get().difficulty_vote_value
|
||||
local SA = script.active_mods['space-travel']
|
||||
local chosen_id
|
||||
local chosen_variant_id
|
||||
local ores = Rand.raffle(ore_richness_variants, Balance.ore_richness_weights(difficulty))
|
||||
local dayspeed = Rand.raffle(time_speed_variants, time_speed_weights)
|
||||
local ores = table.get_random_weighted_t(ore_richness_variants, Balance.ore_richness_weights(difficulty))
|
||||
local dayspeed = table.get_random_weighted_t(time_speed_variants, time_speed_weights)
|
||||
local daytime = random(0, 100) / 100
|
||||
local special = special_world()
|
||||
if special.yes then
|
||||
@ -195,6 +196,7 @@ function Public.determine_world(optional_choice)
|
||||
id = chosen_id,
|
||||
variant = Worlds[chosen_id].variants[chosen_variant_id],
|
||||
default_tile = Worlds[chosen_id].default_tile or 'grass-1',
|
||||
planet_name = SA and Worlds[chosen_id].variants[chosen_variant_id].pl or 'nauvis',
|
||||
ores = ores,
|
||||
dayspeed = dayspeed,
|
||||
daytime = daytime
|
||||
@ -217,7 +219,7 @@ function Public.determine_world(optional_choice)
|
||||
if Worlds[tonumber(optional_choice)] then
|
||||
chosen_id = tonumber(optional_choice)
|
||||
else
|
||||
chosen_id = Rand.raffle(choices.types, choices.weights)
|
||||
chosen_id = table.get_random_weighted_t(choices.types, choices.weights)
|
||||
end
|
||||
local variant_choices = {types = {}, weights = {}}
|
||||
for _, variant in pairs(Worlds[chosen_id].variants) do
|
||||
@ -230,7 +232,7 @@ function Public.determine_world(optional_choice)
|
||||
optional_choice = nil
|
||||
goto retry
|
||||
end
|
||||
chosen_variant_id = Rand.raffle(variant_choices.types, variant_choices.weights)
|
||||
chosen_variant_id = table.get_random_weighted_t(variant_choices.types, variant_choices.weights)
|
||||
local modifiers = get_modifiers(chosen_id)
|
||||
if modifiers.ores then
|
||||
ores = modifiers.ores
|
||||
@ -251,6 +253,7 @@ function Public.determine_world(optional_choice)
|
||||
id = chosen_id,
|
||||
variant = Worlds[chosen_id].variants[chosen_variant_id],
|
||||
default_tile = Worlds[chosen_id].default_tile,
|
||||
planet_name = SA and Worlds[chosen_id].variants[chosen_variant_id].pl or 'nauvis',
|
||||
ores = ores,
|
||||
dayspeed = dayspeed,
|
||||
daytime = daytime
|
||||
|
@ -55,7 +55,7 @@ local function process_tile(p, seed, entities, treasure, factories)
|
||||
if roll == 1 then
|
||||
entities[#entities + 1] = {name = Raffle.spawners[random(1, #Raffle.spawners)], position = p, spawn_decorations = true}
|
||||
elseif roll == 2 then
|
||||
local evo = game.forces['enemy'].evolution_factor
|
||||
local evo = game.forces.enemy.get_evolution_factor(game.get_surface(objective.active_surface_index))
|
||||
entities[#entities + 1] = {name = Raffle.worms[random(1 + floor(evo * 8), floor(1 + evo * 16))], position = p, spawn_decorations = true}
|
||||
elseif roll == 3 then
|
||||
if random(1, 50) == 1 then
|
||||
|
@ -1,4 +1,6 @@
|
||||
local Public = {}
|
||||
--[[top of locomotive]]
|
||||
Public[1] = '0eNrlnEGPozYUgP/K1teSFTaQQA6Vunvae2/VCBniSawFGxlIG43y32uTySQzIc17457qy2gC+PH84Uf8OQkvpGpG0RmpBrJ+IbLWqifrP19IL7eKN27bcOgEWRM5iJZERPHWveJ1PbZjwwdtyDEiUm3E32RNj08REWqQgxSnMNOLQ6nGthLGHnAJYOSwa8Ug60Wt20qqKVREOt3b1lq5M9uIi2T5NYvIwf7HstieySY4GN2UldjxvbRN7HGXWKXdvZna927HszT9UN50ZS/NMNotb8mcjlj87rrSCxfDBeoH7qjEEdGdMPyUFfnVNtPj0I24wMdT7krUb9lR92drhFDXqOTGYrKcamnqUQ7Ta3Z8ss3Z3eMT9v54ex3cCW/wMzz+1f8A/zcsfobDnwLxJ3j8aYijP0GO/hSGP8Xjz0LEnyLxUxj+DI+fhYg/Q+JfwvAv8fiTEPEvkfgTGP4VHn8cIv4VEn8Ow5/j8dMQ8edI/BkMf4HGz/IQ8RfIiWcMw09jPP8iQP4sRg7/FZC/l/emeTD8kd4LnHlSL+8NCD/Se4HaS728NyD8WO8F4vfy3oDwI70XuOpAvbw3IPxI7wXOPKmX9waEH+m9wFUH6uW9AeFHei904unlvQHhR3ovcNWBenlvQPiR3lsAP+7y0t5w8CdI7aXAZQfmp73LYPhjtRfovczPe8Phj/ReCv243U98w+GPFF8KNF/mZ77h8EeaLwWqL/NT33D4I9WXAt2X+blvOPyR7kuB8sv85Dcc/kj5pUD7ZX72Gw5/pP1SoP4yP/0Nhz9SfynQfxM//w2Gf4r0Xwb038TPf9Ng+CPxA/U38dPfYPAjVx8Y9NvOfvYbDH7k5JMB5Tfxk99g8CPXHhjQfRM/9w0GP3LqyYDqm/ipbzD4kSsPDGi+iZ/5hvPWi515As038TPfYPgjFx4YUHwTP/ENZ+JPHwEHmm7qZ7rBAEcuNCRA0U0votuPle3e1KU5uz0TZz7rI/QqhfnfX37Yn93L+2KIG1HLjTBwPWR3xsxroP9uwGB+5upSajtupvzX5LdPDKnvpyjdwfZgVEP5bHRbSmVjkPUzb3qBrfDo374z/PBLlvm9S3exy1433Cw6rkTzYFpn3+JmY6XQWPHjWBmsFNwa6idKYbpj2gZKyO2u0qNxP7NPl1FaPM0lswQlE1+n8j5yFqWrKItng69Awd939GPeGZ0NfZm+dEZvDW9bXjVi0XeC/xSPKtNepDu1eR55b7X5idJ8rY+rm/iHkjteRrjbbN8+hJmu6ilAuefNKErZl50c6t1rUblHKPSDGVtL4uxFSg/iNEnHldxMidn273PpGn6oeP2z3OtmdN2Lv9qx8rZ12+iKN43laXOyydn/9V9lp5tDt9PqcL4TuB3C3PRzZ4+ddpybT1u0KlvenTe5J028Qp+yhD1n4nS6VvQ937rdfxgu1Zcf/ZfvO262Um1/IbNFWSCLkqUzlZDFUcbmhmsWo8psJrgrYFsLUZbMxqe4Sps5wWrKPp2NzpBw4uVN+OJe5gmKzG3kiblNPMqy2fgpjszMCe5Cv9zIK7ldiMYWn7GTSlsE4m4PaHFzk3PRn6LTsF5fPW0lIntbL1MEltN0VbBVnufLgrLj8R+lbsBH'
|
||||
|
||||
--[[red research]]
|
||||
Public[4] = '0eNqdnNtu4zgMht/F187ApKxTXmVRLJLU2xpInMBxFlsM8u5rN2nSTs2UPy8Gg85Qn0mKlEhJ6O9ivT01h77thmL5uzh2q8Ni2C9e+vZ5+vm/Yum4LN6mv85lsVof99vT0CwmuUPbvRTLoT81ZdFu9t2xWP41EtqXbrWdxg5vh6ZYFu3Q7Iqy6Fa76aehX3XHw74fFutmOxQjs+2em/EzdH4qi6Yb2qFtLqT3H97+7k67ddOPAhKjLA774zhs3101Tr/8u8r8y4/857ZvNpf/HU34hmU1NiJYp8ZShXBrNTcjWK9XlxFu0HMJ4UY9t0a4Sc91CDfruQHhUqUHewisTzeC8o30CUdQxpE+5VhMuXoOrM85gpKO7lnXdsemH8Z/FBezWkUM8Go2hvF5jhRhUi2Q7jm1Oh6b3Xo77huL3Wrz2nbNgh4siBIwK9x2W6ZUfuMKz3tBOyY8DGtNGDLjYKcC3xPnuFttt4tmO4r37WZx2G8bOSLDO7xr2pfX9f7UT5s2x9LXT3PfqOFw8oJ/PUwKAilYAzMKwIg58hajc550pfeznjRsUZIrM44SfOkqPDiDJjidIZ28CszA4htVJZ+DI1MIJIdnSxJIHlkrdWYGPGokOyOOkgy9p8V2tX5QS2RhfMbjLGnirDZkRlSB6bHF7B5bXCMJMC19iuYEzwBJOTwD3lWcQ3nrMi8SA5JUStcZUkHUz7BFSPOgqrUyZKo3ZMR38lxKeMNmkVVgxnZ2pi/0Lzu7z3PbuncKR9+w390R5pi1rbAjBuoR741Fz9xXRo2nEjKXabaK9Iat5/0zcyxLwpHA0m4+ojIZdGJ+5EQWpipUUDKT6oDHkHLfyXM5FxjKCNJkRHDKPVOaqKDflz7OcUhoFIOmNIufIT+bh3Y0+ScdI34uSKqOOyRNLBJmfsZPBXXkaDgfkHwaycASTmki4+EoNIPR4SihGYyG4i2opsHDdwBKcICP1ZXgiN8DKMkJP1pXkrMh6VXkVBkSVAiyRAaWEPuJDRYLPW1yBpbQ1CawgLuvF2mmLPAlEY1/ZuvP5A3ulFwQDCzJBZ/O1Ib9uIv9c+q71WbO+Opy8k6zmGSYFaEnSob8YKFVy5aMEPTKhowQ9WK12+MDt2cHnDEwa9aQXCNIVVWY8SNlFurDjF/AsNBUZDjy3SwGKrSUc5AhpmoSqKoMaSX4jioywFiCsSGxRM2cASZqpkmG+8Wv8krZQ1DSQQO6oLh5i6NGuQRanCCo0uJsuDaWJhq5588/heCnu33oXIjd96piLFGEioKAm/7bF3S33ISfM7N0mUx4s8LSnTl5/HWO0uJgeE+kREfDGx0l2lB1adHZWBrPBfGUEVMg8+ypI1leByjNYEvNpkSz4WmQEu0Mz5mUaLTlSQ/ndX5lAt4QUAT1D4Z3U0p0NOwB0rKHPCPIP617wEOCm81CW0/AS4Iby0sswtd2US/DQ1FRL8P+lSRWjftLZOHnaxwllqETElkR1stVEivhNmaJlfHndpJewDuB+EWvp7IY2u31zfSfFlzew5z/qL0Pq+G1mJSYFQ+YeMTEEyaeMXGqMHlG5UkrnzHXZ8z1GXN9xlyfMddn0PVX+RqTZ5CPThUzKO9AebW91/McB8qjfL1D70er4ABGB6A2A04l0KkEOpWwDL7KR1Ben2UfAwgcwOgXgLBg0EcM+ohRHzHqI0bjlNE4dagNDrXhOoDRAQ4dABvt0QEZHMCoWxk1GpjpGp2HGp2HGp2HGp2HGp2HGp0HD64BHqt1ppM1iB9M/AzKA+kc0DAKaGQHNLIj6KMI+iiiPoqojyKaahFNtYjOQkRnAWy4COy4rvKAjxLqI7Tp+hjA6AC9DRk1Gu12CG1fCO1fCG1guMIi6SqfQXlCFdI7lQm0gEAL0Or8Y4BDB+hNZtAEtHhmtI5ktI5ktELixxXSU3n5bQTLT7/0oCz+bfrj5dQ9UR0zR+cSpZTO5/8BKB79Hw=='
|
||||
|
@ -66,7 +66,7 @@ local function process_tile(p, seed, tiles, entities, treasure, decoratives)
|
||||
|
||||
if noise3 > -0.25 and noise3 < 0.25 then
|
||||
tiles[#tiles + 1] = {name = 'dirt-6', position = p}
|
||||
local evo = game.forces['enemy'].evolution_factor
|
||||
local evo = game.forces.enemy.get_evolution_factor(game.get_surface(objective.active_surface_index))
|
||||
local roll = random(1, 1000)
|
||||
if roll > 830 + tunnels then
|
||||
entities[#entities + 1] = {name = Raffle.rocks[random(1, #Raffle.rocks)], position = p}
|
||||
|
@ -3,6 +3,7 @@ local Chrono_table = require 'maps.chronosphere.table'
|
||||
local Factories = require 'maps.chronosphere.production'
|
||||
local Upgrades = require 'maps.chronosphere.upgrade_list'
|
||||
local List = require 'maps.chronosphere.production_list'
|
||||
local Functions = require 'maps.chronosphere.world_functions'
|
||||
local math_floor = math.floor
|
||||
local math_random = math.random
|
||||
|
||||
@ -14,6 +15,13 @@ local function protect(entity, operable)
|
||||
entity.operable = operable
|
||||
end
|
||||
|
||||
local function connect_entities(entity1, entity2, wire_type)
|
||||
local wireconnector1 = entity1.get_wire_connector(wire_type, true)
|
||||
local wireconnector2 = entity2.get_wire_connector(wire_type, true)
|
||||
wireconnector1.connect_to(wireconnector2)
|
||||
end
|
||||
|
||||
|
||||
function Public.create_wagon_room()
|
||||
local objective = Chrono_table.get_table()
|
||||
local width = 64
|
||||
@ -132,61 +140,79 @@ function Public.create_wagon_room()
|
||||
end
|
||||
surface.set_tiles(water_tiles)
|
||||
|
||||
local combinators = {}
|
||||
for x = width * -0.5 - 6, width * -0.5 + 3, 1 do
|
||||
for y = -250, -244, 2 do
|
||||
combinators[#combinators + 1] = {name = 'arithmetic-combinator', position = {x, y}, force = 'player', create_build_effect_smoke = false}
|
||||
end
|
||||
end
|
||||
local combimade = {}
|
||||
for i = 1, #combinators, 1 do
|
||||
combimade[i] = surface.create_entity(combinators[i])
|
||||
protect(combimade[i], false)
|
||||
Functions.build_blueprint(surface, {-38, -251}, 1, "player")
|
||||
-- local combinators = {}
|
||||
-- for x = width * -0.5 - 6, width * -0.5 + 3, 1 do
|
||||
-- for y = -250, -244, 2 do
|
||||
-- combinators[#combinators + 1] = {name = 'arithmetic-combinator', position = {x, y}, force = 'player', create_build_effect_smoke = false}
|
||||
-- end
|
||||
-- end
|
||||
-- local combimade = {}
|
||||
-- for i = 1, #combinators, 1 do
|
||||
-- combimade[i] = surface.create_entity(combinators[i])
|
||||
-- protect(combimade[i], false)
|
||||
|
||||
if i > 1 then
|
||||
combimade[i].connect_neighbour({wire = defines.wire_type.green, target_entity = combimade[i - 1], source_circuit_id = 2, target_circuit_id = 1})
|
||||
local rule = combimade[i].get_or_create_control_behavior()
|
||||
rule.parameters = {first_signal = {type = 'virtual', name = 'signal-A'}, second_constant = 0, operation = '+', output_signal = {type = 'virtual', name = 'signal-A'}}
|
||||
else
|
||||
local rule2 = combimade[i].get_or_create_control_behavior()
|
||||
rule2.parameters = {first_signal = {type = 'virtual', name = 'signal-A'}, second_constant = 0, operation = '+', output_signal = {type = 'virtual', name = 'signal-B'}}
|
||||
end
|
||||
end
|
||||
local checker = surface.create_entity({name = 'decider-combinator', position = {x = width * -0.5 - 6, y = -242}, force = 'player', create_build_effect_smoke = false})
|
||||
local rules3 = checker.get_or_create_control_behavior()
|
||||
rules3.parameters = {
|
||||
first_signal = {type = 'virtual', name = 'signal-A'},
|
||||
second_signal = {type = 'virtual', name = 'signal-B'},
|
||||
comparator = '>',
|
||||
output_signal = {type = 'virtual', name = 'signal-C'},
|
||||
copy_count_from_input = false
|
||||
}
|
||||
local combipower = surface.create_entity({name = 'substation', position = {x = width * -0.5 - 4, y = -242}, force = 'player', create_build_effect_smoke = false})
|
||||
combipower.connect_neighbour({wire = defines.wire_type.green, target_entity = checker, target_circuit_id = 1})
|
||||
combipower.connect_neighbour({wire = defines.wire_type.green, target_entity = combimade[#combimade], target_circuit_id = 1})
|
||||
combimade[1].connect_neighbour({wire = defines.wire_type.green, target_entity = checker, source_circuit_id = 2, target_circuit_id = 1})
|
||||
local speaker =
|
||||
surface.create_entity(
|
||||
{
|
||||
name = 'programmable-speaker',
|
||||
position = {x = width * -0.5 - 6, y = -241},
|
||||
force = 'player',
|
||||
create_build_effect_smoke = false,
|
||||
parameters = {playback_volume = 0.6, playback_globally = true, allow_polyphony = false},
|
||||
alert_parameters = {show_alert = true, show_on_map = true, icon_signal_id = {type = 'item', name = 'accumulator'}, alert_message = 'Train Is Charging!'}
|
||||
}
|
||||
)
|
||||
speaker.connect_neighbour({wire = defines.wire_type.green, target_entity = checker, target_circuit_id = 2})
|
||||
local rules4 = speaker.get_or_create_control_behavior()
|
||||
rules4.circuit_condition = {condition = {first_signal = {type = 'virtual', name = 'signal-C'}, second_constant = 0, comparator = '>'}}
|
||||
rules4.circuit_parameters = {signal_value_is_pitch = false, instrument_id = 8, note_id = 5}
|
||||
local solar1 = surface.create_entity({name = 'solar-panel', position = {x = width * -0.5 - 2, y = -242}, force = 'player', create_build_effect_smoke = false})
|
||||
local solar2 = surface.create_entity({name = 'solar-panel', position = {x = width * -0.5 + 1, y = -242}, force = 'player', create_build_effect_smoke = false})
|
||||
protect(solar1, true)
|
||||
protect(solar2, true)
|
||||
protect(combipower, false)
|
||||
protect(speaker, false)
|
||||
protect(checker, false)
|
||||
-- if i > 1 then
|
||||
-- combimade[i].connect_neighbour({wire = defines.wire_type.green, target_entity = combimade[i - 1], source_circuit_id = 2, target_circuit_id = 1})
|
||||
-- local rule = combimade[i].get_or_create_control_behavior()
|
||||
-- rule.parameters = {first_signal = {type = 'virtual', name = 'signal-A'}, second_constant = 0, operation = '+', output_signal = {type = 'virtual', name = 'signal-A'}}
|
||||
-- else
|
||||
-- local rule2 = combimade[i].get_or_create_control_behavior()
|
||||
-- rule2.parameters = {first_signal = {type = 'virtual', name = 'signal-A'}, second_constant = 0, operation = '+', output_signal = {type = 'virtual', name = 'signal-B'}}
|
||||
-- end
|
||||
-- end
|
||||
-- local checker = surface.create_entity({name = 'decider-combinator', position = {x = width * -0.5 - 6, y = -242}, force = 'player', create_build_effect_smoke = false})
|
||||
-- if not checker or not checker.valid then return end
|
||||
-- local rules3 = checker.get_control_behavior()
|
||||
-- local dec_condition = {
|
||||
-- first_signal = {type = 'virtual', name = 'signal-A'},
|
||||
-- second_signal = {type = 'virtual', name = 'signal-B'},
|
||||
-- comparator = '>',
|
||||
|
||||
-- }
|
||||
-- local dec_output = {
|
||||
-- output_signal = {type = 'virtual', name = 'signal-C'},
|
||||
-- copy_count_from_input = false
|
||||
-- }
|
||||
|
||||
-- rules3.set_condition(1, dec_condition)
|
||||
-- rules3.set_output(1, dec_output)
|
||||
-- rules3.parameters = {
|
||||
-- first_signal = {type = 'virtual', name = 'signal-A'},
|
||||
-- second_signal = {type = 'virtual', name = 'signal-B'},
|
||||
-- comparator = '>',
|
||||
-- output_signal = {type = 'virtual', name = 'signal-C'},
|
||||
-- copy_count_from_input = false
|
||||
-- }
|
||||
-- local combipower = surface.create_entity({name = 'substation', position = {x = width * -0.5 - 4, y = -242}, force = 'player', create_build_effect_smoke = false})
|
||||
-- connect_entities(combipower, checker, defines.wire_connector_id.circuit_green)
|
||||
|
||||
-- combipower.connect_neighbour({wire = defines.wire_type.green, target_entity = checker, target_circuit_id = 1})
|
||||
-- combipower.get_wire_connector(defines.wire_connector_id.circuit_green, true).connect_to(checker.get_wire_connector(defines.wire_connector_id.circuit_green, true), false)
|
||||
-- combipower.connect_neighbour({wire = defines.wire_type.green, target_entity = combimade[#combimade], target_circuit_id = 1})
|
||||
-- combimade[1].connect_neighbour({wire = defines.wire_type.green, target_entity = checker, source_circuit_id = 2, target_circuit_id = 1})
|
||||
-- local speaker =
|
||||
-- surface.create_entity(
|
||||
-- {
|
||||
-- name = 'programmable-speaker',
|
||||
-- position = {x = width * -0.5 - 6, y = -241},
|
||||
-- force = 'player',
|
||||
-- create_build_effect_smoke = false,
|
||||
-- parameters = {playback_volume = 0.6, playback_globally = true, allow_polyphony = false},
|
||||
-- alert_parameters = {show_alert = true, show_on_map = true, icon_signal_id = {type = 'item', name = 'accumulator'}, alert_message = 'Train Is Charging!'}
|
||||
-- }
|
||||
-- )
|
||||
-- speaker.connect_neighbour({wire = defines.wire_type.green, target_entity = checker, target_circuit_id = 2})
|
||||
-- local rules4 = speaker.get_or_create_control_behavior()
|
||||
-- rules4.circuit_condition = {condition = {first_signal = {type = 'virtual', name = 'signal-C'}, second_constant = 0, comparator = '>'}}
|
||||
-- rules4.circuit_parameters = {signal_value_is_pitch = false, instrument_id = 8, note_id = 5}
|
||||
-- local solar1 = surface.create_entity({name = 'solar-panel', position = {x = width * -0.5 - 2, y = -242}, force = 'player', create_build_effect_smoke = false})
|
||||
-- local solar2 = surface.create_entity({name = 'solar-panel', position = {x = width * -0.5 + 1, y = -242}, force = 'player', create_build_effect_smoke = false})
|
||||
-- protect(solar1, true)
|
||||
-- protect(solar2, true)
|
||||
-- protect(combipower, false)
|
||||
-- protect(speaker, false)
|
||||
-- protect(checker, false)
|
||||
|
||||
for k, x in pairs({-1, 0}) do
|
||||
for i = 1, 12, 1 do
|
||||
@ -196,24 +222,24 @@ function Public.create_wagon_room()
|
||||
protect(e, true)
|
||||
--e.link_id = 1000 + i + 12 * (k - 1)
|
||||
table.insert(objective.comfychests2, e)
|
||||
table.insert(objective.comfychest_invs2, e.get_inventory(defines.inventory.chest))
|
||||
table.insert(objective.comfychest_invs2, e and e.get_inventory(defines.inventory.chest))
|
||||
end
|
||||
end
|
||||
|
||||
for i = 1, 9, 1 do
|
||||
local y = -0.7 * height + 18 + 9 + 18 * (math_floor((i - 1) / 3))
|
||||
local x = -0.5 * width + 5 + 9 + 18 * (i % 3)
|
||||
local substation = surface.create_entity({name = 'substation', position = {x, y}, force = 'player', create_build_effect_smoke = false})
|
||||
if i == 3 then
|
||||
substation.disconnect_neighbour(combipower)
|
||||
substation.connect_neighbour({wire = defines.wire_type.green, target_entity = combipower})
|
||||
end
|
||||
protect(substation, true)
|
||||
-- local substation = surface.create_entity({name = 'substation', position = {x, y}, force = 'player', create_build_effect_smoke = false})
|
||||
-- if i == 3 then
|
||||
-- substation.disconnect_neighbour(combipower)
|
||||
-- substation.connect_neighbour({wire = defines.wire_type.green, target_entity = combipower})
|
||||
-- end
|
||||
-- protect(substation, true)
|
||||
for j = 1, 4, 1 do
|
||||
local xx = x - 2 * j
|
||||
local acumulator = surface.create_entity({name = 'accumulator', position = {xx, y}, force = 'player', create_build_effect_smoke = false})
|
||||
if i == 3 and j == 1 then
|
||||
acumulator.connect_neighbour({wire = defines.wire_type.green, target_entity = substation})
|
||||
--acumulator.connect_neighbour({wire = defines.wire_type.green, target_entity = substation})
|
||||
end
|
||||
protect(acumulator, true)
|
||||
table.insert(objective.accumulators, acumulator)
|
||||
@ -234,8 +260,11 @@ function Public.create_wagon_room()
|
||||
rendering.draw_text {
|
||||
text = {'chronosphere.train_laser_battery'},
|
||||
surface = surface,
|
||||
target = laser_battery,
|
||||
target_offset = {0, -2.5},
|
||||
target = {
|
||||
entity = laser_battery,
|
||||
offset = {0, -2.5},
|
||||
position = laser_battery and laser_battery.position
|
||||
},
|
||||
color = objective.locomotive.color,
|
||||
scale = 1.00,
|
||||
font = 'default-game',
|
||||
@ -251,7 +280,11 @@ function Public.create_wagon_room()
|
||||
rendering.draw_text {
|
||||
text = {'chronosphere.train_repair_chest'},
|
||||
surface = surface,
|
||||
target = repairchest,
|
||||
target = {
|
||||
entity = repairchest,
|
||||
offset = {0, -2.5},
|
||||
position = repairchest and repairchest.position
|
||||
},
|
||||
target_offset = {0, -2.5},
|
||||
color = objective.locomotive.color,
|
||||
scale = 1.00,
|
||||
@ -267,8 +300,11 @@ function Public.create_wagon_room()
|
||||
rendering.draw_sprite {
|
||||
sprite = upgrades[i].sprite,
|
||||
surface = surface,
|
||||
target = e,
|
||||
target_offset = {0, -1.3},
|
||||
target = {
|
||||
entity = e,
|
||||
offset = {0, -1.3},
|
||||
position = e and e.position
|
||||
},
|
||||
font = 'default-game',
|
||||
visible = true
|
||||
}
|
||||
@ -277,7 +313,11 @@ function Public.create_wagon_room()
|
||||
rendering.draw_text {
|
||||
text = {'chronosphere.train_market'},
|
||||
surface = surface,
|
||||
target = market,
|
||||
target = {
|
||||
entity = market,
|
||||
offset = {0, -3.5},
|
||||
position = market and market.position
|
||||
},
|
||||
target_offset = {0, -3.5},
|
||||
color = objective.locomotive.color,
|
||||
scale = 1.00,
|
||||
@ -288,8 +328,11 @@ function Public.create_wagon_room()
|
||||
rendering.draw_text {
|
||||
text = {'chronosphere.train_upgrades'},
|
||||
surface = surface,
|
||||
target = objective.upgradechest[8],
|
||||
target_offset = {0, -3.5},
|
||||
target = {
|
||||
entity = objective.upgradechest[8],
|
||||
offset = {0, -3.5},
|
||||
position = objective.upgradechest[8].position
|
||||
},
|
||||
color = objective.locomotive.color,
|
||||
scale = 1.00,
|
||||
font = 'default-game',
|
||||
@ -299,8 +342,11 @@ function Public.create_wagon_room()
|
||||
rendering.draw_text {
|
||||
text = {'chronosphere.train_upgrades_sub'},
|
||||
surface = surface,
|
||||
target = objective.upgradechest[8],
|
||||
target_offset = {0, -2.5},
|
||||
target = {
|
||||
entity = objective.upgradechest[8],
|
||||
offset = {0, -2.5},
|
||||
position = objective.upgradechest[8].position
|
||||
},
|
||||
color = objective.locomotive.color,
|
||||
scale = 0.80,
|
||||
font = 'default-game',
|
||||
@ -309,6 +355,7 @@ function Public.create_wagon_room()
|
||||
}
|
||||
|
||||
for _, offer in pairs(Balance.market_offers()) do
|
||||
if not market or not market.valid then break end
|
||||
market.add_market_item(offer)
|
||||
end
|
||||
|
||||
@ -324,6 +371,7 @@ function Public.create_wagon_room()
|
||||
objective.car_exits = {}
|
||||
for i = 1, 6, 1 do
|
||||
local e = surface.create_entity({name = 'car', position = car_pos[i], force = 'player', create_build_effect_smoke = false})
|
||||
if not e or not e.valid then break end
|
||||
e.get_inventory(defines.inventory.fuel).insert({name = 'wood', count = 16})
|
||||
protect(e, false)
|
||||
objective.car_exits[i] = e
|
||||
@ -352,7 +400,9 @@ function Public.create_wagon_room()
|
||||
break
|
||||
end
|
||||
local e = surface.create_entity({name = 'wooden-chest', position = positions[i], force = 'player', create_build_effect_smoke = false})
|
||||
if not e or not e.valid then break end
|
||||
local inventory = e.get_inventory(defines.inventory.chest)
|
||||
if not inventory or not inventory.valid then break end
|
||||
inventory.insert({name = 'raw-fish', count = math_random(2, 5)})
|
||||
i = i + 1
|
||||
end
|
||||
@ -371,7 +421,9 @@ function Public.create_wagon_room()
|
||||
break
|
||||
end
|
||||
local e = surface.create_entity({name = 'wooden-chest', position = positions[i], force = 'player', create_build_effect_smoke = false})
|
||||
if not e or not e.valid then break end
|
||||
local inventory = e.get_inventory(defines.inventory.chest)
|
||||
if not inventory or not inventory.valid then break end
|
||||
inventory.insert(cargo_boxes[loot_i])
|
||||
i = i + 1
|
||||
end
|
||||
@ -389,6 +441,7 @@ function Public.create_wagon_room()
|
||||
e.rotatable = false
|
||||
Factories.register_train_assembler(e, key)
|
||||
if List[key].kind == 'assembler' or List[key].kind == 'fluid-assembler' then
|
||||
if not e or not e.valid then break end
|
||||
e.set_recipe(List[key].recipe_override or List[key].name)
|
||||
e.recipe_locked = true
|
||||
e.direction = defines.direction.south
|
||||
|
@ -42,7 +42,7 @@ local function path_tile(p, tiles, entities, treasure, things)
|
||||
end
|
||||
else
|
||||
if random(1, 150) == 1 and Functions.distance(p.x, p.y) > 200 then
|
||||
local evo = game.forces['enemy'].evolution_factor
|
||||
local evo = game.forces['enemy'].get_evolution_factor(game.get_surface(objective.active_surface_index))
|
||||
entities[#entities + 1] = {name = Raffle.worms[random(1 + floor(evo * 8), floor(1 + evo * 16))], position = p, spawn_decorations = true}
|
||||
end
|
||||
end
|
||||
|
@ -9,7 +9,7 @@ local Chrono_table = require 'maps.chronosphere.table'
|
||||
local function process_tile(p, seed, tiles, entities, treasure)
|
||||
local objective = Chrono_table.get_table()
|
||||
local noise1 = Functions.get_noise('scrapyard', p, seed)
|
||||
local evo = game.forces['enemy'].evolution_factor
|
||||
local evo = game.forces.enemy.get_evolution_factor(game.get_surface(objective.active_surface_index))
|
||||
local handicap = max(0, 120 - objective.chronojumps * 20)
|
||||
|
||||
if noise1 < -0.70 or noise1 > 0.70 then
|
||||
|
@ -14,7 +14,6 @@ local Global = require 'utils.global'
|
||||
local Map_info = require 'modules.map_info'
|
||||
local Gui = require 'utils.gui'
|
||||
local format_number = require 'util'.format_number
|
||||
local Random = require 'maps.chronosphere.random'
|
||||
local Autostash = require 'modules.autostash'
|
||||
|
||||
local expanse = {
|
||||
@ -125,7 +124,7 @@ local function reset()
|
||||
Functions.expand(expanse, { x = 0, y = 0 })
|
||||
|
||||
for _, player in pairs(game.players) do
|
||||
player.teleport(surface.find_non_colliding_position('character', { expanse.square_size * 0.5, expanse.square_size * 0.5 }, 8, 0.5), surface)
|
||||
player.teleport(surface.find_non_colliding_position('character', { expanse.square_size * 0.5, expanse.square_size * 0.5 }, 8, 0.5) or {5, 5}, surface)
|
||||
end
|
||||
end
|
||||
|
||||
@ -241,7 +240,7 @@ local function container_opened(event)
|
||||
game.print({ 'expanse.tile_unlock', colored_player_name, { 'expanse.gps', math.floor(expansion_position.x), math.floor(expansion_position.y), 'expanse' } })
|
||||
expanse.size = (expanse.size or 1) + 1
|
||||
if math.random(1, 4) == 1 then
|
||||
if surface.count_tiles_filtered({ position = expansion_position, radius = 6, collision_mask = 'water_tile' }) > 40 then
|
||||
if surface and surface.count_tiles_filtered({ position = expansion_position, radius = 6, collision_mask = 'water_tile' }) > 40 then
|
||||
return
|
||||
end
|
||||
local render = rendering.draw_sprite {
|
||||
@ -424,7 +423,7 @@ local function create_main_frame(player)
|
||||
frame.add({ type = 'label', name = 'biters', caption = { 'expanse.stats_attack', #expanse.invasion_candidates, invasion_numbers.candidates, invasion_numbers.groups } })
|
||||
local scroll = frame.add({ type = 'scroll-pane', name = 'scroll_pane', horizontal_scroll_policy = 'never', vertical_scroll_policy = 'auto-and-reserve-space' })
|
||||
local frame_table = scroll.add({ type = 'table', name = 'resource_stats', column_count = 8 })
|
||||
for name, count in Random.spairs(expanse.cost_stats, function (t, a, b) return t[a] > t[b] end) do
|
||||
for name, count in table.spairs(expanse.cost_stats, function (t, a, b) return t[a] > t[b] end) do
|
||||
resource_stats(frame_table, name, count)
|
||||
end
|
||||
end
|
||||
|
@ -1,5 +1,6 @@
|
||||
--luacheck: ignore
|
||||
local event = require 'utils.event'
|
||||
local Event = require 'utils.event'
|
||||
local AI = require 'utils.functions.AI'
|
||||
local math_random = math.random
|
||||
local math_floor = math.floor
|
||||
storage.biter_command = {}
|
||||
@ -31,29 +32,9 @@ local worm_raffle = {
|
||||
'behemoth-worm-turret'
|
||||
}
|
||||
|
||||
local function shuffle(tbl)
|
||||
local size = #tbl
|
||||
for i = size, 1, -1 do
|
||||
local rand = math_random(size)
|
||||
tbl[i], tbl[rand] = tbl[rand], tbl[i]
|
||||
end
|
||||
return tbl
|
||||
end
|
||||
|
||||
local function is_closer(pos1, pos2, pos)
|
||||
return ((pos1.x - pos.x) ^ 2 + (pos1.y - pos.y) ^ 2) < ((pos2.x - pos.x) ^ 2 + (pos2.y - pos.y) ^ 2)
|
||||
end
|
||||
|
||||
local function shuffle_distance(tbl, position)
|
||||
local size = #tbl
|
||||
for i = size, 1, -1 do
|
||||
local rand = math_random(size)
|
||||
if is_closer(tbl[i].position, tbl[rand].position, position) and i > rand then
|
||||
tbl[i], tbl[rand] = tbl[rand], tbl[i]
|
||||
end
|
||||
end
|
||||
return tbl
|
||||
end
|
||||
|
||||
|
||||
local function get_evo(force)
|
||||
local evo = math_floor(game.forces['enemy'].evolution_factor * 20)
|
||||
@ -71,7 +52,7 @@ local function place_nest_near_unit_group(group)
|
||||
return false
|
||||
end
|
||||
local units = group.members
|
||||
shuffle(units)
|
||||
table.shuffle_table(units)
|
||||
for i = 1, 5, 1 do
|
||||
if not units[i].valid then
|
||||
return false
|
||||
@ -105,7 +86,7 @@ local function build_worm(group)
|
||||
return false
|
||||
end
|
||||
local units = group.members
|
||||
shuffle(units)
|
||||
table.shuffle_table(units)
|
||||
for i = 1, 5, 1 do
|
||||
if not units[i].valid then
|
||||
return false
|
||||
@ -142,15 +123,6 @@ end
|
||||
|
||||
-----------commands-----------
|
||||
|
||||
local function move_to(position, distraction)
|
||||
local command = {
|
||||
type = defines.command.go_to_location,
|
||||
destination = position,
|
||||
distraction = distraction,
|
||||
pathfind_flags = { allow_destroy_friendly_entities = true }
|
||||
}
|
||||
return command
|
||||
end
|
||||
|
||||
-- local function attackmaincommand(target)
|
||||
-- local wave_defense_table = WD.get_table()
|
||||
@ -164,34 +136,7 @@ end
|
||||
-- return command
|
||||
-- end
|
||||
|
||||
local function attackareacommand(position)
|
||||
local command = {
|
||||
type = defines.command.attack_area,
|
||||
destination = position,
|
||||
radius = 25,
|
||||
distraction = defines.distraction.by_enemy
|
||||
}
|
||||
return command
|
||||
end
|
||||
|
||||
local function attackobstaclescommand(surface, position)
|
||||
local commands = {}
|
||||
local obstacles = surface.find_entities_filtered { position = position, radius = 20, type = { 'simple-entity', 'tree' }, limit = 100 }
|
||||
if obstacles then
|
||||
shuffle(obstacles)
|
||||
shuffle_distance(obstacles, position)
|
||||
for i = 1, #obstacles, 1 do
|
||||
if obstacles[i].valid then
|
||||
commands[#commands + 1] = {
|
||||
type = defines.command.attack,
|
||||
target = obstacles[i],
|
||||
distraction = defines.distraction.by_enemy
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
return commands
|
||||
end
|
||||
|
||||
local function get_coords(group, source_player)
|
||||
local position
|
||||
@ -231,14 +176,14 @@ local function disband(group, source_player)
|
||||
end
|
||||
|
||||
local function movetome(group, source_player)
|
||||
group.set_command(move_to(source_player.position, defines.distraction.none))
|
||||
group.set_command(AI.command_move_to(source_player.position, defines.distraction.none))
|
||||
flying_text(nil, 1, group.position, source_player)
|
||||
end
|
||||
|
||||
local function movetoposition(group, source_player)
|
||||
local position = get_coords(group, source_player)
|
||||
if position then
|
||||
group.set_command(move_to(position, defines.distraction.none))
|
||||
group.set_command(AI.command_move_to(position, defines.distraction.none))
|
||||
flying_text(nil, 1, group.position, source_player)
|
||||
else
|
||||
flying_text(nil, 2, group.position, source_player)
|
||||
@ -246,14 +191,14 @@ local function movetoposition(group, source_player)
|
||||
end
|
||||
|
||||
local function patroltome(group, source_player)
|
||||
group.set_command(move_to(source_player.position, defines.distraction.by_enemy))
|
||||
group.set_command(AI.command_move_to(source_player.position, defines.distraction.by_enemy))
|
||||
flying_text(nil, 1, group.position, source_player)
|
||||
end
|
||||
|
||||
local function patroltoposition(group, source_player)
|
||||
local position = get_coords(group, source_player)
|
||||
if position then
|
||||
group.set_command(move_to(position, defines.distraction.by_enemy))
|
||||
group.set_command(AI.command_move_to(position, defines.distraction.by_enemy))
|
||||
flying_text(nil, 1, group.position, source_player)
|
||||
else
|
||||
flying_text(nil, 2, group.position, source_player)
|
||||
@ -288,11 +233,11 @@ end
|
||||
|
||||
local function attackenemiesaround(group, source_player)
|
||||
flying_text(nil, 3, group.position, source_player)
|
||||
group.set_command(attackareacommand(group.position))
|
||||
group.set_command(AI.command_attack_area(group.position, 25))
|
||||
end
|
||||
|
||||
local function attackobstaclesaround(group, source_player)
|
||||
local commands = attackobstaclescommand(group.surface, group.position)
|
||||
local commands = AI.command_attack_obstacles(group.surface, group.position)
|
||||
if #commands > 1 then
|
||||
group.set_command(
|
||||
{
|
||||
@ -309,12 +254,12 @@ local function attackobstaclesaround(group, source_player)
|
||||
end
|
||||
|
||||
local function attackenemiesaroundme(group, source_player)
|
||||
group.set_command(attackareacommand(source_player.position))
|
||||
group.set_command(AI.command_attack_area(source_player.position, 25))
|
||||
flying_text(nil, 3, group.position, source_player)
|
||||
end
|
||||
|
||||
local function attackobstaclesaroundme(group, source_player)
|
||||
local commands = attackobstaclescommand(source_player.surface, source_player.position)
|
||||
local commands = AI.command_attack_obstacles(source_player.surface, source_player.position)
|
||||
if #commands > 1 then
|
||||
group.set_command(
|
||||
{
|
||||
@ -708,7 +653,7 @@ local function on_unit_removed_from_group(event)
|
||||
end
|
||||
end
|
||||
|
||||
event.add(defines.events.on_unit_removed_from_group, on_unit_removed_from_group)
|
||||
event.add(defines.events.on_unit_group_created, on_unit_group_created)
|
||||
event.add(defines.events.on_player_joined_game, on_player_joined_game)
|
||||
event.add(defines.events.on_gui_click, on_gui_click)
|
||||
Event.add(defines.events.on_unit_removed_from_group, on_unit_removed_from_group)
|
||||
Event.add(defines.events.on_unit_group_created, on_unit_group_created)
|
||||
Event.add(defines.events.on_player_joined_game, on_player_joined_game)
|
||||
Event.add(defines.events.on_gui_click, on_gui_click)
|
||||
|
@ -103,13 +103,13 @@ local function on_entity_died(event)
|
||||
end
|
||||
end
|
||||
if entities_that_earn_coins[event.cause.name] then
|
||||
event.entity.surface.spill_item_stack(event.cause.position, { name = 'coin', count = coin_count }, true)
|
||||
event.entity.surface.spill_item_stack({position = event.cause.position, stack = { name = 'coin', count = coin_count }, enable_looted = true})
|
||||
reward_has_been_given = true
|
||||
end
|
||||
end
|
||||
|
||||
if reward_has_been_given == false then
|
||||
event.entity.surface.spill_item_stack(event.entity.position, { name = 'coin', count = coin_count }, true)
|
||||
event.entity.surface.spill_item_stack({position = event.entity.position, stack = { name = 'coin', count = coin_count }, enable_looted = true})
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -56,7 +56,7 @@ local function on_tick()
|
||||
local surface = game.surfaces[entry[3]]
|
||||
for _ = 1, 3, 1 do
|
||||
local vector = drop_vectors[math_random(1, size_of_drop_vectors)]
|
||||
surface.spill_item_stack({ entry[1][1] + vector[1], entry[1][2] + vector[2] }, { name = drop_raffle[math_random(1, size_of_drop_raffle)], count = 1 }, true)
|
||||
surface.spill_item_stack({position = { entry[1][1] + vector[1], entry[1][2] + vector[2] }, stack = { name = drop_raffle[math_random(1, size_of_drop_raffle)], count = 1 }, enable_looted = true})
|
||||
storage.biters_drop_ore[key][2] = storage.biters_drop_ore[key][2] - 1
|
||||
if storage.biters_drop_ore[key][2] <= 0 then
|
||||
table_remove(storage.biters_drop_ore, key)
|
||||
|
108
utils/functions/AI.lua
Normal file
108
utils/functions/AI.lua
Normal file
@ -0,0 +1,108 @@
|
||||
--library to make working with unit commands easier
|
||||
|
||||
local Public = {}
|
||||
|
||||
local Global = require 'utils.global'
|
||||
local Utils = require 'utils.utils'
|
||||
|
||||
---Command to move
|
||||
---@param position MapPosition
|
||||
---@param distraction defines.distraction|nil
|
||||
function Public.command_move_to(position, distraction)
|
||||
local command = {
|
||||
type = defines.command.go_to_location,
|
||||
destination = position,
|
||||
distraction = distraction or defines.distraction.by_enemy,
|
||||
no_break = true
|
||||
}
|
||||
return command
|
||||
end
|
||||
|
||||
---Command to attack entity
|
||||
---@param target LuaEntity
|
||||
---@param distraction defines.distraction|nil
|
||||
function Public.command_attack_target(target, distraction)
|
||||
local command = {
|
||||
type = defines.command.attack,
|
||||
target = target,
|
||||
distraction = distraction or defines.distraction.by_enemy
|
||||
}
|
||||
return command
|
||||
end
|
||||
|
||||
---Command to attack things in area
|
||||
---@param position MapPosition
|
||||
---@param radius integer
|
||||
---@param distraction defines.distraction|nil
|
||||
function Public.command_attack_area(position, radius, distraction)
|
||||
local command = {
|
||||
type = defines.command.attack_area,
|
||||
destination = position,
|
||||
radius = radius or 25,
|
||||
distraction = distraction or defines.distraction.by_enemy
|
||||
}
|
||||
return command
|
||||
end
|
||||
|
||||
---Command to attack natural obstacles
|
||||
---@param surface LuaSurface
|
||||
---@param position MapPosition
|
||||
---@param distraction defines.distraction|nil
|
||||
function Public.command_attack_obstacles(surface, position, distraction)
|
||||
local commands = {}
|
||||
local obstacles = surface.find_entities_filtered {position = position, radius = 25, type = {'simple-entity', 'tree', 'simple-entity-with-owner'}, limit = 100}
|
||||
if obstacles then
|
||||
--table.shuffle_table(obstacles)
|
||||
table.shuffle_by_distance(obstacles, position)
|
||||
for i = 1, #obstacles, 1 do
|
||||
if obstacles[i].valid then
|
||||
commands[#commands + 1] = {
|
||||
type = defines.command.attack,
|
||||
target = obstacles[i],
|
||||
distraction = distraction
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
commands[#commands + 1] = Public.command_move_to(position)
|
||||
local command = {
|
||||
type = defines.command.compound,
|
||||
structure_type = defines.compound_command.return_last,
|
||||
commands = commands
|
||||
}
|
||||
return command
|
||||
end
|
||||
|
||||
---Give list of commands to unit or group
|
||||
---@param unit LuaCommandable
|
||||
---@param commands Command
|
||||
function Public.multicommand(unit, commands)
|
||||
if #commands > 0 then
|
||||
local command = {
|
||||
type = defines.command.compound,
|
||||
structure_type = defines.compound_command.return_last,
|
||||
commands = commands
|
||||
}
|
||||
unit.set_command(command)
|
||||
end
|
||||
end
|
||||
|
||||
---Give list of commands to unit or group
|
||||
---@param surface LuaSurface
|
||||
---@param target LuaEntity
|
||||
---@param force LuaForce
|
||||
---@param size_multiplier number|nil #defaults to 1 if nil or less than 0
|
||||
function Public.multi_attack(surface, target, force, size_multiplier)
|
||||
surface.set_multi_command(
|
||||
{
|
||||
command = Public.command_attack_target(target),
|
||||
unit_count = 16 + math.random(1, math.floor(1 + force.get_evolution_factor(surface) * 100)) * ((size_multiplier or 1) > 0 and size_multiplier or 1),
|
||||
force = force,
|
||||
unit_search_distance = 512
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
---TODO: more advanced functions and direct LuaCommandable stuff
|
||||
|
||||
return Public
|
Loading…
Reference in New Issue
Block a user