https://forum.paradoxplaza.com/forum/index.php?threads/stellaris-dev-diary-135-script-changes-and-modding-in-2-2.1130525/ :Merhabalar!
Bugün 2.2 Le Guin yaması ile gelecek kodlama değişikliklerinden bahsedeceğiz. Çok fazla teknik detaya gireceğimiz için istiyorsanız bu günlüğü es geçebilirsiniz.
Değişen her şeyi gösteremem, bu nedenle sadece önemlilerinden bahsedeceğim.
Ufak tefek olanlar- Ardışık if/else_if/else sentaksları artık tetiklemelere ve etkilere de etki ediyor. Modunuzu tekrar gözden geçirin, eski sentakslar sorun çıkarmasa bile istenmeyen şeylere yol açabilir.
- Kaynaklarla ilgili değiştirilemeyen şekilde kodlanmış tetiklemeler ve etkiler neredeyse tamamen kaldırıldı, yerlerine her türlü kaynağı alabilenler getirildi. Örneğin “energy >= 200” yerine artık “resource_stockpile_compare = { resource = energy value >= 200 }” veya “add_resource = { my_mod_resource = 10 }” gibi şeyler kullanacaksınız.
- Çoğu yeni “ekonomi birimi” otomatik olarak yaratılan etkilerle geliyor. Eğer yeni bir Bölge eklerseniz, bir gezegende o türden bölgelerin sayısını arttıran bir etki olacak. Yeni bir iş yaratırsanız da aynı şekilde olacak. Gördüğünüz zaman daha iyi anlayacaksınız.
- Rastgele olan (random_*) etkilerin ağırlıkları olması. Baya eski bir koddu ve bazılarınız daha önceden bulmuş olabilir. Neredeyse tüm random_* etkileri bazı seçeneklerin daha çok seçilmesi konusunda ayarlanabilir. Ağırlık için bir taban ve ekleyen/çarpan etkiler gerekir.
Kod:
random_playable_country = {
limit = { # has comms with 16 or more empires
count_country = {
limit = {
is_country_type = default
has_communications = prev
}
count >= 16
}
}
weights = {
base = 1
modifier = { # strongly weighted towards democracies
add = 6
has_authority = auth_democratic
}
modifier = { # twice as likely for players
mult = 2
is_ai = no
}
}
country_event = { id = my_mod.1 }
}
Gezegen & Ekonomi Değişiklikleri
Çoğu içerik tasarımcısının dediği gibi script (yazı betiği) öğrenmenin en iyi yolu script okumaktır. Bu yüzden örnekleri bol tutacağım.
Gezegen Özellikleri
common\deposits\
Eski maden yatağı kavramı 2.2'de değiştirilmesine rağmen kodlarda hala maden yatağı (deposit) olarak geçiyor. Eski maden yataklarından daha esnekler ve tile sistemine bağlı değiller. Örneğin gezegenin iklimi değiştirildiğinde (terraform) yataklar da değişebilir. İnşa engelleyen şeyler temizlendiğinde de bazı etkilere sahip olabilir.
Kod:
d_rich_mountain = {
is_for_colonizeable = yes
use_for_min_max_adjustments = yes
category = deposit_cat_minerals
use_weights_for_terraforming_swap_types = yes
should_swap_deposit_on_terraforming = yes
terraforming_swap_types = {
d_submerged_ore_veins
}
planet_modifier = {
district_mining_max = 3
}
potential = {
OR = {
is_planet_class = pc_continental
is_planet_class = pc_desert
is_planet_class = pc_alpine
is_planet_class = pc_arctic
is_planet_class = pc_arid
is_planet_class = pc_tundra
is_planet_class = pc_gaia
}
}
drop_weight = {
weight = @low
modifier = {
factor = @planet_type_bonus
is_cold = yes
}
}
}
Kod:
d_minerals_2 = {
resources = {
category = orbital_mining_deposits
produces = {
minerals = 2
}
}
station = shipclass_mining_station
is_for_colonizeable = no
potential = {
OR = {
is_planet_class = pc_asteroid
is_planet_class = pc_molten
is_planet_class = pc_toxic
is_planet_class = pc_frozen
is_planet_class = pc_barren
is_planet_class = pc_barren_cold
is_planet_class = pc_broken
is_planet_class = pc_shattered
}
}
drop_weight = {
weight = 5
modifier = {
factor = 0.5
OR = {
is_planet_class = pc_molten
is_planet_class = pc_toxic
is_planet_class = pc_frozen
}
}
modifier = {
factor = 2.0
is_asteroid = yes
}
}
}
Kod:
d_collapsed_burrows = {
icon = d_deep_sinkhole
time = 120
is_for_colonizeable = yes
category = deposit_cat_blockers
potential = { always = no } # added by event
planet_modifier = {
planet_max_districts_add = -1
}
on_cleared = {
create_pop = {
species = owner
}
}
resources = {
category = deposit_blockers
cost = {
energy = 300
}
}
}
Bölgeler
common\districts\
Daha önceki günlüklerde de bahsettiğimiz gibi Bölgeler eski “tile” sisteminin yerine geçiyor. Bunun kodları ise inşaat süresi, nerede inşa edilebileceği, başka gezegen türlerinde neye dönüştürülebileceği (makine dünyaları vs), inşaat ve bakım masrafı, gezegene olan etkileri ve yapay zekanın öncelik verme ağırlığı.
Kod:
district_mining = {
base_buildtime = 240
min_for_deposits_on_planet = 1
max_for_deposits_on_planet = 15
show_on_uncolonized = {
habitable_structure = no
NOR = {
is_planet_class = pc_machine
is_planet_class = pc_hive
is_planet_class = pc_city
}
}
potential = {
habitable_structure = no
NOT = {
is_planet_class = pc_machine
is_planet_class = pc_hive
is_planet_class = pc_city
}
}
allow = {
NOT = { has_modifier = resort_colony }
}
conversion_ratio = 1
convert_to = {
district_mining_uncapped
}
resources = {
category = planet_districts
cost = {
minerals = @base_cost
}
upkeep = {
energy = 1
}
}
planet_modifier = {
planet_housing_add = 2
}
triggered_planet_modifier = {
potential = {
exists = owner
owner = {
has_valid_civic = civic_agrarian_idyll
}
}
modifier = {
planet_housing_add = 1
}
}
triggered_planet_modifier = {
potential = {
exists = owner
owner = { is_hive_empire = yes }
}
modifier = {
job_mining_drone_add = 3
}
}
triggered_planet_modifier = {
potential = {
exists = owner
owner = { is_machine_empire = yes }
}
modifier = {
job_mining_drone_add = 2
}
}
triggered_planet_modifier = {
potential = {
exists = owner
owner = {
is_gestalt = no
is_fallen_empire_spiritualist = no
}
}
modifier = {
job_miner_add = 2
}
}
triggered_planet_modifier = {
potential = {
exists = owner
owner = { is_fallen_empire_spiritualist = yes }
}
modifier = {
job_fe_acolyte_mine_add = 2
}
}
triggered_desc = {
trigger = {
exists = owner
owner = { is_gestalt = yes }
}
text = job_mining_drone_effect_desc
}
triggered_desc = {
trigger = {
exists = owner
owner = {
is_gestalt = no
is_fallen_empire_spiritualist = no
}
}
text = job_miner_effect_desc
}
triggered_desc = {
trigger = {
exists = owner
owner = { is_fallen_empire_spiritualist = yes }
}
text = job_fe_acolyte_mine_effect_desc
}
prerequisites = {
tech_mechanized_mining
}
ai_weight = {
weight = 1
modifier = {
factor = 3
owner = {
has_monthly_income = {
resource = minerals
value < 0
}
}
}
modifier = {
factor = 2
free_housing < 0
}
modifier = {
factor = 3
any_owned_pop = { is_unemployed = yes }
}
# No one to work it anyway
modifier = {
factor = 0
free_housing > 0
NOT = {
any_owned_pop = { is_unemployed = yes }
}
}
}
ai_resource_production = {
minerals = 1
trigger = {
always = yes
}
}
}
Binalar
common\building\
Binalar çoğunlukla aynı ama yukarıda da görebileceğiniz bazı yeni işlevselliğe sahipler. Örneğin “triggered_planet_modifier” binayı kimin kontrol ettiğine göre normal iş, dron işi veya fabrika işleri verebilir. İnşa maliyeti, bakım masrafı ve kaynak üretimi “resources={}” altında. Foundry ise sadece iş ekliyor herhangi bir kaynak üretmiyor.
Kod:
building_foundry_2 = {
base_buildtime = 480
can_build = no
category = manufacturing
allow = {
has_upgraded_capital = yes
}
triggered_planet_modifier = {
potential = {
exists = owner
owner = { is_hive_empire = yes }
}
modifier = {
job_alloy_drone_add = 5
}
}
triggered_planet_modifier = {
potential = {
exists = owner
owner = { is_machine_empire = yes }
}
modifier = {
job_fabricator_add = 5
}
}
triggered_planet_modifier = {
potential = {
exists = owner
owner = { is_regular_empire = yes }
}
modifier = {
job_foundry_add = 5
}
}
resources = {
category = planet_buildings
cost = {
minerals = 600
volatile_motes = 50
}
upkeep = {
energy = 4
volatile_motes = 1
}
}
upgrades = {
building_foundry_3
}
prerequisites = {
tech_alloys_1
}
triggered_desc = {
trigger = {
exists = owner
owner = { is_regular_empire = yes }
}
text = job_foundry_effect_desc
}
triggered_desc = {
trigger = {
exists = owner
owner = { is_hive_empire = yes }
}
text = job_alloy_drone_effect_desc
}
triggered_desc = {
trigger = {
exists = owner
owner = { is_machine_empire = yes }
}
text = job_fabricator_effect_desc
}
ai_weight = {
weight = 1
modifier =
{
factor = 4
owner = {
has_monthly_income = {
resource = alloys
value < 15
}
}
}
}
ai_resource_production = {
alloys = 1
trigger = {
always = yes
}
}
}
İşler
common\pop_jobs\
Binaların eklediği işler ise diğerlerinden tamamen ayrı ama yine de tanıdık bir sentakste yazıldı. Enforcer işi normalde 1 Unity üretiyor, Polis Devletiyseniz ise 2. Ayrıca Anti-Crime Campaign etkisi varsa bakım masrafı 2 enerji daha fazla ama aynı şekilde suçu daha fazla düşürüyor.
Kod:
enforcer = {
category = specialist
condition_string = SPECIALIST_JOB_TRIGGER
building_icon = building_precinct_house
clothes_texture_index = 5
possible = {
specialist_job_check_trigger = yes
}
resources = {
category = planet_enforcers
produces = {
unity = 1
}
produces = {
trigger = {
owner = { has_valid_civic = civic_police_state }
}
unity = 1
}
upkeep = {
trigger = {
planet = { has_modifier = anticrime_campaign }
}
energy = 2
}
}
pop_modifier = {
pop_defense_armies_add = 2
}
planet_modifier = {
planet_crime_add = -25
}
triggered_planet_modifier = {
potential = {
owner = { has_non_swapped_tradition = tr_domination_judgment_corps }
}
modifier = {
planet_crime_add = -5
}
}
triggered_planet_modifier = {
potential = {
planet = { has_modifier = anticrime_campaign }
}
modifier = {
planet_crime_add = -10
}
}
weight = {
weight = @specialist_job_weight
modifier = {
factor = 0.2
has_citizenship_rights = no
NOT = { has_trait = trait_mechanical }
}
modifier = {
factor = 2
has_trait = trait_resilient
}
modifier = {
factor = 2
has_trait = trait_very_strong
}
modifier = {
factor = 1.5
has_trait = trait_strong
}
modifier = {
factor = 10
is_enslaved = yes
has_slavery_type = { type = slavery_military }
}
modifier = {
factor = 0.50
has_trait = trait_weak
}
modifier = {
factor = 0.1
can_take_servant_job = yes
}
modifier = {
factor = 1.5
has_job = enforcer
}
}
}
Sosyal Tabakalar
Yukarıdaki Enforcer’ın üyesi olduğu Uzmanlar gibi tabakalar (veya sınıflar) da aynı şekilde çalışır. Kaynak tüketimi, üretimi, etkileri ve ayarları vardır. Gestalt Bilinç imparatorlukları için olan simple_drone tabakası en basit örnek olabilir:
Kod:
simple_drone = {
rank = 0
clothes_texture_index = 2
# This is called whenever a Pop is created, moved to a different planet, or gets a new owner
assign_to_pop = {
exists = owner
owner = { is_gestalt = yes }
}
weight = {
weight = 1
}
pop_modifier = {
pop_housing_usage_base = 1
pop_amenities_usage_no_happiness_base = 1
}
# scope: pop to be resettled
allow_resettlement = {
always = yes
}
resettlement_cost = {
energy = 100
}
unemployment_resources = {
category = unemployment_resources
# Standby Mode Crime event
upkeep = {
trigger = {
planet = {
has_modifier = standby_mode
}
}
energy = 2
}
}
resources = {
category = pop_category_drones
upkeep = {
trigger = {
is_organic_species = yes
}
food = @living_standard_food_normal
}
upkeep = {
trigger = {
is_robotic_species = yes
}
energy = @living_standard_energy_normal
}
}
}
Kaynaklar
Kaynaklar artık tamamen kodlanabilir yani oyuna kendi kaynaklarınızı kolayca ekleyebilirsiniz. Bu kodlar biraz değişti, pazarda ticaret edilebilirliği, eksiye düşerseniz ne olur ve yapay zeka önceliği gibi şeyler de içeriyor. Stratejik kaynaklar da bu veri tabanında yer alıyor.
Kod:
food = {
tradable = yes
market_amount = 100
market_price = 100
max = 10000
deficit_modifier = food_deficit #found in static modifiers
ai_weight = {
weight = 1
}
ai_wants = {
base = 300
}
}
Kod:
sr_dark_matter = {
tradable = yes
market_amount = 5
market_price = 100
max = 10000
prerequisites = { "tech_mine_dark_matter" }
visibility_prerequisite = { always = yes }
ai_weight = {
weight = 100
}
}
Hepimiz 2.2 ve MegaCorp için son rötuşları yapıyoruz, gelecek hafta 2.2 yama notlarını yayınlayacağız.