Tworzenie własnego zestawu reguł „Postęp"

Praca nad Postęp (ang. Progress) była na jakiś czas zawieszona, jednak od wczoraj wprowadzam drobne ulepszenia. W tym wpisie jednak opiszę, jak wykorzystać elementy dodane do Postęp w porównaniu do Freeciv, by tworzyć reguły gry. Postęp bazuje na Freeciv, więc opiszę tylko te elementy, których nie ma we Freeciv. To nie jest poradnik dla gracza, a dla modera.

Nowości w Postęp

Postęp wprowadza następujące nowości, względem Freeciv:

  • Wielkich ludzi
  • Akumulatory efektów (effects accumulators)
  • Iteratory efektów (effects iterators)
  • Punkty dumy
  • Eureki
  • Prawa społeczne (civics)

Jest tego więcej, ale powyższe dotyczą elementów modyfikowalnych z poziomu zestawu reguł. Mówiąc prościej - są to elementy, na które moder może mieć wpływ. W tym artykule nie omówię definiowania własnych praw społecznych, a także definiowania wielkich ludzi.

Akumulatory efektów

Akumulatory efektów służą do ograniczenia m.in działania/uruchamiania efektów względem liczby tur. Można np. określić, iż efekt ma trwać minimalnie x tur - nawet w sytuacji, gdy przesłanki za jego uruchomieniem staną się nieprawdziwe. Można także określić, iż efekt zacznie działać, jeśli przesłanki będą prawdziwe przez y tur. Dodatkowo, to dla rozdzielenia różnych sytuacji, istnieje możliwość dodania pola remember_target_* = true, gdzie gwiazdka oznacza np. player, city, unit, itd. Dzięki temu będziemy móc rozdzielić pojedynczy efekt np. ze względu na jednostkę. W takiej sytuacji liczenie liczby tur będzie odbywać się oddzielnie dla każdej z jednostek.

[effect_defense]
remember_target_unit = true
type = "Defend_Bonus"
value = 200
calc_fnc = "number of turn on"
reqs =<br> { "type", "name", "range" 
 "Extra", "Fortress", "Tile"
 "UnitClass", "Land", "Local"
 }

Podobny efekt jest w Cywilizacji 4. Powyższe nakazuje, iż jednostki za fortyfikacją, będą co turę otrzymywać premię dwukrotności swoich punktów obrony. Jeżeli przestaną się fortyfikować, to premia przepada. Decyduje o tym calc_fnc, które określa number of turn on, czyli value będzie mnożone przez liczbę tur włączonych pod rząd. Dodatkowo remember_target_unit nakazuje, by premia była stosowana dla każdej jednostki oddzielnie. Bez remember_target_unit, premia liczyłaby się dla wszystkich jednostek. 

Dla calc_fnc można wykorzystać jeszcze: simple(normalny tryb liczenia), number of activation (bierze pod uwagę liczbę aktywacji kiedykolwiek podczas rozgrywki, jednak w jednej turze może się aktywować wiele razy number of turn active (bierze pod uwagę liczbę aktywacji kiedykolwiek podczas rozgrywki, jednak wiele aktywacji w jednej turze jest liczona jako pojedyncza aktywacja).

Iteratory efektów

Iteratory efektów pozwalają na przejście po liście podobnych obiektów (określonej klasy), by np. sprawdzić czy spełniają warunki. Dla przykładu:

[effect_barracks_1]
type = "HP_Regen"
value = 100
reqs =
 { "type", "name", "range", "present"
 "Building", "Barracks", "City", TRUE
 "UnitClass", "Land", "Local", TRUE
 "IterationOfUnits", "IterElem", "City", TRUE
 "UnitType", "Medic", "IterItem", TRUE
 }

Powyższe szuka medyków w mieście i leczy jednostki, jeżeli się znajdzie medyk, a dodatkowo w mieście są baraki. IterationOfUnits działa tylko w odniesieniu do gracza lub miasta. Nazwą (wartość w kolumnie name) jest lokalna nazwa dla pobranego przez iterator obiektu.

Eureki

Kolejnym mechanizmem są tzw, eureki. Eureki działają na podobnej zasadzie, co w Cywilizacji VI, jednak w moim projekcie są bardziej elastyczne. Oto przykład jednej z Eureki:

[effect_eureka_test_1]
type = "Technology_Progress_Add"
value = 5
remember_target_player = TRUE
max_activation_number = 2
reqs =
{
 "type", "name", "range"
 "OutputTechnology", "Masonry", "player"
 "city_built(X)", "", "lua_event" 
}

Powyższy efekt nakazuje dodanie punktów wynalezienia dla technologii murarstwa za każdym razem, gdy gracz wybuduje nowe miasto. W przyszłości pewnie dodam sprawdzanie czy miasto jest niedaleko kamienia. Efekt dodaje za każdym razie 5 punktów, a maksymalna liczba aktywacji wynosi 2, czyli można dostać 10 punktów. Może nieomówionym elementem jest city_built(X) o zasięgu lua_event. Zasięg lua_event nakazuje podłączyć się pod zdarzenie określone w typie (kolumna type) i pobierać parametry tego zdarzenia, nazywając je zgodnie z konwencją od lewej do prawej. Potem można korzystać z takich parametrów, poprzez przypisane im nazwy. Jednym z zastosowań jest typ wymogu (ang. requirement) o nazwie ExactlyObject. ExactlyObject służy do sprawdzania czy rozważany jest element przypisany do testowanej nazwy. Jest to jednak osobny temat.

Punkty dumy

Punkty dumy to takie połączenie punktów religii, premii za spuściznę i punktów kultury. Są one dodawane za osiągnięcia, np. wybudowanie jakiejś budowli. Zakładam istnienie cudów, które nie będą nic graczowi dawać, poza punktami dumy. Za punkty dumy już teraz można kupić jednostkę lub kupić premię dla swojej cywilizacji (w oknie polityk - ang. policies). Generalnie punkty dumy zdobywa się budując cuda. Jeżeli gracz wybuduje cud przed zadanym terminem od początku rozgrywki, otrzymuje pełny bonus dumy. W przeciwnym przypadku, korzysta gra ze wzoru:

duma -= (1 + (tura - turn_proud_decrease) / next_dec) * turn_proud_decrease_amount;

W powyższym kodzie duma to maksymalna ilość punktów dumy za dany budynek, tura to obecna tura, turn_proud_decrease to liczba punktów, która jest odejmowana, gdy gracz przekroczy przyjęty okres na wybudowanie danego cudu, next_dec to ilość tur, która poskutkuje kolejnym zmniejszeniem ilości dumy, a turn_proud_decrease_amount to liczba punktów do odjęcia za każde next_dec tur przekroczenia.

Poniżej prezentuję przykładową definicję budowli:

<br><br>[building_palace]<br>name = _("Palace")<br>genus = "SmallWonder"<br>reqs =<br> { "type", "name", "range"<br> }<br>graphic = "b.palace"<br>graphic_alt = "-"<br>obsolete_by =<br> {"type", "name", "range"<br> }<br>placement = "residental"<br>proud_add = 100<br>proud_turn_decrease_start = 20<br>proud_turn_decrease_next = 5<br>proud_turn_decrease_amount = 5<br>build_cost = 30<br>sabotage = 0<br>upkeep = 0<br>great_politican_bonus = 2<br>great_general_bonus = 1<br>great_scientist_bonus = 0<br>great_enginer_bonus = 0<br><br>

Powyżej: proud_add to maksymalna duma, proud_turn_decrease_start to numer tury, od której liczba punktów dumy spada, proud_turn_decrease_next to co ile tur, po poprzednio omówionej wartości, zmniejszyć liczbę punktów dumy, a proud_turn_decrease_amount to liczba punktów dumy do pomniejszenia za każde kolejne proud_turn_decrease_next tur od chwili proud_turn_decrease_start.

To wszystko. Artykuł jest dosyć obszerny.