Star Wars Galactic Battlegrounds szkriptek/Tények

A tények és csoportosításaikSzerkesztés

Amint már korábban írtuk, a Genie szkriptértelmező rendszere, a CP-k működése részben az ún. tényeken (facts) alapul. Informatikai, technikai szempontból nézve a tények legegyszerűbben BOOLEAN típusú, azaz igaz-hamis értéket felvevő logikai változóknak és konstansoknak (ún. elsőrendű predikátumoknak) tekinthetőek, ám ez a szkriptírás gyakorlati oldaláról nézve meglehetősen mellékes információ. A fontos az, hogy a tények a defrule parancs fejrészének építőelemei. Egy Genie szkript lényegében mohó defrule szabályok csordája, amelyeket tényekkel kell táplálni, hálából akciókat (ld. később) termelnek a szkriptíró gazdának, vagyis tevékenységre késztetik a CP-t.

A tények többféle módon is csoportosíthatóak.

  1. A tények listája mindenekelőtt betűrendben is szerepelni fog. Ehhez azonban meg kell jegyezni, hogy - bár a megfelelő szakaszban ezt írom - a lista valószínűleg nem teljes. A betűrendes lista forrásai egyéb SWGB szkriptírók útmutatói, és egyrészt: ezek részben az Age of Kings-hez tartozó gamedata.drs-ből lettek kiemelve, és innen több okból is, valószínűleg nem készíthető teljes ténylista: ugyanis a sztenderd AI nem használ fel minden szkriptnyelvbeli parancsot (ez biztos), tehát bizonyára az összes tényt sem (ez valószínű); azonkívül az Age of Kings egyes parancsai megváltozhattak a SWGB készítésekor. Másrészt, az útmutatóírók nem biztosan törekedtek teljességre, s ha törekedtek is, azt meg valószínűleg nem valósíthatták. Azonban „teljes” a lista abban a korlátozottabb értelemben, hogy szándékaim szerint minden akcióféleséget sikerült összegyűjtenem, ami más útmutatókban, ide értve az Age of Kings és a SWGB hivatalos útmutatóját is, szerepel valahol. [mj 1]
  2. A gyakorlat szempontjából a leghasznosabb természetesen a stratégiai funkció alapján vett csoportosítás, amelyet több szkript-útmutató írója is alkalmaz. A tényeket eszerint annak alapján csoportosíthatjuk, hogy a játék melyik elemére vonatkoznak, pl. építhetőségre vonatkozó tények, ellenségekre vonatkozó tények stb. Ez a fajta csoportosítás a szkriptíráskor a parancsok gyors keresésében hasznos segítség lenne, ha nem lenne részben óhatatlanul szubjektív, részben az óhatatlan átfedésektől mentesíthetetlen. Azért megpróbáltam egy ilyesfajta csoportosítást is adni.
  3. Azonban ezzel nem elégszem meg, és adok egy logikai szempontú csoportosítást is. Nevezetesen, hogy a tények bemenetei és kimenetei milyen természetű adatok: igazságérték (boolean), számérték stb.

Az adatszemantikai szempontú leírásról már volt szó a bevezetőben: a tények logikai függvényeknek (predikátumok), azaz, informatikai nyelven, boole-féle adatoknak tekintendőek. Szintaktikai szempontból kétféle tényt lehet megkülönböztetni: egyszerűt és összetettet.

Az összetett tények az egyszerűekből keletkeznek logikai kötőszavak (and, or, not, stb.) segítségével. Például

(or (building-type-count BLDG-TRAINBOAT >= 1) (unit-type-count BOAT-WORKER <= 5) )

összetett tény, két egyszerűbb tényből (building-type-count és unit-type-count), valamint az or (= vagy) logikai műveletből összeállítva.

Az egyszerűbb tények egyszerűsége sem jelenti azt, hogy tovább már ne lennének bonthatók. Megkülönböztethetünk paraméter nélküli vagy elemi tényeket (tényállandókat vagy ténykonstansokat), és paraméteres tényeket (tényfüggvényeket, változókat tartalmazó tényeket).

A ténykonstansok bizonyos értelemben „atomiak” [mj 2]: nem tartalmaznak kitöltetlen helyeket. Zárójelek között a defrule parancsba helyezve őket, a parancs azonnal eldönti, hogy igazak-e vagy sem.

Például elemi tények: (can-spy) ('végre tudom-e hajtani a „kémkedés” nevű parancsot?, igen vagy nem), (town-under-attack) (támadás alatt áll-e valamelyik épületem vagy munkásom?, igen vagy nem). Az elemi tényeknek nincs paramétere (nullparaméteresek)

Egy viszonylag egyszerű paraméteres tény: (resource-found <erőforrás>) egy darab paraméterrel rendelkezik, az <erőforrás> kifejezés helyére az erőforrások azonosítóinak egyike (food, carbon, nova, metal) írandó, és csak úgy lesz a parancsnak értelme. Például (resource-found nova) azt jelenti, talált-e már a CP novát valahol a térképen a parancs beolvasásának pillanatáig, igen, vagy nem. Az igen-vagy-nem azonban csak az erőforrás konkretizálása esetén válik eldönthetővé, négy lehetőség közül ki kell egyet választani. Az ilyen értelemben kitöltendő helyeket nevezzük paramétereknek (esetleg argumentumoknak).

Léteznek két-, három-, sőt, négyparaméteres tények is. Példa egy utóbbi jellegűre:

(players-unit-type-count <játékos-sorszám> <egységnév> <a.r.j.> <érték>)

A játékos-sorszám az első paraméter, értéke egy nemnegatív egész szám lehet nullától nyolcig. Az egységnév egy egység neve, ami akár beépített, akár a defconst paranccsal lett definiálva. Az a.r.j. egy aritmetikai relációs jel, vagyis a következők egyike: <, >, ==, <=, >=. Végül az „érték” egy egész szám lehet (valahány tízezerig). Például

(players-unit-type-count 2 UNIT-LASER-LINE >= 100)

az a tény, hogy a 2. sorszámú játékosnak a gyalogos lövészeinek (UNIT-LASER-LINE) száma meghaladja-e a százat. Ha a parancs beolvasásának pillanatában a gyalogos katonák száma 100, vagy több, akkor a tény IGAZ lesz, ha nem, akkor HAMIS. Amennyiben a parancs egy beolvasott defrule parancs fejrészében van, és az értéke éppen igaz, akkor a parancs által előírt akcióknak lehetőségük van a végrehajtódásra, persze csak akkor fognak ténylegesen végrehajtódni, ha a fejrész többi ténye is igaz (és, mellesleg, a fejrészben esetleg meg nem említett, de egyébként ettől még szükséges feltételeknek is teljesülniük kell). Ha azonban ez a konkrét tény épp hamis, akkor a defrule parancs biztosan nem hajtódik végre, akár igaz, akár hamis a többi tény a fejrészben.

Betűrendes listaSzerkesztés

Igyekezetem szerint ez egy teljes lista.

attack-soldier-count <a.r.j.> <érték>
attack-warboat-count <a.r.j.> <érték> (attack-boat-count?)
building available <épület>
building-count <a.r.j.> <érték>
building-count-total <a.r.j.> <érték>
building-type-count <épület> <a.r.j.> <érték>
building-type-count-total <épület> <a.r.j.> <érték>
can-afford-building <épület>
can-afford-complete-wall <átmérő> <faltípus>
can-afford-research <technológia>
can-afford-unit <egység>
can-build épület
can-build-gate <átmérő>
can-build-gate-with-escrow <átmérő>
can-build-wall <átmérő> <faltípus>
can-build-wall-with-escrow <átmérő> <faltípus>
can-build-with-escrow <épület>
can-buy-commodity <commodity>
can-research <technológia>
can-research-with-escrow <technológia>
can-sell-commodity <commodity>
can-spy
can-spy-with-escrow
can-train <épület>
can-train-with-escrow <épület>
carbon-amount <a.r.j.> <érték>
cc-players-building-count <player-number> <a.r.j.> <érték>
cc-players-building-type-count <player-number> <épület> <a.r.j.> <érték>
cc-players-unit-count <player-number> <a.r.j.> <érték>
cc-players-unit-type-count <player-number> <egység> <a.r.j.> <érték>
cheats-enabled
civ-selected <civ>
civilian-population <a.r.j.> <érték>
commodity-buying-price <commodity> <a.r.j.> <érték>
commodity-selling-price <commodity> <a.r.j.> <érték>
current-age <a.r.j.> <kor>
current-age-time <a.r.j.> <érték>
current-score <a.r.j.> <érték>
death-match-game
defend-soldier-count <a.r.j.> <érték>
defend-warboat-count <a.r.j.> <érték>
difficulty <a.r.j.> <nehézségi fok>
doctrine <érték>
dropsite-min-distance <erőforrás> <a.r.j.> <érték>
enemy-buildings-in-town
enemy-captured-holocrons (enemy-captured-relics?)
escrow-amount <erőforrás> <a.r.j.> <érték>
event-detected <esemény> <esemény-azonosító>
false
food-amount <a.r.j.> <érték>
game-time <a.r.j.> <érték>
goal <goal-id> <érték>
nova-amount <rel-op> <érték>
housing-headroom <a.r.j.> <érték>
idle-farm-count <a.r.j.> <érték>
map-size <térképnagyság>
map-type <térképtípus>
military-population <a.r.j.> <érték>
nursery-headroom <a.r.j.> <érték>
player-computer <játékos sorszáma>
player-human <játékos sorszáma>
player-in-game <játékos sorszáma>
player-number <játékos sorszáma>
player-resigned <játékos sorszáma>
player-valid <játékos sorszáma>
players-building-count <játékos sorszáma> <épület> <a.r.j.> <érték>
players-building-type-count <játékos sorszáma> <épület> <a.r.j.< <érték>
players-civ <játékos sorszáma> <civ>
players-civilian-population <játékos sorszáma> <a.r.j.> <érték>
players-current-age <játékos sorszáma> <a.r.j.> <age>
players-current-age-time <játékos sorszáma> <a.r.j.> <érték>
players-military-population <játékos sorszáma> <a.r.j.> <érték>
player-number
players-population <player-number> <a.r.j.> <érték>
players-score <játékos sorszáma> <a.r.j.> <pontszám>
players-stance <játékos sorszáma> <diplomatic-stance>
players-tribute <játékos sorszáma> <resource-type> <a.r.j.> <érték>
players-tribute-memory <játékos sorszáma> <resource-type> <a.r.j.> <érték>
players-unit-count <játékos sorszáma> <a.r.j.> <érték>
players-unit-type-count <játékos sorszáma> <unit> <a.r.j.> <érték>
population <a.r.j.> <érték>
population-cap <a.r.j.> <érték>
population-headroom <a.r.j.> <érték>
random-number <érték>
regicide-game
research-available <technológia>
research-completed <technológia>
resource-found <resource-type>
shared-goal <shared-goal-id> <érték>
sheep-and-forage-too-far
soldier-count <a.r.j.> <érték>
stance-toward <játékos sorszáma> <diplomatic-stance>
starting-age <a.r.j.> <érték>
starting-resources <a.r.j.> <starting-resources>
metal-amount <a.r.j.> <érték>
strategic-number <strategic-number> <a.r.j.> <érték>
taunt-detected <játékos sorszáma> <taunt-id>
timer-triggered <timer-id>
too-many-unpowered-buildings
town-under-attack
true
unit-available <unit>
unit-count <a.r.j.> <érték>
unit-count-total <a.r.j.> <érték>
unit-type-count <unit> <a.r.j.> <érték>
unit-type-count-total <unit> <a.r.j.> <érték>
victory-condition <victory-condition>
wall-completed-percentage <átmérő> <a.r.j.> <érték>
wall-invisible-percentage <átmérő> <a.r.j.> <érték>
warboat-count <a.r.j.> <érték>


Stratégiai csoportosításSzerkesztés

Játékbeállítás-leírókSzerkesztés
Általános játékbeállítás-leírókSzerkesztés
  • cheats-enabled
  • death-match-game
  • difficulty
  • map-size
  • map-type
  • regicide-game
  • victory-condition
  • player-computer
  • player-human
  • player-in-game
  • player-number
  • player-resigned
  • player-valid
  • players-civ <player-number> <civ>
  • population-cap
  • starting-age
  • starting-resources
Játékosspecifikus játékbeállítás-leírókSzerkesztés
  • civ-selected
Általános játékállás-leírókSzerkesztés
Korszak- és időleírókSzerkesztés
  • current-age
  • current-age-time
  • current-score (kicsit kakukktojás)
  • game-time <a.r.j.> <érték>
Játékosspecifikus játékállás-leírókSzerkesztés
ErőforrásleírókSzerkesztés
  • can-afford-building <épület>
  • can-afford-research <technológia>
  • can-afford-unit <unit>
  • carbon-amount
  • can-buy-commodity
  • can-sell-commodity
  • commodity-buying-price
  • commodity-selling-price
  • escrow-amount
  • food-amount
  • resource-found
  • sheep-and-forage-too-far
  • metal-amount
  • nova-amount
Várossal kapcsolatos tényekSzerkesztés
  • housing-headroom
  • idle-farm-count
  • population-headroom
  • sheep-and-forage-too-far
  • town-under-attack
Fallakkal kapcsolatos tényekSzerkesztés
  • can-afford-complete-wall
  • can-build-gate
  • can-build-gate-with-escrow
  • can-build-wall
  • can-build-wall-with-escrow
  • wall-completed-percentage <átmérő> <a.r.j.> <érték>
  • wall-invisible-percentage <átmérő> <a.r.j.> <érték>
Aktorpopuláció-leírókSzerkesztés

Civil:

  • civilian-population
  • population <a.r.j.> <érték>
  • population-headroom <a.r.j.> <érték>

Katonai:

  • military-population
  • soldier-count
  • warboat-count

Összes:

  • building-available
  • building-count
  • building-count-total
  • building-type-count
  • building-type-count-total
  • unit-count
  • unit-count-total
  • unit-type-count
  • unit-type-count-total

Ld. még támadó- és védőegység-leírók.

Támadó-és védőegység-leírókSzerkesztés
  • attack-soldier-count
  • attack-warboat-count
  • defend-soldier-count
  • defend-warboat-count
Ellenségekkel kapcsolatos tényekSzerkesztés
  • enemy-buildings-in-town
  • enemy-captured-relics
  • town-under-attack
A többi játékossal kapcsolatos tényekSzerkesztés
  • cc-players-building-count <player-number> <a.r.j.> <érték>
  • cc-players-building-type-count <player-number> <épület> <a.r.j.> <érték>
  • cc-players-unit-count <player-number> <a.r.j.> <érték>
  • cc-players-unit-type-count <player-number> <unit> <a.r.j.> <érték>
  • dropsite-min-distance <resource-type> <a.r.j.> <érték>
  • players-building-count <player-number> <épület> <a.r.j.> <érték>
  • players-building-type-count <player-number> <épület> <a.r.j.< <érték>
  • players-civilian-population <player-number> <a.r.j.> <érték>
  • players-current-age <player-number> <a.r.j.> <age>
  • players-current-age-time <player-number> <a.r.j.> <érték>
  • players-military-population <player-number> <a.r.j.> <érték>
  • players-population <player-number> <a.r.j.> <érték>
  • players-score <player-number> <a.r.j.> <score>
  • players-stance <player-number> <diplomatic-stance>
  • players-tribute <player-number> <resource-type> <a.r.j.> <érték>
  • players-tribute-memory <player-number> <resource-type> <a.r.j.> <érték>
  • players-unit-count <player-number> <a.r.j.> <érték>
  • players-unit-type-count <player-number> <unit> <a.r.j.> <érték>
Input-output tényekSzerkesztés
  • event-detected <event-type> <event-id>
  • taunt-detected
  • shared-goal
Egyéb tényekSzerkesztés
  • doctrine
  • false
  • goal
  • random-number <érték>
  • timer-triggered <timer-id>
  • true
FogyasztandókSzerkesztés
  • can-build épület
  • can-build-with-escrow <épület>
  • can-research <technológia>
  • can-research-with-escrow <technológia>
  • can-spy
  • can-spy-with-escrow
  • can-train <épület>
  • can-train-with-escrow <épület>
  • research-available <technológia>
  • research-completed <technológia>
  • stance-toward <player-number> <diplomatic-stance>
  • strategic-number <strategic-number> <a.r.j.> <érték>
  • unit-available <unit>

Tények részletesenSzerkesztés

attack-soldier-countSzerkesztés

Ez a tényleíró megadja a CP saját támadó harcosainak számát. A támadó harcosok olyan szárazföldi katonai egységek, amelyeket a CP egy támadó osztagba csoportosított. Az egységek támadó osztagokba szervezését bizonyos stratégiai számok vezérlik.
; Példa:
 
(defrule
(attack-soldier-count >= 5)
=>
(attack-now)
)

attack-warboat-countSzerkesztés

Ez a tényleíró megadja a CP saját támadó hadihajóinak számát. A támadó hadihajók olyan hadihajók (fregattok, rombolók, légelhárító fregattok, illetve cirkálók), amelyeket a CP egy támadó hajóosztagba csoportosított. A vízi egységek támadó osztagokba szervezését bizonyos stratégiai számok vezérlik.
; Példa:
 
(defrule
(attack-warboat-count >= 5)
=>
(attack-now)
)

building-availableSzerkesztés

Ez a tényleíró megadja, hogy a paraméterként szolgáló épület felépíthető lenne-e, ha meglenne hozzá a szükséges erőforrás / építőanyag, ám az utóbbi feltételt NEM ellenőrzi (ebben különbözik a can-build tényleírótól). A building-available tehát ellenőrzi, hogy egy épület megépítéséhez van-e elég hely (? tesztelendő), hogy lehetséges-e az adott játékállapot mellett, hogy a CP felépítse (pl. egy T3 épület nem építhető a T1 korszakban); valamint, hogy az esetleges előfeltételként szolgáló többi épület (pl. városközpont) fel van-e építve.[mj 3]
A példaszkript ellenőrzi, építhető-e farm, és ha nem, akkor, mivel ez feltehetőleg azért van, mert nincs még ételraktár (BLDG-DROPCHOW), akcióként megpróbál építeni egyet az utóbbi épületből.
; Példa:
 
(defrule
(not (building-available BLDG-FARM) )
(can-build BLDG-DROPCHOW)
=>
(build BLDG-DROPCHOW)
)

building-countSzerkesztés

Ez a tényleíró ellenőrzi az adott CP saját épületeinek számát. Csak a teljesen kész épületek számítanak, s e tekintetben „kevesebb”, mint a következő, building-count-total tényleíró.
A példaszkript ellenőrzi, a T1 korszakban a szabály végrehajtásakor elérte-e az épületek száma a pontosan 5-öt, s ha igen, megpróbál egy barakkot építeni.
; Példa:
 
(defrule
(current-age == tech-level-1)
(building-count == 5)
(can-build BLDG-TRAINTROOPER)
=>
(build BLDG-TRAINTROOPER)
(disable-self)
)

building-count-totalSzerkesztés

Ez a tényleíró ellenőrzi az adott CP saját épületeinek számát, ide értve az építésre a térképen kijelölt épületeket (elsősorban fal-elemekből szoktak ilyenek sokan lenni) és az építés alatt álló épületkezdeményeket is - ennyiben „több”, mint az előző, building-count tényleíró.
A példaszkript ellenőrzi, a T1 korszakban a szabály végrehajtásakor, ha van már 5-épület, építés alatt áll-e még néhány, s ha igen, akkor egy chat-üzenetet küld saját magának erről a helyzetről (ilyen szabályokat tesztelésekhez szoktunk gyártani).
; Példa:
 
(defrule
(current-age == tech-level-1)
(building-count == 5)
(building-count-total >= 6)
=>
(chat-to-player my-player-number "Hé, egy hatodik épületem van építés alatt.")
(disable-self)
)

building-type-countSzerkesztés

Ez a tényleíró ellenőrzi, hogy egy (paraméterként) megadott épülettípusból az adott CP-nek hány példánya épült fel. Nem számolja a felépített, de elpusztult épületeket (csak azt, hogy az adott pillanatban mennyi van belőlük), és az építés alatt állókat sem, csak a teljesen készeket (ennyibe kevesebb, mint a következő, building-type-count-total tényleíró). A building-type-count a leggyakrabban alkalmazott tényleírók egyike a Genie szkriptekben, nincs olyan épkézláb CP, akinek szüksége lenne egy városra és ne alkalmazná.
A példaszkript ellenőrzi, hogy a T1 korszakban a szabály végrehajtásakor van-e már parancsnoki központja a játékosnak, és ha nincs, megpróbál építeni egyet.
; Példa:
 
(defrule
(current-age == tech-level-1)
(building-type-count BLDG-MAIN == 0)
(can-build BLDG_MAIN)
=>
(build BLDG-MAIN)
(disable-self)
)

building-type-count-totalSzerkesztés

Ez a tényleíró ellenőrzi, hogy egy (paraméterként) megadott épülettípusból az adott CP-nek hány példánya épült vagy épül fel. Nem számolja a felépített, de elpusztult épületeket (csak azt, hogy az adott pillanatban mennyi van belőlük), viszont számolja az építés alatt állókat is, nem csak a teljesen készeket (ennyibe „több”, mint az előző, building-type-count tényleíró).
A példaszkript ellenőrzi, hogy a T1 korszakban a szabály végrehajtásakor van-e már parancsnoki központja a játékosnak, és ha nincs, megpróbál építeni egyet.
; Példa:
 
(defrule
(current-age == tech-level-1)
(building-type-count-total BLDG-MAIN == 0)
(can-build BLDG_MAIN)
=>
(build BLDG-MAIN)
(disable-self)
)

cc-players-unit-type-countSzerkesztés

Felméri, hogy a játéktérképen egy adott sorszámú játékosnak (változók, azaz joker-azonosítók is használhatóak) valamilyen egységből hány darab van. Cheat-szerű parancs, azaz nem kell „személyesen” találkoznia, egyik egységének látóterébe sem kerülnie a keresett egységtípusnak.

Használat, példa:

(defrule
(cc-players-unit-type-count 0 59 >= 1)
=>
(build BLDG-DROPCHOW)
)

A fenti parancs ellenőrzi, hogy GAIÁ-nak (0. sorszámú játékos) az 59-es bnaa-jú objektumból, azaz muja bokorból hány egységnyi van, ha van, akkor épít (alapértelmezésben minél közelebb a bokrokhoz) egy élelemfeldolgozót.

Explorációs irányszámok és alapértelmezéseikSzerkesztés

stratégiai szám gamedata.drs. alapértelmezés
sn-number-explore-groups 0
sn-minimum-explore-group-size 2
sn-maximum-explore-group-size 2
-- --
sn-total-number-explorers 4
sn-minimum-civilian-explorers 0
sn-cap-civilian-explorers 2
sn-percent-civilian-explorers 34
  ---
sn-initial-exploration-required 2
sn-percent-exploration-required 100
sn-percent-half-exploration 30

HivatkozásokSzerkesztés

MegjegyzésekSzerkesztés

  1. Becsülettel be kell vallanom azonban, hogy a gamedata.drs fájlt - idő hiányában - nem böngésztem végig. Ezt más útmutató-írók, különösen Balbarian már megtették.
  2. De nem olyan értelemben, mint a matematikai logikában, ezért nem alkalmazzuk az „atomi” és „elemi” jelzőket. Logikai szempontból azok a tények számítanak atominak, amelyekből a logikai kötőszavak alkotta mondatok felépülnek, és ez a Genie-szkriptnyelv mindegyik tényére igaz. Az itteni megkülönböztetés a matematikában/logikában a zárt-nyílt (ítélet és kijelentésfüggvény) megkülönböztetésének felel meg inkább, de annak is csak félreérthető módon).
  3. A Star Wars Galactic Battlegroundsban - az Age of Empirestől eltérően - gyakorlatilag egyfajta beépített épület-előfeltételesség van a véletlen térképeken: a farmok építéséhez rendelkezni kell ételraktárral.

JegyzetekSzerkesztés