Úvod

Vítejte v nápovědě pro editaci misí hry OPERATION FLASHPOINT.

Toto není oficiální nápověda výrobce ani distributora počítačové hry Operation FLASHPOINT. Celou nápovědu jsem poskládal z dostupných zdrojů, jako je internet, moje laické zkušenosti s editacemi misí a oficiální anglický "Scripting commands reference" manuál v kombinaci s omezenou znalostí anglického jazyka. V předchozích verzích nápovědy jsem vždy poděkoval konkrétním lidem za pomoc při tvorbě této nápovědy, dnes už mi ale zaslalo pomocné příspěvky tolik lidí, že bych pro to musel zřídit další stránku a ani nevím, jestli bych na někoho nezapomněl :o). Proto teď tímto děkuji prostě všem, kteří mi s tvorbou této nápovědy jakkoli pomohli.

Dnes se již cítím býti mnohem více fundovanější pro tvorbu této nápovědy než při tvorbě předchozích verzí, nicméně je stále mnoho věcí, které se musím v OFP naučit, a proto se předem omlouvám, pokud tato nápověda nebude v některé části zcela vyčerpávající nebo v ní naleznete nějakou tu chybu. I přesto jsem však přesvědčen, že v konečném důsledku Vám bude tato nápověda kvalitním a dostatečným průvodcem při tvorbě Vašich vlastních misí.

Tato nápověda je optimalizována pro prohlížení na monitoru se zobrazením 1024 x 768 a proto doporučuji vždy okno této nápovědy maximalizovat.

Budete-li mít chuť sdělit mi svůj názor na tuto nápovědu

pošlete mi prosím mail na adresu : ruprtovo@ruprt.cz

Ruprt

Zabij jednoho a jsi vrah, zabij tisíce a jsi dobyvatel


Operation FlashPoint - Seznam příkazů EDITORU MISÍ

Operation FlashPoint - Editor - SEZNAM PŘÍKAZŮ

AccTime | CreateVehicle | HandsHit | OrderGetIn | SetRadioMsg
Action | Crew | HasWeapon | PickWeaponPool | SetRain
AddAction | CtrlEnable | Hint | Player | SetRepairCargo
AddEventHandler | CtrlEnabled | HintC | PlayersNumber | SetSkill
AddMagazine | CtrlSetText | HintCadet | PlayMove | SetSpeedMode
AddMagazineCargo | CtrlShow | If...Then...Else | PlayMusic | SetTerrainGrid
AddMagazinePool | CtrlText | In | PlaySound | SetUnitPos
AddRating | CtrlVisible | InFlame | Position | SetVelocity
AddScore | CutObj | IsNull | PreprocessFile | SetViewDistance
AddWeapon | CutRSC | Join | PrimaryWeapon | SetWPPos
AddWeaponCargo | CutText | KnowsAbout | Private | ShowCinemaBorder
AddWeaponPool | Damage | Land | PublicVariable | ShowCompass
Alive | DayTime | LbAdd | PutWeaponPool | ShowGPS
AllowDammage | DebugLog | LbClear | QueryMagazinePool | ShowMap
AllowFleeing | DeleteIdentity | LbColor | QueryWeaponPool | ShownCompass
AllowGetIn | DeleteStatus | LbCurSel | Random | ShownGPS
Ammo | DeleteVehicle | LbData | Rating | ShownMap
Animate | Dialog | LbDelete | RemoveAction | ShownPad
AnimationPhase | Direction | LbPicture | RemoveAllEventHandlers | ShownRadio
AssignAsCargo | DisableAI | LbSetColor | RemoveAllWeapons | ShownWarrant
AssignAsCommander | DisableUserInput | LbSetCurSel | RemoveEventHandler | ShownWatch
AssignAsDriver | Distance | LbSetData | RemoveMagazine | ShowPad
AssignAsGunner | DoFire | LbSetPicture | RemoveMagazines | ShowRadio
Behaviour | DoFollow | LbSetValue | RemoveWeapon | ShowWarrant
Benchmark | DoMove | LbSize | RequiredVersion | ShowWatch
BuildingPos | DoStop | LbText | Resistance | Side
ButtonAction | DoTarget | LbValue | Reveal | SideChat
ButtonSetAction | DoWatch | Leader | Resize | SideEnemy
CadetMode | Driver | LeaveVehicle | SaveGame | SideFriendly
Call | Drop | LightIsOn | SaveIdentity | SideRadio
CamCommand | East | List | SaveStatus | Skill
CamCommit | EnableEndDialog | LoadFile | SaveVar | SkipTime
CamCommitted | EnableRadio | LoadIdentity | Say | SomeAmmo
CamCreate | EstimatedTimeLeft | LoadStatus | Score | SliderPosition
CamDestroy | Exec | Local | ScudState | SliderRange
CameraEffect | Exit | Localize | SecondaryWeapon | SliderSetPosition
CamSetBank | FadeMusic | Lock | Select | SliderSetRange
CamSetDive | FadeSound | Locked | SelectWeapon | SliderSetSpeed
CamSetFOV | FillWeaponsFromPool | LockWP | Set | SliderSpeed
CamSetFOVRange | Fire | Magazines | SetAccTime | SoundVolume
CamSetPos | Flag | MapAnimAdd | SetAmmoCargo | Speed
CamSetRelPos | FlagOwner | MapAnimClear | SetBehaviour | SpeedMode
CamSetTarget | Fleeing | MapAnimCommit | SetCaptive | Stop
CanFire | FlyInHeight | MapAnimDone | SetCombatMode | Stopped
CanMove | ForceEnd | MarkerColor | SetDamage | SwitchCamera
CanStand | ForceMap | MarkerPos | SetDammage | SwitchLight
Civilian | Foreach | MarkerSize | SetDir | SwitchMove
ClearMagazineCargo | Format | MarkerType | SetFace | TextLog
ClearWeaponCargo | Formation | MissionName | SetFaceAnimation | Time
ClearMagazinePool | FormLeader | MissionStart | SetFlagOwner | TitleCut
ClearWeaponPool | Fuel | Move | SetFlagSide | TitleObj
CloseDialog | GetDammage | MoveInCargo | SetFlagTexture | TitleRsc
CombatMode | GetDir | MoveInCommander | SetFog | TitleText
Commander | GetMarkerColor | MoveInDriver | SetFormation | TypeOf
CommandFire | GetMarkerPos | MoveInGunner | SetFormDir | UnassignVehicle
CommandFollow | GetMarkerSize | MusicVolume | SetFuel | UnitReady
CommandMove | GetMarkerType | Name | SetFuelCargo | Units
CommandStop | GetPos | NearestBuilding | SetGroupID | Vehicle
CommandTarget | GetWPPos | NearestObject | SetIdentity | VehicleChat
CommandWatch | GlobalChat | Object | SetMarkerColor | VehicleRadio
Comment | GlobalRadio | ObjNull | SetMarkerPos | Velocity
Count | Goto | ObjStatus | SetMarkerSize | WaypointPosition
CountEnemy | Group | OnBriefingGear | SetMarkerType | Weapons
CountFriendly | GroupChat | OnBriefingGroup | SetMimic | West
CountSide | GroupRadio | OnBriefingNotes | SetObjectTexture | While...Do
CountType | GrpNull | OnBriefingPlan | SetOvercast |
CreateUnit | Gunner | OnMapSingleClick | SetPos |

Vysvětlivky :

Žluté příkazy | příkazy a funkce do verze hry 1.75 (CWC)
Modré příkazy | příkazy a funkce od verze hry 1.75 (Resistance)


AccTime

Popis: | Vrací hodnotu nastavení aktuálního časového zrychlení
Syntaxe: | AccTime
Vrací hodnotu: | Hodnotu časového zrychlení: <1 - zpomalený čas >1 - zrychlený čas 1 - normální
Příklad použití: | _gamespeed = AccTime
Další: |


Action
Popis: | Používa se na spuštění určité akce v hře. Formát akce má být [typ, cíl, param1, param2, param3]. Vyžadován je pouze typ; cíl je aktuální; param1, param2, param3 jsou typy volitelné.
Syntaxe: | NázevJednotkyAction ["TypAkce"] NázevJednotky je název jednotky, pro kterou má být akce spuštěna. TypAkce je název spouštené akce (viz příloha).
Vrací hodnotu: | žádnou
Příklad použití: | Hrac Action ["STROKEGUN"]
Další | Příloha s výčtem akcí


AddAction
Popis | Vytvoří novou položku akčního menu a přidruží k ní zadanou akci.
Syntaxe | jednotka AddAtion ["Název Akce", "Soubor Scriptu Akce"]
Vrací hodnotu | číslo
Příklad použití | Player AddAction ["Hello","hello.sqs"]
Další Vyžadována verze 1.1 a všší.

Vrácená hodnota je ID zadané akce. První akce přidělená k zadanému vojákovi má ID = 0, další má ID = 1, atd.

Pro práci s ID zadané akce (především při použití s příkazem RemoveAction) je vhodné toto ID uchovávat v proměnné :

myActionID = Player AddAction ["Hello","hello.sqs"]

uchovávání ID akce však není povinné a lze ho zjistit i následovně v případě že si jej do proměnné neuložíte, a to tak jak je popsáno níže.

Script přiřazený k akci příkazem AddAction a následně spuštěný stiskem nabídky akčního menu získá tři volací parametry v poli argumentů kde :

_this Select 0 = název typu objektu, kterému je spuštěná akce přiřazena (vlastník akce)

_this Select 1 = jméno jednotky, která akci spustila

_this Select 2 = ID spuštěné akce


AddEventHandler
Popis: | Přiřadí správce události (EventHandler) zadané jednotce nebo vozidlu. Seznam správců událostí naleznete zde.
Syntaxe: | jednotka AddEventHandler ("Typ", {Akce}]
Vrací hodnotu: | číslo -> ID přiřazené události.
Příklad použití: | handlerID = voj1 AddEventHandler ["Fired",{_this Exec "fired.sqs"}]
Poznámka: | Správce události je proces, který neustále sleduje předdefinované situace (viz Seznam událostí) u každé jednotky nebo vozidla. Jakmile se taková situace ve hře vyskytne, správce vytvoří patřičné pole proměnných s patřičnými hodnotami a následně provede akci (obvykle script), která byla pro tuto situaci autorem mise připravena. Každé jednotce může být přiřazeno více správců událostí. Formát a syntaxe této funkce jsou shodné s funkcí AddAction. Proměnné uchovávající ID přiřazené události by měly být veřejné (bez úvodního spodnítka), neboť jedině tak lze z kterékoli části mise Správce události jednotce zase odebrat použitím příkazu RemoveEventHandler. Související témata : RemoveEventHandler, RemoveAllEventHandlers, Seznam správců událostí


AddMagazine
Popis: | Přidá dané jednotce střelivo do určené zbraně
Syntaxe: | NázevJednotky AddMagazine"TypStřeliva" NázevJednotkyje název jednotky, které chceme střelivo přidat. TypStřelivaje druh střeliva, který jí chceme přidat. Typy střeliva jsou popsány v seznamu zbraní a střeliva.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac AddMagazine "M16"
Další: | Když v tomto příkazu vytvoříte chybnou kombinaci např. "20 granátů", chování aplikace bude nepředvídatelné.


AddMagazineCargo
Popis: | Přidá střelivo do vozidla nebo objektu (např. "krabice s municí")
Syntaxe: | NázevObjektu AddMagazineCargo ["TypStřeliva",Počet] NázevObjektuje název objektu, do kterého chceme střelivo přidat. TypStřelivaje druh střeliva, které chceme přidat. Počet je množství střeliva. Typy střeliva jsou popsány v seznamu zbraní a střeliva
Vrací hodnotu: | žádnou
Příklad použití: | Krabice1 AddMagazineCargo ["M16",4]
Další: |


AddMagazinePool

Popis:

Přidá munici-zásobníky hráče do prostoru munice-magazines souboru weapons.cfg pro aktuální kampaň. Soubor se automaticky vytvoří v adresáři :

USERS\jméno hráče\SAVED\CAMPAIGNS\adresář kampaně\weapons.cfg.

Pozor! Aby bylo možno tento příkaz použít musí být v souboru description.ext kampaně definováno :

weaponPool = True;
Syntaxe: AddMagazinePoll ["název munice", počet]
Vrací hodnotu: žádnou
Příklad použití: AddMagazinePool ["AK47", 3]
Další: Munice se ze souboru weapons.cfg načte a přiřadí jednotce příkazem FillWeaponsFromPool, a to v závislosti na zbraních,které tato jednotka má. Použitím tohoto příkazu je pak možné provést v brífingu následující mise vlastní výběr munice uložené tímto příkazem.

Vyžadována verze hry 1.75 a vyšší.


AddRating

Popis: | Přidá body k navýšení scóre.
Syntaxe: | NázevJednotkyAddRating Počet NázevJednotkyje název jednotky, které chceme body přidat. Počet je kolik bodů chceme přidat. Na odebrání bodů použijte záporná čísla.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac AddRating 1000
Další: |


AddScore

Popis: | Přidá skóre (body). Použitelné jenom v MultiPlayer misích.
Syntaxe: | NázevJednotkyAddScore Počet NázevJednotky je název jednotky, které chceme body přidat. Počet je kolik bodů chceme přidat.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac AddScore 10
Další: |


AddWeapon
Popis: | Přidá dané jednotce určenou zbraň.
Syntaxe: | NázevJednotky AddWeapon "TypZbraně" NázevJednotky je název jednotky, které chceme zbraň přidat. TypZbraně je typ zbraně, kterou chceme přidat. Druhy zbraní jsou popsány v seznamu zbraní a střeliva
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac AddWeapon "M16"
Další: |


AddWeaponPool

Popis:

Přidá zbraně hráče do prostoru zbraní souboru weapons.cfg pro aktuální kampaň. Soubor se automaticky vytvoří v adresáři :

USERS\jméno hráče\SAVED\CAMPAIGNS\adresář kampaně\weapons.cfg.

Pozor! Aby bylo možno tento příkaz použít musí být v souboru description.ext kampaně definováno :

weaponPool = True;
Syntaxe: AddWeaponPool ["název zbraně", počet]
Vrací hodnotu: žádnou
Příklad použití: AddWeaponPool ["AK47, 1]
Další: Použitím tohoto příkazu je pak možné provést v brífingu následující mise vlastní výběr zbraní uložených tímto příkazem.

Vyžadována verze hry 1.75 a vyšší.


Alive
Popis: | Zjišťuje, zda je jednotka naživu
Syntaxe: | Alive NázevJednotky NázevJednotky je název jednotky, pro kterou hodnotu žjišťujeme.
Vrací hodnotu: | Vrací hodnotu TRUE nebo FALSE TRUE - je naživu FALSE - není naživu
Příklad použití: | ?(Alive MujHrac):AddScore 10
Další: |


AllowDammage
Popis: | Nastavuje, zda může jednotka utrpět poškození
Syntaxe: | NázevJednotkyAllowDammage TorF NázevJednotky je název jednotky, pro kterou má hodnota nabýt platnosti TorF nabývá hodnot TRUE nebo FALSE TRUE - může být poškozena FALSE - nemůže být poškozena
Vrací hodnotu: | <null>
Příklad použití: | this AllowDammage FALSE (při inicializaci) Hrac AllowDammage FALSE
Další: | Dá se výhodně používat při testování mise, kdy nehrozí, že byste mohli být zabiti. Hlavně to na úplném konci vývoje nezapomeňte změnit. Od verze hry 1.10 je příkaz nepoužitelný. Zajímavostí je chyba, které se dopustili autoři ve slově Dammage - anglicky správně má být Damage (poškození), proto si dejte na toto pozor.


AllowFleeing
Popis: | Nastaví, zda může jednotka či celá skupina prchat.
Syntaxe: | NázevJednotky AllowFleeing X NázevJednotky je název jednotky nebo skupiny. X je číslo 0 nebo 1 (0-nemůže prchat , 1-může prchat)
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac AllowFleeing 0 Group MujHrac AllowFleeing 1
Další: |


AllowGetIn
Popis: | Určuje, které z vybraných jednotek mohou nastoupit do vozidla. Používa se zejména s příkazem UnassignVehicle a jenom ve zvláštních situacích.
Syntaxe: | Pole AllowGetIn TorF Poleobsahuje jednotky, pro které ma být příkaz platný. TorF je hodnota TRUE nebo FALSE kde: TRUE - vstup povolen FALSE - vstup zamítnut
Vrací hodnotu: | žádná
Příklad použití: | [MujHrac] AllowGetIn FALSE (Units Group aP) AllowGetIn FALSE
Další: |


Ammo
Popis: | Zjišťuje, kolik střeliva zbývá ve zbrani
Syntaxe: | NázevJednotky Ammo "Zbraň" NázevJednotky je název jednotky, pro kterou hodnotu zjišťujeme. Zbraň je typ zbraně, pro kterou hodnotu zjišťujeme.
Vrací hodnotu: | Vrací počet zbývajících nábojů ve zbrani. Například pro M16 vrací hodnotu mezi 0-30, pro LAW 0-1 atd.
Příklad použití: | ?(MujHrac Ammo "M16"==0):aP SideChat "Nabij si zbraň, proboha!"
Další: |


Animate

Popis: | Provede animaci objektu. Animace je definována souborem config.cpp zadaného objektu. Argument "Fáze" je povinný a musí být nastaven na 1.
Syntaxe: | objekt Animate ["objekt animace", Fáze]
Vrací hodnotu: | žádnou
Příklad použití: | house Animate ["doors1", 1]
Další: | Vhodné především pro tvůrce AddOnů. Nemáte-li seznam animací zadaného objektu nemáte bohužel šanci zjistit na jakou část objektu animaci použít, a tak se mi použití tohoto příkazu jeví jako zcela nepotřebné. Typickou ukázkou animace je otevření dveří některých domů na ostrově Nogova, před kterou se Vám v akčním menu objeví nabídka "Otevřít dveře". Vyžadována verze hry 1.75.


AnimationPhase

Popis: | Vrací hodnotu animační fáze zadaného objektu.
Syntaxe: | objekt AnimationPhase "objekt animace"
Vrací hodnotu: | číslo
Příklad použití: | house AnimationPhase "doors1"
Další: | Viz popis příkazu Animate. Vyžadována verze hry 1.75.


AssignAsCargo
Popis: | Určuje jednotce, že má zaujmout pozici v nákladovém prostoru vozidla. Tenhle příkaz se musí používat s bodem trasy [waypointem] NÁSTUP [GET IN] nebo s příkazem OrderGetIn.
Syntaxe: | NázevJednotky AssignAsCargo NázevVozidla NázevJednotky je název jednotky, kterou chceme umístit do nákladového prostoru. NázevVozidlaje název vozidla, do kterého chceme jednotku umístnit.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac AssignAsCargo Nakladak1 "_x AssignAsCargo Nakladak1" ForEach (Units Group aP)
Další: |


AssignAsCommander
Popis: | Určuje jednotce, že má zaujmout pozici velitele vozidla. Tenhle příkaz se musí použivat s bodem trasy [waypointem] NÁSTUP [GET IN] nebo s příkazem OrderGetIn.
Syntaxe: | NázevJednotkyAssignAsCommander NázevVozidla NázevJednotky je název jednotky, kterou chceme umístit do nákladového prostoru. NázevVozidla je název vozidla, do kterého chceme jednotku umístit.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac AssignAsCommader MujTank
Další: |


AssignAsDriver
Popis: | Určuje jednotce, že má zaujmout pozici řidiče vozidla. Tenhle příkaz se musí použivat s bodem trasy [waypointem] NÁSTUP [GET IN] nebo s příkazem OrderGetIn.
Syntaxe: | NázevJednotky AssignAsDriver NázevVozidla NázevJednotky je název jednotky, kterou chceme umístit do nákladového prostoru. NázevVozidla je název vozidla, do kterého chceme jednotku umístnit.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac AssignAsDriver MujTank
Další: |


AssignAsGunner
Popis: | Určuje jednotce, že má zaujmout pozici střelce ve vozidle. Tenhle příkaz se musí použivat s bodem trasy [waypointem] NÁSTUP [GET IN] nebo s příkazem OrderGetIn.
Syntaxe: | NázevJednotky AssignAsGunner NázevVozidla NázevJednotky je název jednotky, kterou chceme umístit do nákladového prostoru. NázevVozidla je název vozidla, do kterého chceme jednotku umístnit.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac AssignAsGunner MujTank
Další: |


Benchmark
Popis: | Vrací číselnou hodnotu známou také jako "CPU benchmark result" v nastaveních hry. Tenhle příkaz můžete použít k optimalizaci chodu vaší mise na slabších CPU. Například múžete snížit dohlednost, nebo omezit počet jednotek.
Syntaxe: | Benchmark
Vrací hodnotu: | Číselnou hodnotu výkonu CPU. Čím je číslo vyšší, tím lépe
Příklad použití: | ?(Benchmark < 1000):SetViewDistance 400
Další: |


Behaviour
Popis: | Zjistí, jak má jednotka právě nastavené chování.
Syntaxe: | Behaviour jednotka
Vrací hodnotu: | řetězec
Příklad použití: | Behaviour vojak1
Poznámka: | Vracená hodnota je vždy jedna z následujících : CARELESS - bezstarostně SAFE - bezpečně AWARE - opatrně COMBAT - bojovně STEALTH - skrytě Související témata : SetBehaviour


BuildingPos
Popis | Vrací zadanou indexovanou pozici v budově, vrácená hodnota je ve formátu [x,y] nebo [x,y,z], kde x = východ-západ, y = jih-sever , z=výška nad zemí, default=0
Syntaxe | building BuildingPos indexovanapozice
Vrací hodnotu | pole
Příklad použití | TitleText[Format["%1", (NearestBuilding hrac) BuildingPos 3], "PLAIN"]
Další | Tyto indexované pozice jsou vlastně nivelační body jednotlivých částí dané budovy. Pozor !!! V oficiálním "Scripting Command" manuálu se tvrdí, že parametrem tohoto příkazu má být pole proměnných, což nefunguje. Parametrem musí být číslo.


ButtonAction

Popis: | Vrátí řetěz s akcí přiřazenou prvku aktuálně spuštěného dialogu se zadaným IDC. Akce může být jakýkoli výraz nebo příkaz z tohoto skriptovacího jazyka. Tento příkaz může být použit pro tlačítka a aktivní texty.
Syntaxe: | ButtonAction IDC
Vrací hodnotu: | řetězec
Příklad použití: | _getaction = ButtonAction 1001
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy. Vyžadována verze hry 1.75.


ButtonSetAction

Popis: | Nastaví soubor příkazů, které se provedou při stisku tlačítka se zadaným IDC dialogu. Příkaz může být jakýkoli z tohoto scriptovacího jazyka. ButtonSetAction může být použit pro tlačítka a aktivní texty.
Syntaxe: | ButtonSetAction [IDC, "PŘÍKAZY"]
Vrací hodnotu: | žádnou
Příklad použití: | ButtonSetAction [1001, "[] Exec ""onClickGetData.sqs"""]
Další: | IDC je indexové číslo objektu dialogu, může mít jakoukoli celočíselnou hodnotu, ale nesmí být v jednom description.ext použita dvě stejná čísla IDC pro dva různé objekty. Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy. Vyžadována verze hry 1.75.


CadetMode
Popis: | Zjišťuje, zda hráč hraje v módu Kadet.
Syntaxe: | CadetMode
Vrací hodnotu: | Vrací TRUE nebo FALSE. TRUE = hráč hraje v kadet módu FALSE = hráč nehraje v kadet módu
Příklad použití: | ?(CadetMode): BMP1 SetDammage 0.8
Další: |


Call
Popis: Vykoná kód zadaný jako argument. Tuto funkci můžete zavolat s volacími parametry umístěnými v hranatých závorkách, které jsou do těla funkce předány stejně jako u příkazu Exec určovací proměnnou/polem _this.
Syntaxe: Call {kod_scriptu}

[volaci_parametry] Call {kod_scriptu}

volaci_parametr Call {kod_scriptu}

Vrací hodnotu: jakoukoli
Příklad použití: Call {TitleText["Text", "PLAIN"]}

[voj1, 50, Position plane1 Select 2] Call LoadFile "myFile.sqf"

Poznámka: POZOR !!!

V oficiálním scripting commands manuálu je jako příklad použito :

call {"x=2"}

Tento příklad ale nic neudělá ale pouze vrátí řetězec "x=2", neboť kudrnaté závorky jsou hrou chápany jako oddělovač řetězců, což v konečném důsledku znamená, že v použitém příkladu by to znamenalo vlastně toto :

call ""x=2""

Aby tento příklad byl smysluplný musel by být použit např. takto

_text = call {"x=2"}

proměnná _text by pak obsahovala hodnotu "x=2".

Bude-li funkce Call volána s volacími parametry (viz příklad 2) budou tyto parametry předány do souboru myFile.sqf jako prvky pole. tzn, že v souboru myFile.sqf je můžete stejně jako v souborech .SQS spuštěných příkazem Exec ovládat pomocí určovací proměnné/pole _this, např.:

_element1 = _this Select 0 -> voj1

_element2 = _this Select 1 -> 50

_element3 = _this Select 2 -> Position plane1 Select 2

Související témata : LoadFile, PreprocessFile, Exec, Tutoriál o podmínkách.


CamCommand
Popis: | Umožňuje hráči zaslat různé příkazy na specifickou kameru.
Syntaxe: | CameraID CamCommand "prikaz" CameraID je ID kamery, pro kterou chceme použít příkaz. Je to proměnná použitá s příkazem CamCreate. prikaz je příkaz kameře. Může mít hodnotu: "manual on" = kontrolu nad kamerou má hráč "manual off" = vypne hráči kontrolu nad kamerou "inertia on" = kamera může procházet zdmi a objekty "inertia off" = kamera nemůže procházet zdmi a objekty
Vrací hodnotu: | žádnou
Příklad použití: | _cam CamCommand "manual on"
Další: |


CamCommit
Popis: | Aplikuje všechny změny na specifickou kameru najednou.
Syntaxe: | CameraID CamCommit cas CameraID je ID kamery, na kterou chceme aplikovat změny. Je to proměnná použitá s příkazem CamCreate. cas je hodnota v sekundách, během kterých se aplikují změny na kameru. Použitím 0 se aplikují změny okamžitě.
Vrací hodnotu: | žádnou
Příklad použití: | _cam CamCommit 2
Další: | Všechna nastavení kamery nebudou aktivovány, pokud nepoužijete CamCommit.


AccTime

CamCommitted
Popis | Zkontroluje zda-li je ukončeno předávání změn do zadané kamery.
Syntaxe | CamCommit CameraID CameraID je ID kamery, na kterou byly aplikovány změny.
Vrací hodnotu | Boolean (true nebo false)
Příklad použití | CamCommited _camera
Další |


CamCreate
Popis: | Vytváří novou kameru. Tento příkaz lze též použít na zobrazení výbuchu dané munice na určených souřadnicích, zobrazení letící střely nebo jiného objektu.
Syntaxe: | "typ_kamery" CamCreate [souřadnice] typ_kamery je typ vytvářené kamery. Může mít hodnotu: "camera" = normální kamera "seagull" = racek [pole] obsahuje číselné hodnoty X,Y,Z souřadnic pro umístění kamery. "typMunice" CamCreate [souřadnice]
Vrací hodnotu: | Název kamery můžeme použít s dalšími příkazy pro kameru.
Příklad použití: | _cam = "Camera" CamCreate [3000,2500,20] "Heat125" CamCreate GetPos tank
Další: | Chcete-li tento příkaz použít pro zobrazení výbuchu, letících střel či jiných objektů musí být zapsán ve scriptu. V polích " PŘI AKTIVACI" spínačů, waypointů apod. nefunguje. Vyzkoušené typy výbuchů : "Heat73" "Heat105" "Heat120" "Heat125" "Shell73" "Shell105" "Shell120" "Shell125" Letící střely : "AT3" "RPG" "LAW" "CarlGustav" "HellFire" Ostatní : "Grenade" "Seagull" Pomocí tohoto příkazu je možné zobrazit mnoho dalších objektů definovaných souborem config.bin hry, nebo config.bin jednotlivých addonů, ale je nutné je nejdříve odzkoušet. Dekódovaný soubor config.bin k verzi hry 1.75 je součástí této nápovědy a můžete jej rozbalit přímo odsud.


CamDestroy
Popis: | Zničí existující kameru.
Syntaxe: | CamDestroy CameraID CameraID je název kamery. Je to proměnná použitá s příkazem CamCreate.
Vrací hodnotu: | žádnou
Příklad použití: | CamDestroy _cam
Další: |


CameraEffect
Popis: | Nastaví efekt pro existujíci kameru.
Syntaxe: | CameraID CameraEffect ["efekt","pozice"] CameraID je název kamery. Je to proměnná použitá s příkazem CamCreate. efekt je efekt pro kameru. Může mít hodnoty: TERMINATE TRANSITION INTERNAL NONE BOOM AND ZOOM ZOOMUOT ZOOMIN ALIGNED EXTERNAL EXTERNAL_FIX FOLLOW_FAR FOLLOW_NEAR TRACKING STATIC TIMED INTERPOLATED CHAINED pozice je pozice kamery vzhledem k cíli. Může mít hodnoty: BOTTOM BACKTOP FRONTTOP RIGHTTOP LEFTTOP RIGHTBACK LEFTBACK RIGHTFRONT LEFTFRONT BACK FRONT RIGHT LEFT TOP
Vrací hodnotu: | žádnou
Příklad použití: | _cam CammeraEffect ["INTERNAL","BACK"]
Další: | Zdá se, že ve scriptech fungují pouze efekty Internal a Terminate.


CamSetBank
Popis: | Tento příkaz by měl nastavit náklon zadané kamery.
Syntaxe: | camera CamSetBank náklon
Vrací hodnotu: | žádná
Příklad použití: | _cam CamSetBank -0.1
Další: | Tuto funkci se mi však nepodařilo ověřit, neboť ať jsem ji zkoušel jakkoli, nezaznamenal jsem žádnou změnu. Máte-li s tímto příkazem někdo zkušenosti zašlete mi prosím help na e-mail : ruprt@atlas.cz


CamSetDive
Popis: | Tento příkaz by měl nastavit propad (pokles, ponoření) zadané kamery.
Syntaxe: | camera CamSetDive náklon
Vrací hodnotu: | žádná
Příklad použití: | _cam CamSetDive -0.1
Další: | Tuto funkci se mi však nepodařilo ověřit, neboť ať jsem ji zkoušel jakkoli, nezaznamenal jsem žádnou změnu. Máte-li s tímto příkazem někdo zkušenosti zašlete mi prosím help na e-mail : ruprt@atlas.cz


CamSetFov

Popis: | Nastaví přiblížení pro existující kameru.
Syntaxe: | CameraID CamSetFov fov CameraID je název kamery. Je to proměnná použitá s příkazem CamCreate. fov určuje přiblížení. Hodnoty >1 jsou pro vzdálení a hodnoty >1 pro přiblížení pohledu.
Vrací hodnotu: | žádnou
Příklad použití: | _cam CamSetFov 0.654
Další: |


CamSetFovRange

Popis: | Tento příkaz by měl nastavit rozsah pro automatické přiblížení pro existující kameru.
Syntaxe: | CameraID CamSetFovRange [0.1, 0.5] CameraID je název kamery. Je to proměnná použitá s příkazem CamCreate.
Vrací hodnotu: | žádnou
Příklad použití: | _cam CamSetFovRange [0.1, 0.5]
Další: | Tento příkaz se mi bohužel nepodařilo ověřit. Při jeho použití jsem nezaznamenal žádnou změnu.


CamSetPos

Popis: | Nastaví pro kameru pozici na mapě
Syntaxe: | CameraID CamSetPos [x,y,z] CameraID je název kamery. Je to proměnná použitá s příkazem CamCreate. x,y,z jsou souřadnice na mapě.
Vrací hodnotu: | žádnou
Příklad použití: | _cam CamSetPos [3000,2500,20]
Další: |


CamSetRelPos

Popis: | Nastaví pozici kamery vzhledem k pozici aktuálního cíle kamery.
Syntaxe: | CameraID CamSetRelPos [Xoffset,Yoffset,Zoffset] CameraID je název kamery. Je to proměnná použitá s příkazem CamCreate. Xoffset,Yoffset,Zoffset jsou odchylky (+,-) od pozice cíle kamery.
Vrací hodnotu: | žádnou
Příklad použití: | _cam CamSetRelPos [-45, -30, 0]
Další: | Popis příkladu použití tohoto příkazu můžete nalézt v sekci Tipy a Triky - Kamera za vozidlem.


CamSetTarget

Popis: | Nastaví cíl (směr pohledu) pro existující kameru.
Syntaxe: | Existují dva druhy použití: CameraID CamSetTarget [pole] CameraID CamSetTarget cil CameraID je název kamery. Je to proměnná použitá s příkazem CamCreate. pole je vyjadřeno hodnotami souřadnic X,Y,Z pro zaměření na určitý bod. cil je název jednotky, na kterou se má kamera zaměřit.
Vrací hodnotu: | žádnou
Příklad použití: | _cam CamSetTarget [-85002.95,-30899.97,182.26] _cam CamSetTarget MujHrac
Další: |


CanFire

Popis: | Vrací, zda jednotka může střílet. Netýká se počtu munice. Velmi užitečné pro vozidla. Pro lidské jednotky je vždy TRUE.
Syntaxe: | CanFire NázevJednotky NázevJednotky je název jednotky, pro kterou hodnotu zjišťujeme.
Vrací hodnotu: | Vrací hodnotu TRUE nebo FALSE TRUE - může střílet FALSE - nemůže střílet
Příklad použití: | ?(!CanFire MujTank):MujTank SideChat "Nemůžu střílet!"
Další: |


CanMove

Popis: | Vrací, zda se jednotka může pohybovat. Netýká se množství paliva. Velmi užitečné pro vozidla. Pro lidské jednotky je vždy TRUE.
Syntaxe: | CanMove NázevJednotky NázevJednotky je název jednotky, pro kterou hodnotu zjišťujeme.
Vrací hodnotu: | Vrací hodnotu TRUE nebo FALSE TRUE - může se hýbat FALSE - nemůže se hýbat
Příklad použití: | ?(!CanMove MujTank):MujTank SideChat "Nemůžu se hýbat!"
Další: |


CanStand

Popis: | Vrací, zda jednotka může stát. Pro vozidla je vždy FALSE.
Syntaxe: | CanStand NázevJednotky NázevJednotky je název jednotky, pro kterou hodnotu zjišťujeme.
Vrací hodnotu: | Vrací hodnotu TRUE nebo FALSE TRUE - může stát FALSE - nemůže stát
Příklad použití: | _muzechodit = CanStand MujHrac
Další: |


ClearMagazineCargo

Popis: | Odebere všechnu munici z vozidla nebo objektu (např. "Krabice s municí").
Syntaxe: | ClearMagazineCargo NázevObjektu NázevObjektu je název objektu, ze kterého chceme střelivo odebrat.
Vrací hodnotu: | žádnou
Příklad použití: | ClearMagazineCargo Krabice1
Další: |


ClearMagazinePool

Popis: | Vymaže obsah prostoru munice-magazines v souboru weapons.cfg. Tímto příkazem se z tohoto souboru vymaže veškerá munice uložená do něj příkazy AddMagazinePool a PickWeaponPool.
Syntaxe: | ClearMagazinePool
Vrací hodnotu: | žádnou
Příklad použití: | ClearMagazinePool
Další: | Vyžadována verze hry 1.75 a vyšší.


ClearWeaponCargo

Popis: | Odebere všechny zbraně z vozidla nebo objektu (např. "Krabice s municí").
Syntaxe: | ClearWeaponCargo NázevObjektu NázevObjektu je název objektu, ze kterého chceme zbraně odebrat.
Vrací hodnotu: | žádnou
Příklad použití: | ClearWeaponCargo Krabice1
Další: |


ClearWeaponPool

Popis: | Vymaže obsah prostoru zbraní v souboru weapons.cfg. Tímto příkazem se z tohoto souboru vymažou veškeré zbraně uložené do něj příkazy AddWeaponPool a PickWeaponPool.
Syntaxe: | ClearWeaponPool
Vrací hodnotu: | žádnou
Příklad použití: | ClearWeaponPool
Další: | Vyžadována verze hry 1.75 a vyšší.


CloseDialog

Popis: | Uzavře dialogové okno definované souborem description.ext a spuštěné příkazem CreateDialog.
Syntaxe: | CloseDialog IDD IDD je indexové číslo přiřazené dialogu v souboru description.ext
Vrací hodnotu: | žádnou
Příklad použití: | CloseDialog 1000
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy. Vyžadována verze hry 1.75.


CombatMode
Popis: Vrací bojové nastavení jednotky.
Syntaxe: CombatMode NázevJednotky
NázevJednotky je název jednotky, pro kterou hodnotu zjišťujeme.
Vrací hodnotu: "BLUE" = Nikdy nestřílet
"GREEN" = Nestřílet
"WHITE" = Nestřílet, formace volná
"YELLOW" = Zahájit palbu
"RED" = Zahájit palbu, formace volná
Příklad použití: ?(CombatMode MujHrac == "GREEN"):MujHrac SideChat "Žádám o povolení k palbě!"
Další:


Comment
Popis: | Tento příkaz nic neprovede. Používá se pouze pro zapsání komentářů.
Syntaxe: | Comment "Text"
Vrací hodnotu: | žádnou
Příklad použití: | Comment "Text"
Poznámka: | Tento příkaz funguje stejně jako když použijete jako první znak řádku scriptu středník. Narozdíl od tohoto řešení komentářů můžete příkaz Comment použít kdekoli na řádku, musí mu však předcházet středník. Např: TitleText[Format["%1", _x], "PLAIN"]; Comment "kometář"; a = 45


Commander

Popis: | Vrací identifikaci velitele ve specifikovaném vozidle.
Syntaxe: | Commander NázevJednotky NázevJednotky je název vozidla, pro které hodnotu zjišťujeme
Vrací hodnotu: | Identifikaci velitele vozidla
Příklad použití: | (Commander MujTank) GlobalChat "Byl jsem zrozen pro velení"
Další: |


CommandFollow

Popis: | Velitel vydá rozkaz jednotce na následováni určené jednotky (velitele skupiny). Chcete-li aby voják následoval velitele stávající skupiny, je efektivnější použít rádiový povel "Návrat do formace". Pro následování jednotky v jiné skupině je nutno použít příkaz Join. Rozkaz je vydán prostřednictvím radiové hlášky.
Syntaxe: | NázevJednotky CommandFollow NázevVelitele NázevJednotkyje název jednotky, pro kterou platí rozkaz. Pro více jednotek muže být použito pole. NázevVelitele je název jednotky, která má být následována.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac CommandFollow (MujHrac Leader) [MujHrac, East1] CommandFollow Leader MujHrac
Další: | Na vydání rozkazu více různým jednotkám najednou se používá pole obsahující výčet jednotek. Rozkaz bude platný pouze pro jednotky ve skupině, do které patří prvně jmenovaná jednotka. Když bude v poli i velitel skupiny, příkaz nebude fungovat.


CommandMove

Popis: | Velitel vydá rozkaz jednotce na přesun na určenou pozici. Rozkaz je vydán prostřednictvím radiové hlášky.
Syntaxe: | NázevJednotky CommandMove Pozice NázevJednotky je název jednotky, pro kterou platí rozkaz. Pro více jednotek může být použito pole. Pozice může být pole obsahujíci X,Y,Z souřadnice nebo pozice markeru (značky).
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac CommandMove [1000,1000] [MujHrac, East1] CommandMove GetMarkerPos "Marker1"
Další: | Na vydání rozkazu více různým jednotkám najednou se používá pole obsahující výčet jednotek. Rozkaz bude platný pouze pro jednotky ve skupině, do které patří prvně jmenovaná jednotka. Když bude v poli i velitel skupiny, příkaz bude vydán pouze jemu a ostatní členové skupiny ho budou následovat, pokud jsou ve formaci. Pokud bude velitel mrtev, nový velitel se přesune na další waypoint. Pokud není další waypoint definován, vrátí se na poslední waypoint.


CommandStop

Popis: | Velitel vydá jednotce rozkaz na zastavení. Rozkaz je vydán prostřednictvím radiové hlášky.
Syntaxe: | CommandStop NázevJednotky NázevJednotky je název jednotky, pro kterou platí rozkaz. Pro více jednotek může být použito pole.
Vrací hodnotu: | žádnou
Příklad použití: | CommandStop MujHrac CommandStop [MujHrac, East1]
Další: | Na vydání rozkazu více různým jednotkám najednou se používá pole obsahující výčet jednotek. Rozkaz bude platný pouze pro jednotky v skupině, do které patří prvně jmenovaná jednotka. Když bude v poli i velitel skupiny, příkaz bude vydán pouze jemu a ostatní členové skupiny ho budou následovat, pokud jsou ve formaci. Pokud bude velitel mrtev, nový velitel se přesune na další waypoint. Pokud není další waypoint definován, vrátí se na poslední waypoint.


CommandTarget

Popis: | Velitel vydá jednotce rozkaz na zacílení na určenou jednotku. Rozkaz je vydán prostřednictvím radiové hlášky.
Syntaxe: | NázevJednotky CommandTarget Cil NázevJednotky je název jednotky, pro kterou platí rozkaz. Pro více jednotek může být použito pole. Cil je název jednotky, která má být zacílena.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac CommandTarget Units Group West1 MujHrac CommandTarget West1
Další: | Na vydání rozkazu více různým jednotkám najednou se používá pole obsahující výčet jednotek. Rozkaz bude platný pouze pro jednotky ve skupině, do které patří prvně jmenovaná jednotka.


CommandWatch

Popis: | Velitel vydá jednotce rozkaz k pozorování určené jednotky. Rozkaz je vydán prostřednictvím radiové hlášky.
Syntaxe: | NázevJednotky CommandTarget Cil NázevJednotky je název jednotky, pro kterou platí rozkaz. Pro více jednotek může být použito pole. Cil je název jednotky, na kterou má být pohlédnuto.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac CommandWatch Units Group Civil1 MujHrac CommandWatch Civil1
Další: | Na vydání rozkazu více různým jednotkám najednou se používá pole obsahující výčet jednotek. Rozkaz bude platný pouze pro jednotky v skupině, do které patří prvně jmenovaná jednotka.


Count
Popis | Zjistí počet elementů zadaného pole proměnných.
Syntaxe | Count pole
Vrací hodnotu | číslo
Příklad použití | Count [1, 2, 3, 4, 125, 126], výsledkem je 6 _countgroupmembers = Count Units hrac TitleText[Format["%1", Count Units hrac], "PLAIN"]
Další |


CountEnemy
Popis | Spočítá kolik jednotek daného pole je jednotkou považováno za nepřátele.
Syntaxe | jednotka CountEnemy nepřátelé
Vrací hodnotu | číslo
Příklad použití | player CountEnemy list spinac1
Další |


CountFriendly
Popis | Spočítá kolik jednotek daného pole je jednotkou považováno za přátele.
Syntaxe | player CountFriendly list spinac1
Vrací hodnotu | číslo
Příklad použití | player CountFriendly list spinac1
Další |


CountSide
Popis | Spočítá kolik vozidel ze seznamu patří zadané straně.
Syntaxe | strana CountSide seznam vozidel
Vrací hodnotu | číslo
Příklad použití | west CountSide list spinac1
Další |


CountType
Popis | Spočítá kolik vozidel v zadaném seznamu zadaného typu.
Syntaxe | "Typ" CountType seznam vozidel
Vrací hodnotu | číslo
Příklad použití | "Tank" CountType [t1, t2, aI1, plane]
Další | Použitelné typy vozidel jsou : Tank Car Man Helicopter Plane Každé z vozidel patří do některého typu, např : M113 patří do "M113" -> "APC" -> "TANK" západní voják patří do "SoldierWB" -> "SOLDIER" -> "MAN"


CountUnknown
Popis | Spočítá kolik jednotek daného seznamu je jednotkou považováno za neznámé.
Syntaxe | jednotka CountUnknown seznam jednotek
Vrací hodnotu | číslo
Příklad použití | player CountEnemy list spinac1
Další |


CreateDialog

Popis: | Spustí a zobrazí dialogové okno definované souborem description.ext.
Syntaxe: | CreateDialog "Nazev dialogu"
Vrací hodnotu: | Boolean
Příklad použití: | _opendialog = CreateDialog "HelloWorld"
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy. Vyžadována verze hry 1.75.


CreateUnit
Popis: V průběhu hry vytvoří jednotku daného typu
Syntaxe: "TypJednotky" CreateUnit [souřadnice, skupina, inicializace, dovednost, hodnost]
Vrací hodnotu: žádnou
Příklad použití: "SoldierWB" CreateUnit [GetMarkerPos "narusitel", groupAlpha]
Další Vyžadována verze hry 1.40 a vyšší.

Vymazány mohou být pouze jednotky příkazem DeleteVehicle vložené v editoru misí nebo v průběhu hry tímto příkazem.

Hráč nemůže být vymazán.

inicializace, dovednost a hodnost jsou nepovinné hodnoty, jejichž implicitní nastavení je :

inicializace - ""

dovednost - 0.5

hosdnost - "PRIVATE" (vojín)


CreateVehicle
Popis: | V průběhu hry vytvoří prázdné vozidlo daného typu
Syntaxe: | "TypVozidla" CreateVehicle [souřadnice]
Vrací hodnotu: | žádnou
Příklad použití: | _tank = "M1Abrams" CreateVehicle GetMarkerPos "tankFactory"
Další | Vyžadována verze hry 1.40 a vyšší. Vymazána mohou být pouze vozidla příkazem DeleteVehicle vložené v editoru misí nebo v průběhu hry tímto příkazem. Pro bližší popis typů vozidel nahlédněte do seznamů tříd objektů.


Crew
Popis | Vrací jednotky spojené s daným vozidlem. Když vozidlo není vozidlem, ale osobou, je vrácen seznam se zadanou osobou.
Syntaxe | Crew vozidlo jednotka
Vrací hodnotu | pole čísel
Příklad použití | Crew jeep1 player
Další |


CtrlEnable

Popis: | Zpřístupní nebo znepřístupní prvek dialogu se zadaným IDC. Tento prvek musí být definován souborem description.ext jako podtřída aktuálně spuštěného dialogového okna.
Syntaxe: | CtrlEnable [IDC, Boolean]
Vrací hodnotu: | žádnou
Příklad použití: | CtrlEnable [1001, True]
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy. Vyžadována verze hry 1.75.


CtrlEnabled

Popis: | Zjistí zda-li je prvek aktuálně spuštěného dialogu se zadaným IDC právě přístupný.
Syntaxe: | CtrlEnabled IDC
Vrací hodnotu: | Boolean
Příklad použití: | _isenabled = CtrlEnabled 1001
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy. Vyžadována verze hry 1.75.


CtrlSetText

Popis: | Nastaví text prvku aktuálně spuštěného dialogu se zadaným IDC. Tento příkaz může být použit pro statické texty, tlačítka, editboxy a aktivní texty.
Syntaxe: | CtrlSelText [IDC, "Zobrazený text"]
Vrací hodnotu: | žádnou
Příklad použití: | CtrlSelText [1001, "Hello World !"]
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy. Vyžadována verze hry 1.75.


CtrlShow

Popis: | Zobrazí nebo skryje prvek aktuálně spuštěného dialogu se zadaným IDC.
Syntaxe: | CtrlShow [IDC, Boolean]
Vrací hodnotu: | žádnou
Příklad použití: | CtrlShow[1001, True]
Další: | To, že je prvek tímto příkazem skrytý neznamená, že nemůžete měnit jeho vlastnosti a parametry nebo je číst. Tímto příkazem se daný prvek skutečně pouze vizuálně "schová". Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy. Vyžadována verze hry 1.75.


CtrlText

Popis: | Vrátí text zobrazený prvkem aktuálně spuštěného dialogu se zadaným IDC. Tento příkaz může být použit pro statické texty, tlačítka, editboxy a aktivní texty. Text těchto prvků se nastavuje příkazem CtrlSelText.
Syntaxe: | CtrlText IDC
Vrací hodnotu: | řetězec
Příklad použití: | _gettext = CtrlText 1001
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy. Vyžadována verze hry 1.75.


CtrlVisible

Popis: | Zjistí, zda-li je prvek aktuálně spuštěného dialogu se zadaným IDC viditelný nebo skrytý. Nastavení zobrazení provedete příkazem CtrlShow.
Syntaxe: | CtrlVisible IDC
Vrací hodnotu: | Boolean
Příklad použití: | _isvisible = CtrlVisible 1001
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy. Vyžadována verze hry 1.75.


CutObj
Popis | Zobrazí objekt definovaný souborem description.ext nebo config.bin. Argument může být ve formátu : ["name,"type",speed] nebo["name","type"].Když není zadáno speed je automaticky dosazeno 1.
Syntaxe | CutObj ["Objekt","Efekt"]
Vrací hodnotu | žádná
Příklad použití | CutObj ["TVSet","Plain"]
Další | Více informací o definování objektů získáte v tomto tutoriálu.


CutRsc
Popis | Vybere a zobrazí objekt ze zabudovaných zdrojů hry nebo definovaný souborem description.ext. Argument může být ve formátu : ["name","type",speed] nebo["name","type"].Když není zadáno speed je automaticky dosazeno 1. Zdroj může být nedefinován v souboru description.ext.
Syntaxe | CutRsc ["Objekt","Efekt"]
Vrací hodnotu | žádná
Příklad použití | CutRsc ["binocular","Plain"]
Další | Více informací o definování objektů získáte v tomto tutoriálu.


CutText
Popis | Nastaví efekt textu. Argument může být ve formátu : ["text","type",speed] nebo ["text","type"].Když není zadáno speed je automaticky dosazeno 1. Speed je doba, po jakou má být text na obrazovce viditelný.
Syntaxe | CutText ["Text","Type", speed]
Vrací hodnotu | žádná
Příklad použití | CutText ["","BLACK OUT", 3]
Další | Následující typy mohou být použity : PLAIN PLAIN DOWN BLACK BLACK FADED BLACK OUT BLACK IN WHITE OUT WHITE IN


Damage

Popis: | Vrátí hodnotu poškození objektu. Příkaz je identický s příkazem GetDammage.
Syntaxe: | Damage objekt
Vrací hodnotu: | číslo (v rozsahu 0 až 1)
Příklad použití: | _curdamage = Damage tank1
Další: | Vyžadována verze hry 1.75 a vyšší.


DayTime
Popis | Vrací čas ve hře v hodinách a desetinách hodin.
Syntaxe | DayTime
Vrací hodnotu | číslo
Příklad použití | DayTime
Další |


DebugLog

Popis: | Oficiální Scripting Commandd Manual tvrdí, že tento příkaz vypíše zadaný typ argumentu a jeho hodnotu do výstupu debbugeru.
Syntaxe: | DebugLog player
Vrací hodnotu: | žádný
Příklad použití: | DebugLog player
Další: | Bohužel, tento příkaz jsem nemohl ověřit, neboť jsem nezjistil žádné výstupní okno nebo prostor. Po konzultaci na oficiálním OF Fóru jsem se dozvěděl, že tento příkaz vůbec nefunguje.


DeleteIdentity

Popis: | Vymaže identitu osoby ze souboru objects.sav uloženou příkazem SaveIdentity pod zadaným názvem třídy.
Syntaxe: | DeleteIdentity "název třídy"
Vrací hodnotu: | Boolean
Příklad použití: | _checkdelete = DeleteIdentity "playerIdentity"
Další: | Vyžadována verze hry 1.75 a vyšší.


DeleteStatus

Popis: | Vymaže vlastnosti objektu ze souboru objects.sav uložené příkazem SaveStatus pod zadaným názvem třídy.
Syntaxe: | DeleteStatus "název třídy"
Vrací hodnotu: | Boolean
Příklad použití: | _checkdelete = DeleteStatus "playerStatus"
Další: | Vyžadována verze hry 1.75 a vyšší.


DeleteVehicle
Popis: | Vymaže jakoukoli jednotku nebo vozidlo.
Syntaxe: | DeleteVehicle vozidlo
Vrací hodnotu: | žádnou
Příklad použití: | DeleteVehicle tank1
Další | Vymazána mohou být pouze vozidla nebo jednotky vložené v editoru misí nebo v průběhu hry příkazem CreateVehicle nebo CreateUnit . Hráč nemůže být vymazán.


Dialog
Popis: | Zjistí, zda-li je spuštěný uživatelský dialog.
Syntaxe: | Dialog
Vrací hodnotu: | Boolean (True/False)
Příklad použití: | Dialog
Poznámka: | Bližší informace o práci s dialogy najdete v tutoriálech Práce s dialogy - #1 a Práce s dialogy - #2.


Direction

Popis: | Vrácí úhel (azimut) natočení objektu. Příkaz je identický s příkazem GetDir.
Syntaxe: | Direction objekt
Vrací hodnotu: | číslo (v rozsahu 0 až 360)
Příklad použití: | _getdir = Direction voj1
Další: | Vyžadována verze hry 1.75 a vyšší.


DisableAI
Popis | Vypne části chování AI za účelem získání lepší kontroly nad jednotkou.
Syntaxe | voj1 DisableAI "Typ" Možné typy : TARGET - znemožní zadané jednotce zaměření cíle AUTOTARGET - znemožní zadané jednotce automatické vyhledávání cílů MOVE - znemožní pohyb zadané jednotky
Vrací hodnotu | žádná
Příklad použití | voj1 DisableAI "MOVE" (znemožní pohyb vojáka voj1)
Další | Ale pozor. Jakmile jednotku pomocí tohoto příkazu omezíte, není žádný způsob jak ji opět vrátit původní chování. Proto tento příkaz používejte opravdu s rozvahou a jenom tam, kde již dále nebudete potřebovat znovu obnovit chování zadané jednotky. Pokud chování zadané jednotky chcete změnit pouze dočasně použijte raději příkazy: Stop - pro zamezení pohybu vojáka SetCombatMode - pro ovládání střelby a vyhledávání nepřátel DoTarget - pro střelbu na zadaný cíl


DisableUserInput
Popis | Znemožní uživatelský vstup do hry. Toto je normálně použito v předělových scénách ke znemožnění hráčovi kontroly nad dějem.
Syntaxe | DisableUserInput disable (disable=Boolean (true nebo false))
Vrací hodnotu | žádná
Příklad použití | DisableUserInput true
Další |


Distance
Popis | Vypočítá vzdálenost mezi dvěma objekty.
Syntaxe | player Distance building
Vrací hodnotu | číslo
Příklad použití | voj1 Distance dum1
Další |


DoFire

Popis: | Jednotka spustí palbu na určený cíl.
Syntaxe: | NázevJednotky DoFire Cil NázevJednotky je název jednotky, která spustí palbu. Cil je název cílové jednotky pro palbu.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac DoFire WestVojak
Další: | Když bude příkaz použit na jednotku hráče, označí se pouze cíl čtverečkem. Na rozdíl od příkazu CommandFire nebude vydán rozkaz rádiem.


DoFollow

Popis: | Určená jednotka bude následovat jinou jednotku (velitele skupiny). Nejefektivnější použití je pro návrat jednotky do formace. Pro následování jiné jednotky než jejího velitele je nutno použít příkaz Join.
Syntaxe: | NázevJednotky DoFollow NázevVelitele NázevJednotky je název jednotky, kterou chceme vrátit do formace. NázevVelitele je název jednotky, která má být následována.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac DoFollow Leader MujHrac
Další: | Na rozdíl od CommandFollow nebude použito rádio na vydání rozkazu. Použití příkazu nemá efekt na jednotku hráče.


DoMove

Popis: | Příkaz jednotce na přesun na určenou pozici.
Syntaxe: | NázevJednotky DoMove Pozice NázevJednotky je název jednotky, pro kterou má příkaz platit. Pozice může být pole obsahujíci X,Y,Z souřadnice.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac DoMove [1000,1000] MujHrac DoMove GetPos West1
Další: | Na rozdíl od příkazu CommandMove nebude použito rádio na vydání rozkazu. Použití příkazu nemá efekt na jednotku hráče.


DoStop

Popis: | Přikáže jednotce zastavit (potichu - žádný viditelný nebo slyšitelný rozkaz nebude nikým vydán).
Syntaxe: | DoStop jednotka
Vrací hodnotu: | žádnou
Příklad použití: | DoStop voj1
Poznámka: | POZOR ! Po použití tohoto příkazu zadaná jednotka sice zastaví, ale již nikdy nebude připravena k vykonání dalšího příkazu, resp. funkce UnitReady bude již vždy vracet False.


DoTarget

Popis: | Příkaz jednotce na zacílení jiné jednotky.
Syntaxe: | NázevJednotky DoTarget Cil NázevJednotky je název jednotky, pro kterou platí příkaz. Cil je název jednotky, která má být zacílena.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac DoTarget West1
Další: | Na rozdíl od CommandTarget nebude použito rádio na vydání rozkazu. Použití příkazu nemá efekt na jednotku hráče.


DoWatch
Popis: | Příkaz jednotce k pohlédnutí na jinou jednotku nebo na zadanou pozici.
Syntaxe: | NázevJednotky DoWatch Cil nebo NázevJednotky DoWatch [x,y] nebo [x,y.z] NázevJednotky je název jednotky, pro kterou platí příkaz. Cil je název jednotky, na kterou má být pohlédnuto. [x,y.z] x=východ-západ, y=jih-sever, z=výška nad zemí
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac DoWatch Civil1 MujHrac DoWatch GetMarkerPos "Marker1"
Další: | Na rozdíl od CommandWatch nebude použito rádio na vydání rozkazu. Použití příkazu nemá efekt na jednotku hráče.


Driver
Popis | Vrácí název řidiče zadaného vozidla. Pokud vozidlo není vozidlo, ale osoba, pak vrací osobu.
Syntaxe | Driver vozidlo
Vrací hodnotu | objekt
Příklad použití | Driver vuz1
Další |


Drop
Popis:

Tento příkaz zobrazí předem definovaný grafický objekt uložený v souboru *.p3d a následně provede jeho animaci. V rámci této animace můžete objektem pohybovat, rotovat, měnit jeho velikost v určitém čase, a to v závislosti na zadaných parametrech. Tento příkaz je velmi složitý (obsahuje totiž 19 parametrů) a jeho použití si obvykle vyžaduje delší testování. Proto jsem k této nápovědě přiložil již funkční skripty použité pro zobrazení hořícího ohně na zničených nákladních vozech, což jste mohli vidět v kampani Resistance. Tyto skripty si můžete otevřít a následně uložit přímo odsud.

Syntaxe: Drop [19-ti prvkové pole parametrů]
Pole parametrů :

1. Jméno modelu přidružené obrázku (cl_fire je obrázku cl_fire.p3d zapakovaný v souboru data3D.pbo)

2. Jméno animace - nepovinny parametr, nemusí se udávat.

3. Typ animace - lze použít pouze "BILLBOARD" nebo "SPACEOBJECT" - ovlivňuje chování pohybu modelu.

4. Časová perioda - určuje dobu v sekundách, po které se zavolá skript s názvem určeným v parametru 17.

5. Doba rozpadu obrázku (modelu) - určuje dobu, po jejímž uplynuti ten obrázek proste zmizí.

6. Pozice umístění - souřadnice x, y, z, na kterých se má animace spustit. Pro určení souřadnic lze použit příkaz GetPos nebo GetWPPos (v tomto případě se ale nepoužijí hranaté závorky).

7. Směr pohybu animace - souřadnice x, y, z, které určuji kterým směrem bude ten oheň plápolat.

8. Rotace - číslo určující, kolikrát se model otočí za jednu sekundu.

9. Váha - číslo v kg, určující pomyslnou váhu toho modelu. Čím vetší tím více se bude propadat do země.

10. Objem - číslo v m3, které určuje počáteční velikost modelu.

11. Tření - číslo, které určuje pomyslný odpor vzduchu při průletu modelu atmosférou. Čím větší číslo, tím pomalejší bude pohyb animace - 0 znamená vakuum.

Parametry 12, 13 a 14 jsou průběhové parametry, což znamená, že se mění (vyvíjejí) s časem; např. u parametru 12. Velikost při použití pole [1, 2, 3] bude mít model v průběhu 1.třetiny animace velikost 1 (určena parametrem 10.), v průběhu 2.třetiny bude dvojnásobná a v průběhu 3.třetiny bude trojnásobná.

12. Velikost - viz. výše.

13. Barva modelu RGBA.

14. Animační fáze - znamená, že když se se použije např. [0,1,0] tak model se rozvíjí do poloviny času animace (určené parametrem 5) a v druhé polovině se zase ztrácí. Když použijete [1,0] tak se celou dobu animace model jenom ztrácí.

15. Perioda náhodného směru animace - doba určující jak často se má provést výpočet náhodného směru pohybu animace v rozsahu určeném parametrem 16.

16. Náhodný směr pohybu animace - číslo, které určuje náhodný rozptyl souřadnic popsaných parametrem 7. (tohle vlastně dělá to plápoláni), náhoda je kalkulována v rozmezí 0 až to číslo.

17. Jméno scriptu, který se spustí vždy po uplynuti doby stanovené parametrem 4. - nepovinny parametr.

18. Jméno scriptu, který se spustí vždy těsně před zmizením nebo lepe řečeno ukončením každého cyklu animace (ten cyklus myslím v případe ze je Drop použít ve smyčce).

19. Jméno objektu, ke kterému má byt animace přichycena - bohužel tohle mi proste nefunguje. Pokud ten plamen budete chtít použit na pohybujícím se objektu, doporučuji použit do parametru 6. příkaz GetPos nebo Position a ne fixní souřadnice (musí to byt do scriptu, nikoli do volání scriptu, protože volací parametry příkazu Exec se do smyčky dostanou jen jednou a necyklí se - jednoduše řečeno ten oheň by vám jinak zůstal na miste).

Vrací hodnotu: žádnou
Příklad použití: Drop [parametry]
Další: Vyžadována verze hry 1.75.


EnableEndDialog

Popis: | Po té co je hráč zabit a mise obsahuje soubor scriptu s názvem "OnPlayerKilled.sqs" se při použití tohoto příkazu zobrazí v horní části obrazovky červený nápis "Byl jsi zabit" a v dolní části tlačítka "Znova" a "Ukončit".
Syntaxe: | EnableEndDialog
Vrací hodnotu: | žádná
Příklad použití: | EnableEndDialog
Další | POZOR !!! Pokud se tento příkaz nepoužije a přesto existuje v adresáři mise skript "onPlayerKilled.sqs" neobsahující příkaz ForceEnd, hru nelze ukončit jinak, než restartem počítače nebo násilným exitem hry prostřednictvím správce úloh (Windows).


EnableRadio
Popis | Zobrazí nebo skryje vysílačku.
Syntaxe | EnableRadio enable (enable=Boolean (true nebo false))
Vrací hodnotu | žádná
Příklad použití | EnableRadio true
Další |


EstimatedTimeLeft

Popis: | Pouze pro MP. Slouží k nastavení času zbývajícího do ukončení mise. Tato hodnota se zobrazí v okně "Game In Progress" nebo hlavním okně mise nebo při stisknutí klávesy "P" nebo "H". Standardní hodnota této funkce je dána hodnotou "Param1" v description.ext. Pokud však není zadána je nutné tomuto příkazu přiřadit číselnou hodnotu (v sekundách) a umístit ho do init.sqs. Tento příkaz lze samozřejmě umístit i do jiných scriptů nebo do spínačů do pole PŘI AKTIVACI a tak určovat čas do konce mise v závislosti na průběhu hry (např. dosažení WP, zabití určitého poču nepřátel, splnění určitého úkolu apod.)
Syntaxe: | EstimatedTimeLeft Param1 - pokud je Param1 definován v description.ext EstimatedTimeLeft číslo - ve scriptu
Vrací hodnotu: | žádnou
Příklad použití: | EstimatedTimeLeft 1800 - do konce mise zbývá 30 minut
Další: | Vyžadována verze hry 1.34.


Exec
Popis | Vykoná skript. Argument je předán skriptu jako lokální proměnná _this.Skript je nejdříve vyhledáván v adresáři mise, poté ve skriptovém podadresáři kampaně a nakonec v globálním skriptovém adresáři.
Syntaxe | [seznam argumentů] Exec "název scriptu *.sqs"
Vrací hodnotu | žádná
Příklad použití | [1400, jeep1, "skup1"] Exec "myscript.sqs"
Další |


Exit
Popis | Vyskočí ze skriptu, čímž ho ukončí.
Syntaxe | Exit
Vrací hodnotu | žádná
Příklad použití | Exit
Další |


FadeMusic
Popis | Hladká změna hlasitosti hudby. Trvání změny je dáno zadaným časem, cílová úroveň hlasitosti je dána zadanou hodnotou hlasitosti.
Syntaxe | čas FadeMusic hlasitost
Vrací hodnotu | žádná
Příklad použití | 5 FadeMusic 0
Další | První argument (5) je doba v sekundách určující délku změny hlasitosti na úroveň stanovenou argumentem za příkazem (0).


FadeSound
Popis | Hladká změna hlasitosti všech zvuků. Trvání změny je dáno zadaným časem, cílová úroveň hlasitosti je dána zadanou hodnotou hlasitosti. Přednastavenou úrovní hlasitosti zvuků je 1.0.
Syntaxe | čas FadeSound hlasitost
Vrací hodnotu | žádná
Příklad použití | 5 FadeSound 0.1
Další | První argument (5) je doba v sekundách určující délku změny hlasitosti na úroveň stanovenou argumentem za příkazem (0).


True/False
Popis: Booleova hodnota logického stavu. True / False = Pravda / Nepravda.
Syntaxe: True nebo False
Vrací hodnotu: žádnou
Příklad použití: _myVariable = True
Poznámka: Pokud je tato hodnota vrácena funkcí, její význam odpovídá výsledku vykonané funkce, např. pokud funkce

UnitReady voj1 vrátí True pak to znamená že jednotka voj1 je připravena vykonat další příkaz, přičemž předchozí příkaz byl úspěšně dokončen.

Pokud je tato hodnota přiřazena proměnné, pak to znamená, že daná proměnná již byla inicializována a její význam lze přirovnat k vypínači, např :

_myVariable = False -> vypnuto

_myVariable = True -> zapnuto

(Pozn. každá proměnná je inicializována hodnotou False)

Pokud je tato hodnota očekávána jako výsledek jakéhokoli výrazu, pak :

- jeli výsledek levé strany výrazu shodný s výsledkem pravé strany výrazu, Booleova hodnota celého výrazu je True. Např.:

(2 + 2) == (100 - 96) hodnota je True

- jeli výsledek levé strany výrazu odlišný od výsledku pravé strany výrazu, Booleova hodnota celého výrazu je False. Např.:

(2 + 2) == (100 - 95) hodnota je False

Při vyhodnocování výrazů podmínek nelze použít srovnávací znaménka tam, kde výraz má jen jednu stranu, např.:

? UnitReady voj1 == False: ... vyvolá chybu,

místo toho musíte použít

? Not UnitReady voj1: ....


FillWeaponsFromPool

Popis: | V závislosti na typu zbraní, které zadaná osoba má, jí tento příkaz přidá zásobníky z prostoru munice-magazines souboru weapons.cfg aktuální kampaně.
Syntaxe: | FillWeaponsFromPool osoba
Vrací hodnotu: | žádnou
Příklad použití: | FillWeaponsFromPool voj1
Další: | Tento příkaz se používá tam, kde např. určitý voják v předchozí misi kampaně vystřílel svoji munici, následně pak na konci této mise byl uložen jeho status příkazem SaveStatus a v následující misi potřebujeme, aby tento voják měl opět munici doplněnou. Munice se ovšem doplní jen za předpokladu, že do prostoru munice souboru weapons.cfg byl patřičný typ munice přidán příkazem AddMagazinePool nebo PickWeaponPool.


Fire

Popis: | Jednotka spustí palbu ze zadané zbraně.
Syntaxe: | NázevJednotky Fire "název zbraně" NázevJednotky - je název jednotky, která spustí palbu. Název zbraně - je název zbraně použité pro palbu. nebo NázevJednotky Fire ["Akce", "Mód", "Magazine"] NázevJednotky - je název jednotky, která spustí palbu. Akce - je PUT pro položení, THROW pro hození Mód - určení módu -> shodné s argumentem MAGAZINE Magazine - munice, která bude použita (nepovinný argument)
Vrací hodnotu: | žádnou
Příklad použití: | voj1 Fire "LAWLauncher" voj1 Fire ["Put", "PipeBomb"] - voják položí nálož
Další: | Zde si můžete prohlédnout seznam zbraní a munice. Tento příkaz lze velmi dobře kombinovat s příkazem DoFire, kdy budete chtít, aby zadaný voják střílek na určený cíl zadanou zbraní, např.: voj1 Fire "LAWLauncher" voj1 DoFire bvp1


Flag
Popis | Pokud má jednotka nějakou vlajku, pak vrací název vlajky. Pokud ne, je vrácen objNull.
Syntaxe | Flag jednotka
Vrací hodnotu | objekt
Příklad použití | Flag voj1
Další |


FlagOwner
Popis | Pokud je tento příkaz použit na vlajku, potom vrací název osoby, která vlajku nese. Pokud je použit na cokoli jiného, je vrácen objNull.
Syntaxe | FlagOwner vlajka
Vrací hodnotu | objekt
Příklad použití | FlagOwner flag1
Další |


Fleeing
Popis | Zkontroluje zda-li zadaná jednotka právě ustupuje (prchá). Mrtvé nebo prázdné jednotky vrací false.
Syntaxe | Fleeing jednotka
Vrací hodnotu | Boolean (true nebo false)
Příklad použití | Fleeing voj1
Další |


FlyInHeight

Popis: | Nastavuje výšku, ve které se pohybují helikoptéry při přesunu
Syntaxe: | NázevJednotky FlyInHeight Hodnota NázevJednotky je název jednotky, pro kterou hodnotu nastavujeme Hodnota určuje výšku nad zemí v metrech
Vrací hodnotu: | žádnou
Příklad použití: | Vrtulnik FlyInHeight 80
Další: | Příkaz má patrně vliv pouze na vrtulníky. Hodnota 0 nezpůsobí přistání, k tomu slouží příkaz Land.


ForceEnd
Popis | Způsobí ukončení mise.
Syntaxe | ForceEnd
Vrací hodnotu | žádná
Příklad použití | ForceEnd
Další | Ukončí pouze misi nikoli Intro nebo Outro.


ForceMap
Popis | Způsobí zobrazení mapy.
Syntaxe | ForceMap Boolean
Vrací hodnotu | žádný
Příklad použití | ForceMap True (mapa se ihned zobrazí)
Další | Je vyžadována verze 1.27 a vyšší. Pokud je tento příkaz použit v INTRO nějaké mise, která je začleněna do kampaně, pak nefunguje.


ForEach
Popis | Vykoná zadaný příkaz pro každý element v zadaném poli. Je to provedeno následovně : každému elementu pole přiřadí název _x a následně vykoná příkaz.
Syntaxe | "_x Příkaz argument" ForEach [pole proměnných]
Vrací hodnotu | žádná
Příklad použití | "_x setdamage 1" ForEach Units Group Player
Další | Chcete-li provést příkaz jehož argumentem nebo parametrem je řetězec, musíte je umístit do dvojitých uvozovek, např. takto : "voj1 SetCombatMode ""BLUE""" ForEach [voj1, vrt1, tank1]


Format
Popis | Dosadí na určené místo v řetězci prvního prvku pole proměnných hodnotu jiného prvku téhož pole. První prvek pole je formátovací řetězec. Formátovací Řetězec může obsahovat jakýkoli text + číslo a znak "%" na jehož pozici se dosadí hodnota jiného prvku stejného pole se stejným pořadovým číslem v tomto poli. Formátovací řetězec má pořadové číslo 0 (stejné jako v jakémkoli jiném poli proměnných). Každý x% je přepsán odpovídajícím prvkem pole s pořadovým číslem x. x% se může objevit v řetězci v jakémkoli pořadí a jakémkoli počtu.
Syntaxe | Format ["Formátovací řetězec", ostatní prvky pole oddělené čárkami]
Vrací hodnotu | řetězec
Příklad použití | Format ["%1 - %2 - %1", 555, "text"], výsledkem je "555 - text - 555"
Další |


Formation

Popis: | Vrátí název formace zadané skupiny.
Syntaxe: | Formation skupina
Vrací hodnotu: | řetězec
Příklad použití: | _form = Formation Group Player
Další: | Tato funkce může vrátit pouze následující názvy : "COLUMN" - kolona "STAG COLUMN" - dvojitá kolona "WEDGE" - klín "ECH LEFT" - sled vlevo "ECH RIGHT" - sled vpravo "VEE" - véčko "LINE" - rojnice


FormLeader

Popis: | Vrátí název jednotky aktuálně na pozici vedoucího formace.
Syntaxe: | FormLeader jednotka
Vrací hodnotu: | objekt
Příklad použití: | ? FormLeader Player != Leader Player : Player DoFollow FormLeader Player
Další: | Většinou je tento vedoucí shodný s velitelem skupiny, ale ne vždy.


GetDammage
Popis | Vrátí hodnotu poškození objektu v rozsahu od 0 do 1.
Syntaxe | GetDammage objekt
Vrací hodnotu | číslo
Příklad použití | GetDammage tank1
Další | POZOR !!!!! SetDammage je narozdíl od anglického slova damage (poškození) psáno s dvěmi "m". Tato chyba je od verze 1.75 opravena implementací nového příkazu Damage, který je s tímto příkazem identický.


GetDir
Popis | Vrátí hodnotu natočení jednotky (azimut) v rozsahu od 0 do 360.
Syntaxe | GetDir jednotka
Vrací hodnotu | číslo
Příklad použití | GetDir voj1
Další | Od verze 1.75 lze též použít nově implementovaný příkaz Direction,který je identický.


GetMarkerColor
Popis | Vrátí barvu značky. (viz. SetMarkerColor)
Syntaxe | GetMarkerColor "znacka"
Vrací hodnotu | řetězec
Příklad použití | GetMarkerColor "znacka1"
Další |


GetMarkerPos
Popis | Vrátí pozici značky [x,y,z]. (viz. SetMarkerPos)
Syntaxe | GetMarkerPos "znacka"
Vrací hodnotu | pole
Příklad použití | GetMarkerPos "znacka1"
Další |


GetMarkerSize
Popis | Vrátí velikost značky. (viz. SetMarkerSize)
Syntaxe | GetMarkerSize "značka"
Vrací hodnotu | pole
Příklad použití | GetMarkerSize "znacka1"
Další | Je vyžadována verze 1.21 a vyšší.


GetMarkerType
Popis | Vrací typ značky. (viz SetMarkerType)
Syntaxe | GetMarkerType "značka"
Vrací hodnotu | řetězec
Příklad použití | GetMarkerType "znacka1"
Další | Je vyžadována verze 1.21 a vyšší.


GetPos
Popis | Vrátí pozici zadaného objektu ve formátu [x,y] nebo [x,y,z]
Syntaxe | GetPos objekt
Vrací hodnotu | pole [x,y] nebo [x,y,z] x = východ-západ, y = jih-sever, z = výška nad zemí.
Příklad použití | GetPos Object 169457 GetPos voj1
Další | Od verze 1.75 lze též použít nově implementovaný příkaz Position, který je identický.


GetWPPos
Popis | Vrátí pozici bodu trasy (waypointu) ve formátu [x,y].
Syntaxe | GetWPPos [skupina, pořadové číslo bodu trasy]
Vrací hodnotu

pole

[x,y] x = východ-západ, y = jih-sever.

Příklad použití | GetWPPos P layer
Další

Je vyžadována verze 1.21 a vyšší.

Mějte na paměti, že v Editoru misí má první Waypoint pořadové číslo 0, avšak pro použití v tomto příkazu má první Waypoint pořadové číslo 1.

Od verze hry 1.75 lze použít nově implementovaný příkaz WaypointPosition, který je identický.


GlobalChat
Popis | Napíše text do veřejného radiového kanálu.
Syntaxe | jednotka GlobalChat "Text"
Vrací hodnotu | žádná
Příklad použití | voj1 GlobalChat "Zobraz tento text" - barva textu BÍLÁ
Další |


GlobalRadio
Popis | Pošle zprávu do veřejného radiového kanálu. Zpráva je definována v souboru description.ext.
Syntaxe | jednotka GlobalRadio "Zpráva"
Vrací hodnotu | žádná
Příklad použití | voj1 GlobalRadio "zprava1" - barva textu ČERNÁ
Další |


GoTo
Popis | Použitelné pouze ve skriptu - interní skok na určené místo skriptu.
Syntaxe | GoTo "label"
Vrací hodnotu | žádná
Příklad použití | GoTo "MojeProcedura"
Další | label = je vždy řetězcový argument a musí být vždy uzavřen v uvozovkách.


Group
Popis | Vrací název skupiny, ke které je daná jednotka přiřazena. Jeli jednotka mrtvá, vrátí se hodnota GrpNull.
Syntaxe | Group jednotka
Vrací hodnotu | skupina
Příklad použití | Group Player
Další |


GroupChat
Popis | Vypíše zadaný text na radiovém kanálu skupiny.
Syntaxe | jednotka GroupChat "Text"
Vrací hodnotu | žádná
Příklad použití | voj1 GroupChat "Zobraz tento text" - barva textu ZELENÁ
Další |


GroupRadio
Popis | Pošle zprávu na radiový kanál skupiny. Zpráva je nadefinována v souboru description.ext.
Syntaxe | jednotka GroupRadio "zprava"
Vrací hodnotu | žádná
Příklad použití | voj1 GroupRadio "zprava1" - barva textu ZELENÁ
Další |


GrpNull
Popis | Neexistující skupina. Tato hodnota se nerovná ničemu, ani sama sobě.
Syntaxe | GrpNull
Vrací hodnotu | skupina
Příklad použití | [voj1] Join GrpNull
Další |


Gunner
Popis | Vrátí název střelce vozidla. Když vozidlo není vozidlem, ale osobou, pak se vrátí název osoby.
Syntaxe | Gunner vozidlo
Vrací hodnotu | objekt
Příklad použití | Gunner voz1
Další |


HandsHit
Popis | Zkontroluje, zda-li je trefena vojákova ruka (při nepřesné střelbě)
Syntaxe | HandsHit jednotka
Vrací hodnotu | číslo
Příklad použití | HandsHit leader player
Další |


HasWeapon
Popis | Zkontroluje, zda-li má jednotka danou zbraň.
Syntaxe | jednotka HasWeapon "Typ zbraně"
Vrací hodnotu | Boolean (true nebo false)
Příklad použití | hrac HasWeapon "M16"
Další |


Hint
Popis | Vypíše text pokynu pro hráče (nikoli rozkaz ani žádný herní text - pouze pokyn od autora mise hráči). Text může obsahovat několik řádek, přičemž \n je použito k indikaci konce řádku a přechodu na nový.
Syntaxe | Hint "Text"
Vrací hodnotu | žádná
Příklad použití | Hint "Stiskni W pro pohyb kupředu"
Další |


HintC
Popis | Vypíše text pokynu pro hráče (nikoli rozkaz ani žádný herní text - pouze pokyn od autora mise hráči). Text může obsahovat několik řádek, přičemž \n je použito k indikaci konce řádku.
Syntaxe | HintC "Text"
Vrací hodnotu | žádná
Příklad použití | HintC "Stiskni W pro pohyb kupředu"
Další | Pozor !!! Narozdíl od příkazu Hint , HintC musí být potvrzen stiskem Zvýrazněného aktivního textu "Pokračovat".


HintCadet
Popis | Vypíše text pokynu pro hráče avšak pouze v kadet módu (nikoli rozkaz ani žádný herní text - pouze pokyn od autora mise hráči). Text může obsahovat několik řádek, přičemž \n je použito k indikaci konce řádku.
Syntaxe | HintCadet "Text"
Vrací hodnotu | žádná
Příklad použití | HintCadet "Stiskni W pro pohyb kupředu"
Další |


If...Then...Else
Popis: | Vyhodnotí podmínku a podle zjištěné hodnoty vykoná zadanou sadu příkazů. Pokud podmínka vrátí hodnotu True vykoná se sada příkazu za slovem Then, pokud podmínka vrátí hodnotu False vykoná se sada příkazu za slovem Else.
Syntaxe: | If (podminka) Then {sada_prikazu_TRUE} Else {sada_prikazu_FALSE}
Vrací hodnotu: | jakoukoli
Příklad použití: | If (a <= b) Then {a = a + 1} Else {a = a -1}
Poznámka: | Bližší popis této strukturované podmínky naleznete v tutoriálu Podmínky. Použijete-li pouze If...Then proces je stejný jako u jednoduché podmínky ?... :


In
Popis | 1) Zkontroluje, zda-li je voják uvnitř vozidla. 2) Zkontroluje, zda-li se x rovná některému z elementů pole.
Syntaxe | 1) jednotka In vozidlo 2) x In [pole proměnných]
Vrací hodnotu | Boolean (true nebo false)
Příklad použití | 1) hrac In jeep1 2) 1 In [1,2,3] - výsledkem je True 4 In [1,2,3] - výsledkem je False
Další |


InFlame
Popis: | Příkaz sloužící k zapálení nebo uhašení ohně.
Syntaxe: | NázevObjektu InFlame Boolean NázevObjektu je název objektu, který má hořet TRUE - spustí hoření objektu FALSE - zastaví hoření objektu
Vrací hodnotu: | žádnou
Příklad použití: | this InFlame true (při inicializaci objektu) Ohen InFlame false
Další: | Používá se hlavně pro zapálení ohňů v táborech, z hlediska reality je dobré v případě napadení táboru zajistit uhašení ohňů.


IsNull
Popis | Zkontroluje, zda-li je hodnota rovna GrpNull nebo ObjNull.
Syntaxe | IsNull skupina IsNull jednotka
Vrací hodnotu | Boolean (true nebo false)
Příklad použití | IsNull Group Player IsNull voj1
Další | a == GrpNull nefunguje, neboť GrpNull se nerovná ničemu, ani samo sobě.


Join
Popis | Připojí všechny jednotky v poli k zadané skupině.
Syntaxe | [seznam jednotek] Join skupina
Vrací hodnotu | žádná
Příklad použití | [unit1, unit2] Join Group Player [voj1] Join GrpNull - odpojí vojáka od skupiny
Další | Maximální počet členů skupiny nesmí být vyšší než 12. Tato funkce může být použita pouze SinglePlayer misi.


KnowsAbout
Popis | Zkontroluje zda-li jednotka ví o daném cíli. Pokud je jednotka vozidlo, je myšlen velitel tohoto vozidla.
Syntaxe | voj KnowsAbout cíl voj - vojak, u kterého se zjišťujete zda-li ví o cíli.
Vrací hodnotu | číslo v rozmezí 0 - 4
Příklad použití | voj1 KnowsAbout jeep1
Další | vrácené číslo znamená: 0 - voják o cíli neví 4 - voják cíl jasně vidí a míří na něj


Land

Popis: | Používá se u vrtulníků pro automatické přistání
Syntaxe: | NázevJednotky Land "Přistávacírežim" NázevJednotky je název jednotky (vrtulníku), který má přistát
Vrací hodnotu: | žádná
Příklad použití: | Vrtulnik Land "LAND"
Další: | Přistávacírežim může být následující : LAND - vrtulník zcela přistane a vypne motor GET IN - vrtulník se pomalu vznáší v malé výšce tak, aby mohli nastoupit vojáci GET OUT - vrtulník se vznáší v malé výšce tak, aby mohli vojáci vystoupit


LbAdd

Popis: | Přidá jednu položku do listboxu (rozbalovací nabídky) aktuálně spuštěného dialogu se zadaným IDC.
Syntaxe: | LbAdd [IDX, "Text"]
Vrací hodnotu: | indexové číslo přidané položky
Příklad použití: | _line1 = LbAdd [1001, "Zavolat velitelství"]
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy.


LbClear

Popis: | Vymaže všechny položky z listboxu se zadaným IDC aktuálně spuštěného dialogu. Položky se do listboxu přidávají příkazem LbAdd.
Syntaxe: | LbClear IDC
Vrací hodnotu: | žádnou
Příklad použití: | LbClear 1001
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy.


LbColor

Popis: | Vrátí barevnou RGBA hodnotu zadané položky listoboxu nebo comboboxu se zadaným IDC aktuálně spuštěného dialogu.
Syntaxe: | LbColor [IDC, indexové číslo položky]
Vrací hodnotu: | číselné pole RGBA R - intenzita červené barvy G - intenzita zelené barvy B - intenzita modré barvy A - průhlednost všechny hodnoty jsou čísla v intervalu od 0 do 1
Příklad použití: | _getitemcolor = LbColor [1001, 2]
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy.


LbCurSel

Popis: | Vrátí indexové číslo právě zvolené položky listboxu nebo comboboxu se zadaným IDC aktuálně spuštěného dialogu. Položka je vybrána kliknutím myší na určitou položku.
Syntaxe: | LbCurSel IDC
Vrací hodnotu: | číslo
Příklad použití: | _selecteditem = LbCurSel 1001
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy.


LbData

Popis: | Vrátí dodatečný (neviditelný) text právě zvolené položky se zadaným indexovým číslem v listboxu nebo comboboxu se zadaným IDC aktuálně spuštěného dialogu. Dodatečný text se k položce přiřadí příkazem LbSetData.
Syntaxe: | LbData [IDC, indexové číslo polžky]
Vrací hodnotu: | text
Příklad použití: | _getdata = LbData [1001, 2]
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy.


LbDelete

Popis: | Vymaže položku se zadaným indexovým číslem z listboxu nebo comboboxu se zadaným IDC aktuálně spuštěného dialogu.
Syntaxe: | LbDelete [IDC, indexové číslo položky]
Vrací hodnotu: | žádnou
Příklad použití: | LbDelete [1001, 2]
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy.


LbPicture

Popis: | Vrátí název obrázku v položce se zadaným indexovým číslem listboxu nebo comboboxu se zadaným IDC aktuálně spuštěného dialogu. Obrázek se do polžky vkládá příkazem LbSetPicture. Jméno obrázku je text přiřazený vlastnosti "name" třídy obrázku definované souborem description.ext v sekci pro aktuálně spuštěný dialog (Pozor ! Nejedná se o název souboru s obrázkem).
Syntaxe: | LbPicture [IDC, indexové číslo položky]
Vrací hodnotu: | řetězec (hodnota vlastnosti "name")
Příklad použití: | _getpicture = LbPicture [1001, 2]
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy.


LbSetColor

Popis: | Nastaví barvu položky se zadaným idexovým číslem v listoboxu nebo editboxu se zadaným IDC aktuálně spuštěného dialogu.
Syntaxe: | LbSetColor [IDC, indexové číslo položky, [R,G,B,A]] R - intenzita červené barvy G - intenzita zelené barvy B - intenzita modré barvy A - průhlednost všechny hodnoty RGBA jsou čísla v intervalu od 0 do 1
Vrací hodnotu: | žádnou
Příklad použití: | LbSetColor [1001, 2, [1.0, 1.0, 0.0, 1.0]] - barva textu položky bude žlutá.
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy.


LbSetCurSel

Popis: | Vybere položku se zadaným inexovým číslem v listboxu nebo comboboxu se zadaným IDC v aktuálně spuštěném dialogu.
Syntaxe: | LbSetCurSel [IDC, indexové číslo položky]
Vrací hodnotu: | žádnou
Příklad použití: | LbSetCurSel [1001, 2]
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy.


LbSetData

Popis: | Přiřadí dodatečný (neviditelný) text položce se zadaným indexovým číslem v listboxu nebo comboboxu se zadaným IDC aktuálně spuštěného dialogu.
Syntaxe: | LbSetData [IDC, indexové číslo položky, "Text"]
Vrací hodnotu: | žádnou
Příklad použití: | LbSetData [1001, 2, "Třetí položka"]
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy.


LbSetPicture

Popis: | Nastaví obrázek v položce se zadaným indexovým číslem v listboxu nebo editboxu se zadaným IDC aktuálně spuštěného dialogu. Jméno obrázku je text přiřazený vlastnosti "name" třídy obrázku definované souborem description.ext v sekci pro aktuálně spuštěný dialog (Pozor ! Nejedná se o název souboru s obrázkem). Toto jméno se hledá na cestě v pořadí : adresář mise, podadresář dtaExt adresáře kampaně, adresář dtaExt hry a souboru data.pbo.
Syntaxe: | LbSetPicture [IDC, indexové číslo položky, "jméno obrazku"]
Vrací hodnotu: | žádnou
Příklad použití: | LbSetPicture [1001, 2, "RuprtLogo"]
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy.


LbSetValue

Popis: | Přiřadí dodatečnou (neviditelnou) číselnou hodnotu položce se zadaným indexovým číslem v listboxu nebo comboboxu se zadaným IDC aktuálně spuštěného dialogu.
Syntaxe: | LbSetData [IDC, indexové číslo položky, číslo]
Vrací hodnotu: | žádnou
Příklad použití: | LbSetData [1001, 2, (Position Player Select 0)]
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy.


LbSize

Popis: | Vrátí počet položek v listboxu nebo comboboxu se zadaným IDC aktuálně spuštěného dialogu.
Syntaxe: | LbSize IDC
Vrací hodnotu: | číslo
Příklad použití: | _numofitems = LbSize 1001
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy.


LbText

Popis: | Vrátí text právě zvolené položky se zadaným indexovým číslem v listboxu nebo comboboxu se zadaným IDC aktuálně spuštěného dialogu. Text se k položce přiřadí při přidávání položky do listboxu nebo comboboxu příkazem LbAdd.
Syntaxe: | LbText [IDC, indexové číslo položky]
Vrací hodnotu: | řetězec
Příklad použití: | _getitem = LbText [1001, 2]
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy.


LbValue

Popis: | Vrátí dodatečnou číslenou (neviditelnou) hodnotu právě zvolené položky se zadaným indexovým číslem v listboxu nebo comboboxu se zadaným IDC aktuálně spuštěného dialogu. Dodatečná číslená hodnota se položce přiřadí příkazem LbSetValue.
Syntaxe: | LbValue [IDC, indexové číslo polžky]
Vrací hodnotu: | číslo
Příklad použití: | _getitemvalue = LbValue [1001, 2]
Další: | Bližší popis tohoto příkazu najdete v tutorialu o Práci s dialogy.


Leader
Popis | Vrací jméno vedoucího skupiny dané jednotky. Jestliže je velitel mrtev, vrátí ObjNull.
Syntaxe | Leader jednotka
Vrací hodnotu | objekt
Příklad použití | Leader Player
Další | Obvykle jsou Leader a velitel ( Commander ) jedna a tatáž, ale ne vždy.


LeaveVehicle
Popis | Znemožní používání vozidla skupině zadané jednotky.Všechny jednotky v této skupině, které byly přiřazeny k tomuto vozidlu již nadále přiřazeny nejsou.
Syntaxe | jednotka LeaveVehicle vozidlo
Vrací hodnotu | žádná
Příklad použití | voj1 LeaveVehicle jeep1
Další |


LightIsOn
Popis | Zkontroluje zda-li jsou zadaná pouliční světla rozsvícena.
Syntaxe | LightIsOn objekt
Vrací hodnotu | řetězec
Příklad použití | _checklights = LightIsOn NearestObject [player,"StreeLamp"]
Další | Možné typy : ON OFF AUTO - světla svítí během noci


List
Popis

Seznam jednotek, které by mohly aktivovat spínač. Pro spínač typu "NEPŘÍTOMEN" seznam funguje, jako by spínač byl nastaven na "PŘÍTOMEN"(vrácený seznam vždy obsahuje pouze jednotky, které mohou spínač aktivovat).

Syntaxe | List spinac
Vrací hodnotu | pole
Příklad použití | _trigUnits = List spinac
Další UPOZORNĚNÍ:

V předchozích verzích nápovědy jsem psal, že si nejsem jist zda-li to byla chyba nebo záměr BIStudia, když hodnotu vrácenou touto funkcí uložíte do proměnné (tak jak je uvedeno v příkladu) pak tato proměnná uchovává pouze odkaz do spínače, tzn. že hodnotu nabývá odkazem na funkci List a nikoli vrácenou hodnotou, resp. hodnota použité proměnné se vyvíjí identicky s okamžitým stavem jí přiřazené funkce List svázané s konkrétním spínačem. Jinými slovy; dle uvedeného příkladu proměnná _trigUnits může obsahovat různé hodnoty v průběhu hry, a to nezávisle na tom zda-li s ní budete jakkoli manipulovat a závisle na okamžitém stavu spínače "spinac", což Vám v případě, že se v oblasti spinače změní jednotky které ho mohou aktivovat, proměnná _trigUnits bude vždy odrážet tento aktuální stav. Toto tak může (pokud s tím autor dopředu nepočítá) být značně matoucí a může to způsobovat chyby scriptu.

Dnes již vím, že to byl záměr BIStudia, který má své opodstatnění a v mnoha případech toto chování funkce List oceníte. Pokud ale přece jenom chcete do proměnné uložit seznam jednotek, které mohou aktivovat spínač a přitom nechcete aby se tento seznam kdykoli změnil, řešení je prosté a platí pro všechny typy polí. Musíte vytvořit kopii pole (v našem případě vráceného funkcí List) a to pouhým použitím znaménka "+" před funkcí. Jinými slovy neměnné pole jednotek aktivujících spínač získáte takto :

_trigUnits = +(List spinac)

Poznámka:

Ekvivalentem této funkce je funkce ThisList, která ale může být použita pouze a výhradně v poli "Při Aktivaci" konkrétního spínače a nelze ji tak používat v souborech scriptů. Funkce ThisList pak nemá žádný parametr. Zde je příklad jejího použití :

gTrigUnits = ThisList


LoadFile
Popis: | Vrátí obsah souboru *.SQF.
Syntaxe: | LoadFile "nazev_souboru_sqf"
Vrací hodnotu: | řetězec
Příklad použití: | LoadFile "myfile.sqf" - výsledkem je celý text souboru myfile.sqf
Poznámka: | Tato funkce je velmi podobná funkcím nebo directivám běžných programovacích a scriptovacích jazyků jako jsou C++, HTML apod. POZOR !!! Vzhledem k tomu, že tato funkce pouze vrací obsah souboru (řetězec) a tento obsah není při zpracování této funkce zpracováván, soubor musí mít příponu *.SQF. Vrácený kód je pak následně proveden a zpracován souborem *.SQS, který soubor *.SQF touto funkcí zavolal. Ukázku použití souborů *.SQF si můžete prohlédnou v tutoriálu o podmínkách. Související témata : PreprocessFile, Call


LoadIdentity

Popis: | Načte identitu zadané osoby ze třídy souboru objects.sav uloženého z předchozí mise kampaně příkazem SaveIdentity.
Syntaxe: | osoba LoadIdentity "název třídy"
Vrací hodnotu: | Boolean
Příklad použití: | _checkload = Player LoadIdentity "playerIdentity"
Další: | Tento příkaz se umísťuje do souboru init.sqs mise. Vyžadována verze hry 1.75 a vyšší.


LoadStatus

Popis: | Načte vlastnosti zadaného objektu ze třídy souboru objects.sav uloženého z předchozí mise kampaně příkazem SaveStatus.
Syntaxe: | objekt LoadStatus "název třídy"
Vrací hodnotu: | Boolean
Příklad použití: | _checkload = Player LoadStatus "playerStatus"
Další: | Tento příkaz se umísťuje do souboru init.sqs mise. Vyžadována verze hry 1.75 a vyšší.


Local
Popis | Pouze pro MP mise. Zkontroluje zda-li je zadaná jednotka pouze lokální na tom počítači, kde je tento příkaz spuštěn.
Syntaxe | Local jednotka
Vrací hodnotu | Boolean (true nebo false)
Příklad použití | Local voj1
Další | Tato funkce se obvykle používá tam, kde je nutné spustit některé aktivační pole nebo skript pouze na jednom počítači a nikoli na všech zúčastněných v MP misi. U SP misí jsou vždy všechny objekty lokální. Všechny statické objekty jsou vždy a všude lokální.


Localize
Popis | Přepíše zadaný název řetězce textem korespondujícím s lokalizovaným textem v souboru stringtable.csv.
Syntaxe | Localize "Název řetězce"
Vrací hodnotu | řetězec
Příklad použití | Localize "STR_DN_FROG"
Další | Upozornění : Až do update verze 1.96CZ se při instalaci korektně uložilo nastavení o jazykovém prostředí operačního systému. Verze 1.96CZ však má zjevně chybu a ne vždy tuto jazykovou mutaci OS zcela přesně určí, což může způsobit, že v konfiguračním souboru Flashpoint.cfg v adresáři hry nastaví vlastnost "Language" na "English". Pokud se Vám to stane, pak se budou ze "stringtablů" při použití funkce Localize načítat chybné nebo dokonce žádné texty. Toto nesprávné chování jednoduše napravíte tím, že přepíšete hodnotu jmenované vlastnosti v souboru Flashpoint.cfg na "Czech".


Lock
Popis | Uzamkne vozidlo (znemožní hráči vstup/výstup)
Syntaxe | vozidlo Lock Boolean
Vrací hodnotu | žádná
Příklad použití | jeep Lock True
Další |


Locked
Popis | Zjistí zda-li je vozidlo pro hráče uzamčeno. Je-li uzamčeno, hráč nemůže bez přímého rozkazu nastoupit ani vystoupit.
Syntaxe | Locked jeep1
Vrací hodnotu | Boolean (true nebo false)
Příklad použití | Locked jeep1
Další | Vozidlo se odemyká/zamyká příkazem Lock.


LockWP
Popis | Vypne přepnutí na další bod trasy (aktuální bod trasy nebude při použití tohoto příkazu nikdy dokončen).
Syntaxe | skup1 LockWP Boolean
Vrací hodnotu | žádná
Příklad použití | skup1 LockWP True
Další | Někdy se používá v předělových scénách.


Magazines

Popis: | Vrací pole s názvy zásobníků, které daná jednotka právě má.
Syntaxe: | Magazines jednotka
Vrací hodnotu: | pole proměnných
Příklad použití: | Magazines voj1
Další: | Vyžadována verze hry 1.75.


MapAnimAdd
Popis | Přidá další mapovou animaci, tzn. pohne mapou a zaměří se na danou pozici.
Syntaxe | mapAnimAdd [doba v sekundách, zoom, souřadnice]
Vrací hodnotu | žádná
Příklad použití | mapAnimAdd [1, 0.1, getMarkerPos "anim1"]
Další | Vyžaduje verzi 1.27 a vyšší.


MapAnimClear
Popis | Zruší mapovou animaci
Syntaxe | mapAnimClear
Vrací hodnotu | žádná
Příklad použití | mapAnimClear
Další | Vyžaduje verzi 1.27 a vyšší.


MapAnimCommit
Popis | Přehraje mapovou animaci.
Syntaxe | mapAnimCommit
Vrací hodnotu | žádná
Příklad použití | mapAnimCommit
Další | Vyžaduje verzi 1.27 a vyšší.


MapAnimDone
Popis | Zkontroluje, zda-li je mapová animace ukončena.
Syntaxe | mapAnimDone
Vrací hodnotu | Boolean (true nebo false)
Příklad použití | mapAnimDone
Další | Vyžaduje verzi 1.27 a vyšší.


MarkerColor
Popis | Vrátí barvu značky. (viz. SetMarkerColor). Příkaz je identický s příkazem GetMarkerColor.
Syntaxe | MarkerColor "značka"
Vrací hodnotu | řetězec
Příklad použití | MarkerColor "znacka1"
Další | Vyžadována verze hry 1.75.


MarkerPos
Popis | Vrátí pozici značky [x,y,z]. (viz. SetMarkerPos). Příkaz je identický s příkazem GetMarkerPos.
Syntaxe | MarkerPos "značka"
Vrací hodnotu | pole
Příklad použití | MarkerPos "znacka1"
Další | Vyžadována verze hry 1.75.


MarkerSize
Popis | Vrátí velikost značky. (viz. SetMarkerSize). Příkaz je identický s příkazem GetMarkerSize.
Syntaxe | MarkerSize "značka"
Vrací hodnotu | pole
Příklad použití | MarkerSize "znacka1"
Další | Vyžadována verze hry 1.75.


MarkerType
Popis | Vrací typ značky. (viz SetMarkerType). Příkaz je identický s příkazem GetMarkerType.
Syntaxe | MarkerType "značka"
Vrací hodnotu | řetězec
Příklad použití | MarkerType "znacka1"
Další | Vyžadována verze hry 1.75.


MissionName
Popis: | Vrátí název právě spuštěné mise.
Syntaxe: | MissionName
Vrací hodnotu: | řetězec
Příklad použití: | MissionName
Poznámka: |


MissionStart
Popis: | Vrací čas, kdy byla mise spuštěna.
Syntaxe: | MissionStart
Vrací hodnotu: | pole [rok, měsíc, den, hodina, minuta, sekunda]
Příklad použití: | MissionStart
Poznámka: |


Move
Popis | Vytvoří nový waypoint, posune ho na zadanou pozici a udělá z něj aktualně aktivní waypoint skupiny nebo jednotky. Jakmile je tento waypoint dosažen jednotka nebo skupina již pokračuje normálně na následující waypoint. Toto platí pouze pro AI vojáky. Hráč takto nově vytvořený waypoint neuvidí, pouze bude upozorněn radiovou hláškou (viz níže), přičemž původní waypoint je stále aktivní s nezměněnou pozicí.
Syntaxe | groupOne Move [osa_x, osa_y]
Vrací hodnotu | žádná
Příklad použití | groupOne Move getPos player
Další | Pozice nového waypointu je ohlášena HQ radiem "All, move to ....(souřadnice)" a textovou radiovou hláškou "Skupina, přesun na ....... (souřadnice)" nebo "Skupina, pohyb na ....... (souřadnice)".


MoveInCargo
Popis | Přesune vojáka do nákladového prostoru zadaného vozidla
Syntaxe | vojak MoveInCargo vozidlo
Vrací hodnotu | žádná
Příklad použití | vojak1 MoveInCargo jeep1
Další | Přesun vojáka je proveden okamžitě, bez jakékoli animace.


MoveInCommander
Popis | Přesune vojáka do zadaného vozidla na pozici jeho velitele.
Syntaxe | vojak MoveInCommander vozidlo
Vrací hodnotu | žádná
Příklad použití | vojak1 MoveInCommander jeep1
Další | Přesun vojáka je proveden okamžitě, bez jakékoli animace.


MoveInDriver
Popis | Přesune vojáka do zadaného vozidla na pozici řidiče
Syntaxe | vojak MoveInDriver vozidlo
Vrací hodnotu | žádná
Příklad použití | vojak1 MoveInDriver jeep1
Další | Přesun vojáka je proveden okamžitě, bez jakékoli animace.


MoveInGunner
Popis | Přesune vojáka do zadaného vozidla na pozici střelce.
Syntaxe | vojak MoveInGunner vozidlo
Vrací hodnotu | žádná
Příklad použití | vojak1 MoveInGunner jeep1
Další | Přesun vojáka je proveden okamžitě, bez jakékoli animace.


MusicVolume
Popis | Zjistí aktuální nastavení hlasitosti hudby. Implicitní hodnota hlasitosti je 0.5
Syntaxe | MusicVolume
Vrací hodnotu | číslo
Příklad použití | MusicVolume
Další | Úroveň hlasitosti hudby můžete nastavit příkazem FadeMusic.


Name
Popis | Zjistí jméno proměné přiřazené k zadanému objektu v editoru misí.
Syntaxe | Name objekt
Vrací hodnotu | řetězec
Příklad použití | playername = Name Player
Další | V případě, že je tento příkaz použit na vozidlo, vrácená hodnota bude jméno prvního člena posádky tohoto vozidla, a to v pořadí velitel, řidič, střelec.


NearestBuilding
Popis | Zjistí název nejbližší budovy vzhledem k zadanému objektu.
Syntaxe | NearestBuilding hrac
Vrací hodnotu | objekt
Příklad použití | NearestBuilding hrac
Další |


NearestObject
Popis: | Vrátí název nejbližšího objektu daného typu k dané pozici nebo objektu. Pozice může být [x,y,z, "Typ"] nebo [objekt,"Typ"].
Syntaxe: | NearestObjekt [hrac,"TYP"]
Vrací hodnotu: | objekt
Příklad použití: | NearestObjekt [hrac,"M1Abrams"]
Další: | Typy objektů najdete v seznamu tříd objektů . Pro lepší a úplnou orientaci v třídách objektů je dobré si prohlédnout přiložený dekódovaný soubor config.bin k verzi hry 1.75


Object

Popis: | Vrací objekt se zadaným ID. ID lze najít na mapě editoru po stisknutí tlačítka "Zobrazit ID".
Syntaxe: | Object ID
Vrací hodnotu: | objekt
Příklad použití: | _camerapos = Position Object 130652
Další: | Vyžadována verze hry 1.75.


ObjNull
Popis | Neexistující objekt. Tato hodnota není rovna ničemu, ani sama sobě.
Syntaxe | objNull
Vrací hodnotu | žádná
Příklad použití | player == objNull - vrácená hodnota je False
Další | Tento příkaz lze použít např. pro zrušení příkazu DoWatch kde si přejete aby určitý voják již nadále nesledoval dříve určený objekt. Příkaz by pak vypadal takto : voj1 DoWatch ObjNull


ObjStatus
Popis | Nastavuje status úkolu briefingu.
Syntaxe | "OBJ_x" ObjStatus "STATUS"
Vrací hodnotu | žádná
Příklad použití | "1" ObjStatus "DONE"
Další | Hodnoty pro STATUS mohou být následující : DONE - úkol je splněn (před úkolem v briefingu se objeví zelené odtržítko) FAILED - úkol nebyl řádně splněn (před úkolem v briefingu se objeví červený křížek) ACTIVE - úkol je aktivní (před úkolem v briefingu je černé kolečko) HIDDEN - úkol je v briefingu skryt (úkol není v briefingu viditelný)


OnBriefingGear

Popis: | Přehraje zadaný zvuk při přepnutí na list notesu "Výstroj". Zvuk musí být definován v souboru description.ext.
Syntaxe: | OnBriefingGear "Zvuk"
Vrací hodnotu: | žádnou
Příklad použití: | OnBriefingGear "zvuk_výstroj"
Další: | Vyžadována verze hry 1.75.


OnBriefingGroup

Popis: | Přehraje zadaný zvuk při přepnutí na list notesu "Skupina". Zvuk musí být definován v souboru description.ext.
Syntaxe: | OnBriefinGroup "Zvuk"
Vrací hodnotu: | žádnou
Příklad použití: | OnBriefinGroup "zvuk_skupina"
Další: | Vyžadována verze hry 1.75.


OnBriefingNotes

Popis: | Přehraje zadaný zvuk při přepnutí na list notesu "Popis". Zvuk musí být definován v souboru description.ext.
Syntaxe: | OnBriefingNotes "Zvuk"
Vrací hodnotu: | žádnou
Příklad použití: | OnBriefingNotes "zvuk_notes"
Další: | Vyžadována verze hry 1.75.


OnBriefingPlan

Popis: | Přehraje zadaný zvuk při přepnutí na list notesu "Plan". Zvuk musí být definován v souboru description.ext.
Syntaxe: | OnBriefingPlan "Zvuk"
Vrací hodnotu: | žádnou
Příklad použití: | OnBriefingPlan "zvuk_plan"
Další: | Vyžadována verze hry 1.75.


OnMapSingleClick
Popis: | Definuje akci, která se provede poté co hráč klikne na mapu. Akce získává z tohoto kliknutí následující hodnoty předdefinovaných proměnných: _pos = pozice kurzoru myši při kliknutí (dvojrozměrné pole čísel) _units = jednotky, na které bylo kliknuto (pole) _shift = True - byla-li při kliknutí stisknuta i klávesa SHIFT, jinak False _alt = True - byla-li při kliknutí stisknuta i klávesa ALT, jinak False
Syntaxe: | OnMapSingleClick Akce
Vrací hodnotu: | žádnou
Příklad použití: | onMapSingleClick {"SoldierWB" CreateUnit [_pos, Group Player];True}
Poznámka: | Zadané akce by měla vracet hodnotu True označující skutečnost, že byla řádně provedena. V případě, že si nejste jisti, že zadaná akce hodnotu True vrátí, přidejte pro jistotu tuto hodnotu jako druhý argument této funkce tak, jak je uvedeno v příkladu použití.


OrderGetIn
Popis | Tento příkaz přinutí všechny jednotky v seznamu nastoupit do vozidla. Ale pozor, před použitím tohoto příkazu musíte každé jednotce vozidlo také přiřadit příkazem AssignAsDriver, AssignAsCommander, AssignAsCargo nebo AssignAsGunner .
Syntaxe | [seznam jednotek] OrderGetIn Boolean
Vrací hodnotu | žádná
Příklad použití | [voj1, voj2, hrac] OrderGetIn True
Další | Podrobnější vysvětlení tohoto příkazu si můžete přečíst zde.


PickWeaponPool

Popis:

Přemístí veškerý obsah cargo objektu do prostoru zbraní a munice souboru weapons.cfg aktuální kampaně. Cargo objektem jsou myšleny např. bedny s municí, nákladní vozidlo apod. Soubor se automaticky vytvoří v adresáři :

USERS\jméno hráče\SAVED\CAMPAIGNS\adresář kampaně\weapons.cfg.

Pozor! Aby bylo možno tento příkaz použít musí být v souboru description.ext kampaně definováno :

weaponPool = True;
Syntaxe: PickWeaponPool objekt
Vrací hodnotu: žádnou
Příklad použití: PickWeaponPool truck1
Další: Vyžadována verze hry 1.75 a vyšší.


Player

Popis: | Vrací název osoby ovládané hráčem. V MP misích je hodnota vrácená tímto příkazem na každém počítači jiná.
Syntaxe: | Player
Vrací hodnotu: | řetězec
Příklad použití: | TitleText[Format["%1", Player], "Plain"]
Další: |


PlayersNumber
Popis: | Vrátí počet hráčů v MP misi hrajících za danou stranu.
Syntaxe: | PlayersNumber Strana
Vrací hodnotu: | číslo
Příklad použití: | PlayersNumber West
Poznámka: |


PlayMove
Popis | Přikáže jednotce provést určený pohyb.
Syntaxe | vojak PlayMove "TypPohybu"
Vrací hodnotu | žádná
Příklad použití | voj1 PlayMove "EffectStandSalute" (voják zasalutuje)
Další | Příloha se seznamem typů pohybu


PlayMusic
Popis | Přehraje originální skladbu OFP nebo hudbu definovanou v souboru description.ext od zadané pozice.
Syntaxe

PlayMusic ["skladba", pozice]
Vrací hodnotu | žádná
Příklad použití

PlayMusic ["Track13", 30] - přehraje OFP CWC skladbu 13 od 30-té sekundy do konce

PlayMusic "mojehudba" - přehraje vlastní hudbu nadefinovanou v description.ext
Další Toto je seznam již definovaných skladeb :

Skladby z OFP Resistance

res01a.ogg - PlayMusic "Rtrack1a"
res01b.ogg - PlayMusic "Rtrack1b"
res02.ogg - PlayMusic "Rtrack2"
res03.ogg - PlayMusic "Rtrack3"
res04.ogg - PlayMusic "Rtrack4"
res05.ogg - PlayMusic "Rtrack5"
res06.ogg - PlayMusic "Rtrack6"
res07.ogg - PlayMusic "Rtrack7"
res08.ogg - PlayMusic "Rtrack8"
res09.ogg - PlayMusic "Rtrack9"
res10.ogg - PlayMusic "Rtrack10"
Seventh_Darken.ogg - PlayMusic "7thDarken"
Seventh_My_Life.ogg - PlayMusic "7thMyLife"

Skladby z OFP Cold War Crisis

01.ogg - PlayMusic "Track1"
02.ogg - PlayMusic "Track2"
03.ogg - PlayMusic "Track3"
04.ogg - PlayMusic "Track4"
05.ogg - PlayMusic "Track5"
06.ogg - PlayMusic "Track6"
07.ogg - PlayMusic "Track7"
08.ogg - PlayMusic "Track8"
09.ogg - PlayMusic "Track9"
10.ogg - PlayMusic "Track10"
11.ogg - PlayMusic "Track11"
12.ogg - PlayMusic "Track12"
13.ogg - PlayMusic "Track13"
14.ogg - PlayMusic "Track14"
15.ogg - PlayMusic "Track15"
16.ogg - PlayMusic "Track16"
Frost.ogg - PlayMusic "Frost"
Seventh_decide.ogg - PlayMusic "7thDecide"
Seventh_iamgonnafly.ogg - PlayMusic "7thIamGonaFly" - Tady pozor, je tu chyba, oproti nazvu souboru je tu jen jedno "n"
Seventh_lifeless.ogg - PlayMusic "7thLifeless"
Seventh_overdose.ogg - PlayMusic "7thOverdose"

Soubor music.pbo v CWC obsahuje jeste soubor se skladbou Mixdown.ogg, ale ten neni nadefinovany, takze pro jeho pouziti by bylo nezbytné ho definovat v description.ext mise.


PlaySound
Popis | Přehraje zvuk nadefinovaný v souboru description.ext nebo již předdefinovaný originálním souborem config.bin.
Syntaxe | PlaySound "zvuk"
Vrací hodnotu | žádná
Příklad použití | PlaySound "Rus3"
Další Zde je dekodovaný soubor config.bin k verzi 1.75, přičemž zvuky jsou definovány v sekci CfgSounds. Jako název zvuku pak pro příkaz PlaySound slouží název konkrétní třídy, např.:

class Rus1
{
name="$STR_CFG_SOUNDS_RUS1";
sound[]={"voices\rus_amerikanskije",0.100000,1.000000};
titles[]={};
};

přehrajete : PlaySound "Rus1"


Position

Popis: | Vrátí pozici (souřadnice) zadaného objektu ve formátu [x,y] nebo [x,y,z]. Pžíkaz je identický s příkazem GetPos.
Syntaxe: | Position objekt
Vrací hodnotu: | pole [x,y] nebo [x,y,z] x = východ-západ, y = jih-sever, z = výška nad zemí.
Příklad použití: | _camerapos = Position Object 130652
Další: | Vyžadována verze hry 1.75.


PreprocessFile
Popis: | Vykoná a vrátí kód souboru *.SQF.
Syntaxe: | PreprocessFile "nazev_souboru_sqf"
Vrací hodnotu: | řetězec
Příklad použití: | PreprocessFile "myFile.sqf"
Poznámka: | Tato funkce je podobná preprocesoru jazyka C, a proto ve volaném souboru *.SQF můžete používat komentáře oddělené lomítky ( //, /* ... */) a definice maker pomocí directivy #define. Narozdíl od funkce LoadFile funkce PreprocessFile obsah souboru nejdříve vykoná a potom ho vrátí zpět volajícímu scriptu v souboru *.SQS. Ukázku použití souborů *.SQF si můžete prohlédnou v tutoriálu o podmínkách. Související témata : LoadFile, Call


PrimaryWeapon

Popis: | Vrátí název primární zbraně zadané jednotky. Pokud jednotka žádnou zbraň nemá, vrátí prázdný řetězec.
Syntaxe: | PrimaryWeapon jednotka
Vrací hodnotu: | řetězec
Příklad použití: | PrimaryWeapon voj1
Další: | Vyžadována verze hry 1.75.


Private
Popis: | Zajistí, že proměnná zadaná jako argument nebo proměnné uvedené v poli argumentů bude v daném rozsahu ( v konkrétním souboru scriptu) skutečně lokální a neovlivní tak proměnné se stejnými názvy existující v jiných souborech či polích objektů (např. v poli Při Aktivaci spínačů).
Syntaxe: | Private "název_promenne" Private [pole_s_nazvy_promennych_ohranicene_uvozovkami]
Vrací hodnotu: | žádnou
Příklad použití: | Private "_i" Private ["_i", "_x", "_y", "_z"]
Poznámka: | Související témata : PublicVariable Poznámka : Tato funkce byla do hry přidána s updatem 1.82ENG a 1.90CZ a vykazovala chybu, která spočívala v tom, že pokud byly názvy proměnných zapsány byť i s jedním velkým písmenem, pak funkce prostě nefungovala. Tato chyba byla opravena v updatu 1.93ENG a 1.96CZ.


PublicVariable
Popis | Rozešle hodnotu proměnné do všech počítačů.
Syntaxe | PublicVariable "název proměnné"
Vrací hodnotu | žádná
Příklad použití | PublicVariable "CTFscoreOne"
Další | Ve starších verzích než 1.30 lze přenášet pouze typ proměnné "číslo". V verzích vyšších než 1.30 lze přenášet následující typy proměnných : číslo boolean ( true nebo false) objekt skupina


PutWeaponPool

Popis: | Naplní zadaný cargo objekt všemi zbraněmi a municí, které jsou právě uloženy v prostoru pro zbraně a munici souboru weapons.cfg aktuální kampaně. Objekt může být pouze cargo objekt, jako jsou např. bedny s municí, nákladní vozidlo apod. Soubor weapons.cfg je vytvořen použitím příkazu AddWeaponPool nebo AddMagazinePool. Je-li tento příkaz použit v init.sqs , pak již není možné provést v briefingu dané mise na kartě "VÝSTROJ" vlastní výběr zbraní. Pozor! Aby bylo možno tento příkaz použít musí být v souboru description.ext kampaně definováno : weaponPool = True;
Syntaxe: | PutWeaponPool objekt
Vrací hodnotu: | žádnou
Příklad použití: | PutWeaponPool truck1
Další: | Vyžadována verze hry 1.75 a vyšší.


QueryMagazinePool

Popis: | Vrátí počet munice-zásobníků zadaného typu uložených v prostoru munice-magazines souboru weapons.cfg aktuální kampaně. Munice se do souboru weapons.cfg ukládá příkazem AddMagazinePool nebo PickWeaponPool.
Syntaxe: | QueryMagazinePool "Typ munice"
Vrací hodnotu: | číslo
Příklad použití: | _howmanymags = QueryMagazinePool "KozliceBall"
Další: | Vyžadována verze hry 1.75 a vyšší.


QueryWeaponPool

Popis: | Vrátí počet zbraní zadaného typu uložených v prostoru zbraní souboru weapons.cfg aktuální kampaně. Zbraně se do souboru weapons.cfg ukládají příkazem AddWeaponPool nebo PickWeaponPool.
Syntaxe: | QueryWeaponPool "Typ zbraně"
Vrací hodnotu: | číslo
Příklad použití: | _howmanyweaps = QueryWeaponPool "AK47"
Další: | Vyžadována verze hry 1.75 a vyšší.


Random
Popis: | Generuje náhodné číslo ze zadané množiny od 0 do MaxČíslo.
Syntaxe: | Random MaxČíslo MaxČíslo je číslo, které určuje horní hranici množiny čísel
Vrací hodnotu: | číslo mezi 0 a zadaným maximálním číslem
Příklad použití: | Random 5
Další: |


Rating
Popis | Kontroluje rating zadané jednotky. Rating je číslo, které se zvyšuje s počtem zabitých nepřátel a snižuje počet zabitých přátel. Výše ratingu může být měněna tvůrcem mise.
Syntaxe | Rating jednotka
Vrací hodnotu | číslo
Příklad použití | Rating Player
Další | Používá se především v MP misích nebo pro určování různých konců mise.


RemoveAction
Popis: | Odebere položku se zadaným ID akčního menu dříve přidanou příkazem AddAction.
Syntaxe: | jednotka RemoveAction ID
Vrací hodnotu: | žádnou
Příklad použití: | Player RemoveAction 1
Poznámka: |


RemoveAllEventHandlers
Popis: | Odebere zadané jednotce všechny Správce událostí daného typu přiřazené dříve funkcí AddEventHandler.
Syntaxe: | jednotka RemoveAllEventHandlers "Typ"
Vrací hodnotu: | žádnou
Příklad použití: | voj1 RemoveAllEventHandlers "Fired"
Poznámka: | Související témata : AddEventHandler, RemoveEventHandler, Seznam správců událostí


RemoveAllWeapons
Popis: | Odebere všechny zbraně dané jednotce
Syntaxe: | RemoveAllWeapons NázevJednotky NázevJednotky je název jednotky, které chceme zbraně odebrat.
Vrací hodnotu: | žádnou
Příklad použití: | RemoveAllWeapons MujHrac
Další: | Seznam zbraní a munice


RemoveEventHandler
Popis: | Odebere jednotce nebo vozidlu správce události (EventHandler) se zadaným ID dříve přiřazeného funkcí AddEventHandler.
Syntaxe: | jednotka RemoveEventHandler ["Typ", ID]
Vrací hodnotu: | žádnou
Příklad použití: | voj1 RemoveEventHandler ["Fired", handlerID]
Poznámka: | Po použití tohoto příkazu by všechny ostatní ID ostatních správců událostí měly být sníženy o 1. Související témata : AddEventHandler, RemoveAllEventHandlers, Seznam správců událostí


RemoveMagazine
Popis: | Odebere dané jednotce jeden zásobník střeliva z určené zbraně
Syntaxe: | NázevJednotky RemoveMagazine "TypStřeliva" NázevJednotky je název jednotky, které chceme střelivo odebrat. TypStřeliva je druh střeliva, který chceme odebrat.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac RemoveMagazine "M16"
Další: | Seznam zbraní a munice


RemoveMagazines
Popis: | Odebere dané jednotce všechno střelivo z určené zbraně
Syntaxe: | NázevJednotky RemoveMagazines "TypStřeliva" NázevJednotky je název jednotky, které chceme střelivo odebrat. TypStřeliva je druh střeliva, který chceme odebrat.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac RemoveMagazines "M16"
Další: | Seznam zbraní a munice


RemoveWeapon
Popis: | Odebere zadanou zbraň dané jednotce
Syntaxe: | NázevJednotky RemoveWeapon "Zbraň" NázevJednotky je název jednotky, které chceme zbraň odebrat. Zbraň určuje typ zbraně, kterou odebíráme.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac RemoveWeapon "M16"
Další: | Seznam zbraní a munice


RequiredVersion
Popis | Zkontroluje, zda-li je dostupná zadaná verze hry. Pokud ne, zobrazí varovnou zprávu a vrátí false.
Syntaxe | RequiredVersion "Major.Minor"
Vrací hodnotu | Boolean (true nebo false)
Příklad použití | RequiredVersion "1.30"
Další | Vyžaduje verzi 1.30 a vyšší. Formát verze je "Major.Minor" např. "1.30"


Resistance
Popis | Vrátí název strany odporu "GUER" - "Partyzáni"
Syntaxe | Resistance
Vrací hodnotu | strana
Příklad použití | Resistance
Další |


Resize
Popis | Změní velikost pole proměnných, konkr. změní počet elementů existujícího pole tak, že pokud je nový_počet_ elementů nižší než původní, pak zanechá pouze elementy od prvního do nový_ počet_ elementů a pokud je vyšší pak na konec pole přidá počet elementů rovnající se rozdílu mezi hodnotou nový_ počet_ elementů a stávajícím počtem elementů pole. Tyto nové elementy pole pak mají hodnotu Null.
Syntaxe | pole Resize nový_ počet_ elementů
Vrací hodnotu | pole
Příklad použití | _array = [1,2,3,4,5,6] _array Resize 3 - výsledkem je : _array == [1,2,3] _array Resize 9 - výsledkem je : _array == [1,2,3,4,5,6,Null,Null,Null]
Další | Vyžadována verze hry 1.75.


Reveal
Popis | Prozradí jednotku skupině či jiné jednotce. Nezáleží na tom, zda-li o tom jednotka ví či nikoli.
Syntaxe | soldierOne Reveal soldierTwo
Vrací hodnotu | žádná
Příklad použití | soldierOne Reveal soldierTwo
Další | První argument (soldierOne) určuje vojáka, kterému je prozrazena přítomnost vojáka určeného druhým argumentem (soldierTwo). Tzn. soldierTwo je prozrazen.


SaveGame
Popis: | Slouží k automatickému ukládání hry, dobré používat zvláště u delších misí nebo po zdlouhavých přesunech.
Syntaxe: | SaveGame
Vrací hodnotu: | žádnou
Příklad použití: | SaveGame
Další: |


SaveIdentity

Popis:

Uloží identitu osoby do souboru objects.sav v kampani pod zadaným názvem třídy. Soubor se automaticky vytvoří v adresáři :

USERS\jméno hráče\SAVED\CAMPAIGNS\adresář kampaně\objects.sav.

Pozor! Aby bylo možno tento příkaz použít musí být v souboru description.ext kampaně definováno :

weaponPool = True;

Syntaxe: osoba SaveIdentity "název třídy"
Vrací hodnotu: Boolean
Příklad použití: _checksave = Player SaveIdentity "playerIdentity"
Další: Tento příkaz se obvykle umístí do souboru exit.sqs. V další misi kampaně se pak identita dané osoby načte příkazem LoadIdentity, který se umístí do souboru init.sqs.

Do souboru objects.sav se např. u vojáka ukládají vlastnosti typu : zbraně, které voják má, zásobníky, identita, zranění, dovednost, hodnost apod.

Vyžadována verze hry 1.75 a vyšší.


SaveStatus

Popis:

Uloží vlastnosti objektu do souboru objects.sav v kampani pod zadaným názvem třídy. Soubor se automaticky vytvoří v adresáři :

USERS\jméno hráče\SAVED\CAMPAIGNS\adresář kampaně\objects.sav.

Pozor! Aby bylo možno tento příkaz použít musí být v souboru description.ext kampaně definováno :

weaponPool = True;

Syntaxe: objekt SaveStatus "název třídy"
Vrací hodnotu: Boolean
Příklad použití: _checksave = Player SaveStatus "playerStatus"
Další: Tento příkaz se obvykle umístí do souboru exit.sqs. V další misi kampaně se pak vlastnosti daného objektu načtou příkazem LoadStatus, který se umístí do souboru init.sqs.

Do souboru objects.sav se např. u vojáka ukládají vlastnosti typu : zbraně, které voják má, zásobníky, identita, zranění, dovednost, hodnost apod.

Vyžadována verze hry 1.75 a vyšší.


SaveVar
Popis | Uloží proměnnou do úložného prostoru operační paměti určené pro hru kampaně. Tato proměnná je pak dostupná ve všech misích po celou dobu kampaně.
Syntaxe | SaveVar "proměnná"
Vrací hodnotu | žádná
Příklad použití | SaveVar "prom1"
Další |


Say
Popis | Zadaný objekt přehraje zadaný zvuk *.OGG. Tento zvuk musí být nadefinovaný v souboru description.ext. Pokud je objektem voják, přehraje se zároveň soubor *.LIP - není podmínkou (tento soubor však musí mít stejný název jako přehrávaný soubor *.OGG a musí být ve stejném adresáři) Od verze 1.75 lze jako parametr tohoto příkazu použít i dvojrozměrné pole, kde první prvek pole je zvuk který se má přehrát a druhý prvek pole je vzdálenost v metrech, která stanoví nejzazší hranici pro zobrazení textu zvuku. Jinými slovy, je-li kamera dále než MaxTitlesDistance, pak se text přidružený ke zvuku v souboru description.ext nezobrazí.
Syntaxe | objekt Say "zvuk" objekt Say ["zvuk", MaxTitlesDistance]
Vrací hodnotu | žádná
Příklad použití | voj1 Say "zv1" voj1 Say ["zv1", 20]
Další | Pro použití druhého příkladu je vyžadována verze hry 1.75.


Score
Popis | Kontroluje score zadané jednotky.
Syntaxe | Score jednotka
Vrací hodnotu | číslo
Příklad použití | Score voj1
Další | Používá se především u MP misí. Vrácená hodnota čísla koresponduje s počtem zabitých nepřátel danou jednotkou.


ScudState
Popis | Vrací aktuální stav zadaného Scud Launcheru.
Syntaxe | ScudState scudname
Vrací hodnotu | číslo
Příklad použití | ScudState scud1
Další | Vyžadována verze 1.30 a vyšší. Příkaz rozpoznává nasledující stavy: 0 - Žádná aktivita 1 - Příprava k vypuštění 2 - Přírava k vypuštění dokončena 3 - Zážeh 4 - Scud vypuštěn Desetinná čísla za výše uvedenými celými čísly se použijí k přechodu mezi jednotlivými stavy.


SecondaryWeapon

Popis: | Vrátí název sekundární zbraně zadané jednotky. Pokud jednotka žádnou zbraň nemá, vrátí prázdný řetězec.
Syntaxe: | SecondaryWeapon jednotka
Vrací hodnotu: | řetězec
Příklad použití: | SecondaryWeapon voj1
Další: | Vyžadována verze hry 1.75.


Select
Popis | Vybere zadaný element zadaného pole proměnných.
Syntaxe | pole Select boolean - pokud je index false je vybrán první element pole, pokud je index true je vybrán druhý. pole Select číslo - vybere element pole v pořadí daném číslem. Číslo 0 znamená první element pole.
Vrací hodnotu | jakoukoli (dle typu pole)
Příklad použití | [1,2,3,4] Select true - výsledkem je 2 [1,2,3,4] Select 3 - výsledkem je 4 GetPos voj1 Select 0 - vybere souřadnici x vojaka voj1
Další |


SelectWeapon
Popis | Vybere vojákovi zadanou zbraň.
Syntaxe | voják SelectWeapon "ZBRAŇ"
Vrací hodnotu | žádná
Příklad použití | voj1 SelectWeapon "M16"
Další | Je vyžadována verze 1.30. Seznam zbraní a munice


Set
Popis: | Změní hodnotu zadaného prvku daného pole.
Syntaxe: | pole_promennych Set [Index_prvku, hodnota]
Vrací hodnotu: | Žádnou
Příklad použití: | _myArray Set [2, "M16"]
Poznámka: | Pokud není v daném poli nalezen prvek se zadaným indexovým číslem je automaticky zavolána funkce Resize s argumentem Index_prvku+1, která daný prvek sama vytvoří. To v praxi znamená, že pokud by v poli_myArray ve výše uvedeném příkladu neexistoval prvek 2 (třetí prvek pole, neboť index prvního prvku je v poli proměnných vždy 0), resp. pole _myArray by obsahovalo pouze dva prvky, pak by byla nejdříve zavolána funkce Resize s nasledujícími argumenty a teprve potom by se vykonala funkce Set : _myArray Resize 2 _myArray Set [2, "M16"]


SetAccTime
Popis: | Nastavuje akceleraci času
Syntaxe: | SetAccTime Akceleračnífaktor Akceleračnífaktor určuje, o kolik je čas zrychlen či zpomalen: 1 - normální rychlost hry 4 - čtyřnásobná rychlost hry 0.5 - poloviční rychlost hry atd.
Vrací hodnotu: | žádná
Příklad použití: | SetAccTime 2
Další: |


SetAmmoCargo
Popis: | Nastaví množství zdrojů munice v nákladním prostoru opravárenského vozidla.
Syntaxe: | vozidlo SetAmmoCargo číslo
Vrací hodnotu: | žádnou
Příklad použití: | truck1 SetAmmoCargo 1
Další: | Zdroje munice se používají k doplňování munice vozidlům. Tento příkaz neplatí pro vojáky, ty si doplňují munici během hry z beden nebo krabic s municí. Číslo 1 znamená plný nákladový prostor.


SetBehaviour
Popis | Nastaví skupině nebo jednotce chování.
Syntaxe | osoba SetBehaviour "CHOVÁNÍ"
Vrací hodnotu | žádná
Příklad použití | voj1 SetBehaviour "SAFE"
Další | Jsou přípustné následující typy chování : CARELESS - bezstarostně SAFE - bezpečně AWARE - opatrně COMBAT - bojovně STEALTH - skrytě Související témata : Behaviour


SetCaptive
Popis | Označí zadanou jednotku jako zajatce. Zajatec je neutrální vůči všem. Pokud je zadáno vozidlo, jako zajatec je označen velitel vozidla.
Syntaxe | objekt SetCaptive boolean
Vrací hodnotu | žádná
Příklad použití | voj1 SetCaptive true
Další | Tento příkaz neodebere jednotce zbraň, ta musí být odebrána pomocí příkazu RemoveWeapon nebo RemoveAllWeapons.


SetCombatMode
Popis: | Slouží k nastavení bojového režimu jednotky
Syntaxe: | NázevJednotky SetCombatMode "Mód" NázevJednotky je název jednotky, u které chceme bojový režim nastavit. Mód určuje typ bojového režimu jednotky ve stupnici: "BLUE" - nikdy nestřílí "GREEN" "WHITE" "YELLOW" "RED" - vždy střílí a sama vyhledává nepřítele
Vrací hodnotu: | žádnou
Příklad použití: | Hlidka SetCombatMode "RED"
Další: |


SecondaryWeapon

SetDamage

Popis: | Nastaví poškození objektu. Příkaz je identický s příkazem SetDammage a je implementován z důvodu opravy gramatické chyby anglického slova damage.
Syntaxe: | NázevJednotky SetDamage Hodnota NázevJednotky je název jednotky, pro kterou je hodnota nastavována Hodnota má rozsah 0-1 0 - nepoškozena 1 - zcela zničena
Vrací hodnotu: | žádnou
Příklad použití: | MujJeep SetDamage 0.8
Další: | Zničenou jednotku je použitím tohoto příkazu možno "opravit". Počáteční míru poškození je možno nastavit již při vkládání jednotky.


SetDammage
Popis: | Nastavuje míru poškození jednotky
Syntaxe: | NázevJednotky SetDammage Hodnota NázevJednotky je název jednotky, pro kterou je hodnota nastavována Hodnota má rozsah 0-1 0 - nepoškozena 1 - zcela zničena
Vrací hodnotu: | žádnou
Příklad použití: | MujJeep SetDammage 0.8
Další: | Zničenou jednotku je použitím tohoto příkazu možno "opravit". Počáteční míru poškození je možno nastavit již při vkládání jednotky. Zajímavostí je chyba, které se dopustili autoři ve slově Dammage - anglicky správně má být Damage (poškození), proto si dejte na toto pozor. Od verze 1.75 je tato chyba opravena implementací nového příkazu SetDamage, který je s příkazem SetDammage identický.


SetDir
Popis: | Nastavuje směr natočení jednotky.
Syntaxe: | NázevJednotky SetDir Hodnota NázevJednotky je název jednotky, kterou chceme natočit požadovaným směrem. Hodnota může být 0-359, směr natočení se počítá ve směru hodinových ručiček, 0 je sever, 90 východ atd.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac SetDir 120
Další: | Počáteční natočení (azimut) lze nastavit již při vložení jednotky.


SetFace
Popis | Nastaví vojákovi obličej.
Syntaxe | jednotka SetFace "OBLIČEJ"
Vrací hodnotu | žádná
Příklad použití | voj1 SetFace "Face10"
Další | Obličej - jeden z výrobcem předdefinovaných obličejů ( jsou použitelné Face1 - Face53).


SetFaceAnimation
Popis: | Nastaví rychlost mrkání očí zadané osoby.
Syntaxe: | osoba SetFaceAnimation číslo (číslo může být v rozsahu od 0 do 1)
Vrací hodnotu: | žádná
Příklad použití: | voj1 SetFaceAnimation 0.5
Další: | Příkaz se v praxi nepoužívá a byl pravděpodobně nahrazen příkazem SetMimic.


SetFlagOwner
Popis | Nastaví vlastníka zadané vlajky.
Syntaxe | vlajka SetFlagOwner vlastník
Vrací hodnotu | žádná
Příklad použití | vlajka1 SetFlagOwner voj1
Další | Pokud je vlastník nastaven na ObjNull, vlajka je vrácena na stožár.


SetFlagSide
Popis | Přiřadí vlajku straně.
Syntaxe | vlajka SetFlagSide "STRANA"
Vrací hodnotu | žádná
Příklad použití | vlajka1 SetFlagSide "EAST"
Další |


SetFlagTexture

Popis: | Slouží k nastavení vzhledu vlajky
Syntaxe: | NázevVlajky SetFlagTexture "Textura" NázevVlajky je název vlajky, u které chceme nastavit texturu. Textura určuje samotný vzhled vlajky. V původní verzi hry jsou jen tři: usa_vlajka.pac - americká vlajka west_vlajka.pac - vlajka NATO rus_vlajka.pac - ruská vlajka
Vrací hodnotu: | žádnou
Příklad použití: | RuskaVlajka SetFlagTexture "rus_vlajka.pac"
Další: | Od verze hry 1.10 je možno vkládat i jiné textury vlajky ve formátu jpg. Obrázek vlajky musí mít rozměry rovnající se násobkům dvojky ( 2, 4, 6, 8, 16, 32 apod. - např. 128 x 64 pixelů)


SetFog

Popis: | Slouží ke změně mlhy ve hře
Syntaxe: | ČasovýÚdaj SetFog Hodnota ČasovýÚdaj vyjadřuje v sekundách, za jak dlouho dojde ke změně počasí. Hodnotamusí být v rozmezí 0-1 0 - jasno 1 - úplná mlha
Vrací hodnotu: | žádnou
Příklad použití: | 40 SetFog 0.7
Další: |


SetFormation

Popis: | Slouží ke změně formace skupiny
Syntaxe: | NázevSkupiny SetFormation "Formace" NázevSkupiny je název skupiny, pro kterou chceme změnit formaci. Formace může být typu: "LINE" "STAG COLUMN" "WEDGE" "ECH LEFT" "ECH RIGHT" "VEE" "COLUMN"
Vrací hodnotu: | žádnou
Příklad použití: | PrvniSkupina SetFormation "VEE"
Další: |


SetFormDir

Popis: | Nastavuje směr natočení celé skupiny
Syntaxe: | NázevSkupiny SetFormDir Hodnota NázevSkupiny je název skupiny, kterou chceme natočit požadovaným směrem. Hodnota může být 0-359, směr natočení se počítá ve směru hodinových ručiček, 0 je sever, 90 východ atd.
Vrací hodnotu: | žádnou
Příklad použití: | PrvniSkupina SetFormDir 270
Další: | Počáteční natočení (azimut) lze nastavit již při vložení skupiny.


SetFuel

Popis: | Nastavuje množství pohonných hmot ve vozidle
Syntaxe: | NázevJednotky SetFuel Hodnota NázevJednotky je název jednotky, pro kterou chceme hodnotu nastavit Hodnota nabývá hodnot 0-1 0 - prázdný 1- plný
Vrací hodnotu: | žádnou
Příklad použití: | MujJeep SetFuel 0.6
Další: | Počáteční hodnotu lze také nastavit již při přidávání jednotky. Související témata : Fuel, Seznam správců událostí


SetFuelCargo

Popis: | Nastaví množství PHM v cisterně tankovacího vozidla.
Syntaxe: | vozidlo SetFuelCargo Hodnota
Vrací hodnotu: | žádnou
Příklad použití: | cist1 SetFuelCargo 1
Další: | Hodnota 1 je plná cisterna.


SetGroupID
Popis | Přiřadí skupině nebo jedotce skupinové ID.
Syntaxe | skupina SetGroupID ["NÁZEV SKUPINY", "BARVA", "OBRÁZEK"]
Vrací hodnotu | žádná
Příklad použití | skup1 SetGroupID ["ALFA", "GROUPCOLOR3", "OBR1.JPG"]
Další | Jsou použitelné následující názvy skupiny : Alpha Bravo Charlie Delta Echo Foxtrot Golf Hotel Kilo Yankee November Zulu Two Three Convoy Guardian Buffalo Fox a následující barvy : GroupColor0 GroupColor1 GroupColor2 GroupColor3 GroupColor4 GroupColor5 GroupColor6 GroupColor7


SetIdentity
Popis | Nastavuje identitu osobě. Tato identita musí být definována v souboru description.ext.
Syntaxe | osoba SetIdentity "identita"
Vrací hodnotu | žádná
Příklad použití | Player SetIdentity "Ruprt"
Další | Popis použití tohoto příkazu v najdete v tomto tipu .


SetMarkerColor
Popis | Nastaví barvu značky.
Syntaxe | značka SetMarkerColor "BARVA"
Vrací hodnotu | žádná
Příklad použití | zn1 SetMarkerColor "ColorRed"
Další | Je vyžadována verze 1.30 a vyšší. Jsou použitelné následující barvy : Default ColorBlack ColorRed ColorRedAlpha ColorGreen ColorGreenAlpha ColorBlue ColorYellow ColorWhite


SetMarkerPos
Popis | Posune značku na zadané souřadnice.
Syntaxe | "značka" SetMarkerPos [osa_x, osa_y]
Vrací hodnotu | žádná
Příklad použití | "zn1" SetMarkerPos [GetPos vel1 select 0, GetPos vel1 select 1]
Další |


SetMarkerSize
Popis | Nastaví velikost značky.
Syntaxe | "znacka" SetMarkerSize [osa x, osa y]
Vrací hodnotu | žádná
Příklad použití | "znacka1" SetMarkerSize [100,200]
Další | Je vyžadována verze 1.21 a vyšší. Velikost je ve formátu [x-osa, y-osa].


SetMarkerType
Popis | Nastaví typ značky.
Syntaxe | "znacka" SetMarkerType "TYP"
Vrací hodnotu | žádná
Příklad použití | "znacka1" SetMarkerType "Arrow"
Další | Použitelné typy značek jsou následující : Flag Flag1 Dot Destroy Start End Warning Join Pickup Unknown Marker Arrow Empty


SetMimic
Popis | Nastaví osobě mimiku.
Syntaxe | osoba SetMimic "MIMIKA"
Vrací hodnotu | žádná
Příklad použití | voj1 SetMimic "ANGRY"
Další | Jsou použitelné následující mimiky : Default Normal Smile Hurt Ironic Sad Cynic Surprised Agresive Angry


SetObjectTexture

Popis: | Nastaví textury určité části zadaného objektu. Textura je obrázek, který musí být v adresáři mise, nebo již v existujících originálních souborech hry nebo v addonech.
Syntaxe: | objekt SetObjectTexture [indexová pozice v objektu, "obrázek"]
Vrací hodnotu: | žádnou
Příklad použití: | truck1 SetObjectTexture [0, "rus_vlajka.pac"]
Další: | Pokud uvedený příklad použití zadáte na 5-ti tunový americký náklaďák, tak se na jeho boku (na plachtě) objeví ruská vlajka. Toto je dobré používat např. u MP misí pro umístění loga squadu na určité objekty. Vyžadována verze hry 1.75 a vyšší.


SetOvercast
Popis | Naství úroveň počasí na zataženo podle zadané hodnoty a v průběhu zadaného času.
Syntaxe | čas SetOvercast úroveňpočasí
Vrací hodnotu | žádná
Příklad použití | 600 SetOvercast 0.5
Další | Úroveňpočasí 0 je slunečno, při Úroveňpočasí 1 je velmi pravděpodobné, že bude zataženo, pršet a bude bouřka. Čas je udáván v sekundách.


SetPos
Popis | Nastaví pozici objektu.
Syntaxe | objekt SetPos [osa_x, osa_y, osa_z]
Vrací hodnotu | žádná
Příklad použití | jeep1 SetPos [5000, 3200, 1] jeep1 SetPos [(GetPos hrac Select 0) + 10, GetPos hrac Select 1, 0]
Další |


SetRadioMsg
Popis | Nastaví text nabídky radiových hlášek, které se zobrazí při hře po stisknutí kláves "0, 0" nebo při otevřené mapě na vyobrazené vysílačce.
Syntaxe | řádeknabídky SetRadioMsg "Text"
Vrací hodnotu | žádná
Příklad použití | 1 SetRadioMsg "Zobraz tento text"
Další | Aby bylo možno tento příkaz použít, musí být ve hře umístěn spínač, který se aktivuje jedním z radií, např. "RADIO ALFA". Pro každý spínač lze použít jeden tento příkaz. Stejného efektu lze dosáhnout zadáním příslušného textu do pole spínače "Text".


SetRain

Popis: | Plynule nastaví hustotu deště na zadanou hodnotu během určené doby.
Syntaxe: | time SetRain hodnota time je doba po kterou změna počasí (deště) probíhá na zadanou hodnotu time s hodnotou 0 je okamžitá změna počasí (deště) hodnota - číslo v rozsahu od 0 do 1, kde 0 znamená NEPRŠÍ a 1 znamená největší déšť.
Vrací hodnotu: | žádnou
Příklad použití: | 60 SetRain 1
Další: | Použití tohoto příkazu nemá žádný vliv pokud je hodnota Overcast - Zataženo, nastavena příkazem SetOvercast, nižší než 0.7. Vyžadována verze hry 1.75 a vyšší.


SetRepairCargo
Popis: | Nastaví množství opravárenských zdrojů v nákladovém prostoru opravárenského vozidla.
Syntaxe: | vozidlo SetRepairCargo Hodnota
Vrací hodnotu: | žádnou
Příklad použití: | oprtruck1 SetRepairCargo 1
Další: | Hodnota 1 znamená, že je vozidlo plně naložené.


SetSkill

Popis: | Nastaví úroveň dovednosti zadané jednotky v rozsahu od 0 do 1, kde 0 je "nešika" o))) a 1 je "expert".
Syntaxe: | jednotka SetSkill dovednost
Vrací hodnotu: | žádnou
Příklad použití: | voj1 SetSkill 1
Další: | Vyžadována verze hry 1.75 a vyšší.


SetSpeedMode
Popis | Nastaví režim rychlosti skupiny nebo jednotky.
Syntaxe | skupina SetSpeedMode "REŽIM"
Vrací hodnotu | žádná
Příklad použití | gr1 SetSpeedMode "FULL"
Další | Režim může být : LIMITED - poloviční rychlost, pomalu NORMAL - plná rychlost, jednotky ve skupině udržují formaci FULL - plná rychlost, jednotky ve skupině na sebe nečekají a neudržují formaci


SetTerrainGrid

Popis: | Nastaví požadované rozlišení terénu. Pro normální krajinu jsou použitelná tato rozlišení : 50, 25, 12.5, 6.25, 3.125. Pokud se uvede jiná hodnota, nejbližší z uvedených hodnot je použita.
Syntaxe: | SetTerrainGrid hodnota
Vrací hodnotu: | žádnou
Příklad použití: | SetTerrainGrid 12.5
Další: | Zde si nejsem zcela jist funkcí tohoto příkazu, ale domnívám se, že se jedná o funkci, která má sloužit zejména k nastavení chodu vaší mise a ke snížení zátěže procesoru počítače při zobrazování 3D objektů, neboť při testování jsem zjistil, že čím menší hodnotu jsem zadal, tím pomaleji byla krajina zobrazována ("cukání"). Vizuální změna však byla téměř nepatrná.


SetUnitPos
Popis | Nastaví pravidla pro postavení jednotky.
Syntaxe | jednotka SetUnitPos "POSTAVENÍ"
Vrací hodnotu | žádná
Příklad použití | voj1 SetUnitPos "DOWN"
Další | Postavení může být : DOWN - voják si lehne -> plížení UP - voják stojí AUTO - voják podle situace leží nebo stojí -> standardní hodnota


SetVelocity
Popis: Přesune vozidlo na souřadnice relativní ke stávající pozici daného vozidla, a to v určitém časovém intervalu (při testování této funkce jsem došel k závěru, že tento interval je standardně nastaven přibližně na jednu sekundu, může se však lišit v rozsahu >= +/- 500 milisekund - z tohoto důvodu doporučuji používat nízké hodnoty parametrů X, Y, Z v časové smyčce, neboť tak lze lépe ovlivnit rychlost přesunu vozidla na nové souřadnice ).
Syntaxe: vozidlo SetVelocity [X, Y, Z]
Vrací hodnotu: žádnou
Příklad použití: plane1 SetVelocity [0, 2.5, 6]
Poznámka: POZOR!!!

Při použití tohoto příkazu nedojde ke změně natočení vozidla. Toto je nutné v případě potřeby upravit pomocí příkazu SetDir a goniometrických funkcí jako jsou Sin, Cos apod.

Tuto funkci lze velmi účinně využívat ve spojení s příkazem Velocity, Speed, SetPos a Position ke zjišťování a nastavování rychlosti, směru a pohybu vozidel (např. zpomalování, zrychlování letadel a vrtulníků, inicializační pozice vozidel apod.)


SetViewDistance
Popis: | Nastavuje maximální viditelnou vzdálenost
Syntaxe: | SetViewDistance Hodnota Hodnota je vzdálenost v metrech
Vrací hodnotu: | žádnou
Příklad použití: | SetViewDistance 1500
Další: | Přednastavená hodnota je 900 metrů. Použitelný rozsah je od 500 m do 5000m.


SetWPPos
Popis | Přesune waypoint skupiny nebo jednotky na zadanou pozici.
Syntaxe | [skupina, wp] SetWPPos [osa_x, osa_y]
Vrací hodnotu | žádná
Příklad použití | [sk1, 2] SetWPPos [5000, 3200] [sk1, 2] SetWPPos [GetPos voj1 Select 0, GetPos voj1 Select 1]
Další | Je vyžadována verze 1.30 a vyšší. Upozornění : První waypoint skupiny je v editoru označen jako WP 0, jeho číslo však odpovídá v tomto příkazu číslu 1.


ShowCinemaBorder
Popis | Způsobí zobrazení kino rámečků (jako v širokoúhlém filmu).
Syntaxe | ShowCinemaBorder boolean
Vrací hodnotu | žádná
Příklad použití | ShowCinemaBorder true
Další | Tento příkaz se obvykle používá v předělových scénách, čímž je indikováno, že hráč nemůže hru ovládat.


ShowCompass
Popis: | Nastaví použití kopmasu.
Syntaxe: | ShowCompass=Hodnota (v souboru description.ext) Hodnota je 1 - bude k dispozici, nebo 0 - nebude k dispozici ShowCompass Boolean (ve scriptu)
Vrací hodnotu: | žádnou
Příklad použití: | ShowCompass=0 ShowCompass True
Další: | Při použítí tohoto příkazu v souboru description.ext a testování mise z prostředí editoru misí není vidět změna.


ShowGPS
Popis: | Nastavuje použití GPS.
Syntaxe: | ShowGPS = Hodnota ( v souboru description.ext) Hodnota je 1 - bude k dispozici, nebo 0 - nebude k dispozici ShowGPS Boolean (ve scriptu)
Vrací hodnotu: | žádnou
Příklad použití: | ShowGPS=0 ShowGPS True
Další: | Při použítí tohoto příkazu v souboru description.ext a testování mise z prostředí editoru misí není vidět změna.


ShowMap
Popis: | Nastaví použití mapy.
Syntaxe: | ShowMap = Hodnota (v souboru description.ext) Hodnota je 1 - bude k dispozici, nebo 0 - nebude k dispozici ShowMap Boolean (ve scriptu)
Vrací hodnotu: | žádnou
Příklad použití: | ShowMap=0 ShowMap True
Další: | Při použítí tohoto příkazu v souboru description.ext a testování mise z prostředí editoru misí není vidět změna.


ShownCompass
Popis: | Zjišťuje, jestli je v misi k dispozici kompas
Syntaxe: | ShownCompass
Vrací hodnotu: | true - ano false - ne
Příklad použití: | ShownCompass
Další: |


ShownGPS
Popis: | Zjišťuje, jestli je v misi k dispozici GPS
Syntaxe: | ShownGPS
Vrací hodnotu: | true - ano false - ne
Příklad použití: | ShownGPS
Další: |


ShownMap
Popis: | Zjišťuje, jestli je v misi k dispozici mapa
Syntaxe: | ShownMap
Vrací hodnotu: | true - ano false - ne
Příklad použití: | ShownMap
Další: |


ShownPad
Popis: | Zjišťuje, jestli je v misi k dispozici sešit
Syntaxe: | ShownPad
Vrací hodnotu: | true - ano false - ne
Příklad použití: | ShownPad
Další: |


ShownRadio
Popis: | Zjišťuje, jestli je v misi k dispozici rádio
Syntaxe: | ShownRadio
Vrací hodnotu: | true - ano false - ne
Příklad použití: | ShownRadio
Další: |


ShownWarrant
Popis | Zkontroluje zda-li hráč používá ID kartu. Zastarlé - nepoužívá se.
Syntaxe | ShownWarrant
Vrací hodnotu | Boolean (true nebo false)
Příklad použití | ShownWarrant
Další | Zastarlé - nepoužívá se.


ShownWatch
Popis: | Zjišťuje, jestli jsou v misi k dispozici hodinky
Syntaxe: | ShownWatch
Vrací hodnotu: | true - ano false - ne
Příklad použití: | ShownWatch
Další: |


ShowPad
Popis: | Nastaví zobrazení sešitu s informacemi.
Syntaxe: | ShowPad = Hodnota (v souboru description.ext) Hodnota je 1 - bude k dispozici, nebo 0 - nebude k dispozici ShowPad Boolean (ve scriptu)
Vrací hodnotu: | žádnou
Příklad použití: | ShowPad=0 ShowPad True
Další: | Při použítí tohoto příkazu v souboru description.ext a testování mise z prostředí editoru misí není vidět změna.


ShowRadio
Popis: | Nastaví zobrazení radia (vysílačky).
Syntaxe: | ShowRadio = Hodnota (v souboru description.ext) Hodnota je 1 - bude k dispozici, nebo 0 - nebude k dispozici ShowRadio Boolean (ve scriptu)
Vrací hodnotu: | žádnou
Příklad použití: | ShowRadio=0 ShowRadio True
Další: | Při použítí tohoto příkazu v souboru description.ext a testování mise z prostředí editoru misí není vidět změna.


ShowWarrant
Popis | Použije ID kartu. Zastarlé - nepoužívá se.
Syntaxe | ShowWarrant boolean
Vrací hodnotu | žádná
Příklad použití | ShowWarrant true
Další | Zastarlé - nepoužívá se.


ShowWatch
Popis: | Nastaví zobrazení hodinek.
Syntaxe: | ShowWatch = Hodnota (v souboru description.ext) Hodnota je 1 - budou, nebo 2 - nebudou ShowWatch Boolean (ve scriptu)
Vrací hodnotu: | žádnou
Příklad použití: | ShowWatch=0 ShowWatch True
Další: | Při použítí tohoto příkazu v souboru description.ext a testování mise z prostředí editoru misí není vidět změna.


Side

Popis: | Zjišťuje, za kterou stranu hraje jednotka.
Syntaxe: | Side NázevJednotky NázevJednotky je název jednotky, u které to zjišťujeme
Vrací hodnotu: | east - východní west - západní guer - partyzáni civ - civilisté
Příklad použití: | ? side Protihrac == East : MujHrac GlobalChat "Ruský bastarde!"
Další: |


SideEnemy
Popis: | Nepřátelská strana (Nepřátelé všech jednotek - opak SideFriendly).
Syntaxe: | SideEnemy
Vrací hodnotu: | strana ("ENEMY")
Příklad použití: | SideEnemy
Poznámka: | POZOR!!! V oficiálním manuálu je tato funkce uvedena jako "Enemy", toto však nefunguje, namísto toho je nutné požívat toto klíčové slovo ("SideEnemy").


SideFriendly
Popis: | Přátelská strana (Přátelé všech jednotek - opak SideEnemy)
Syntaxe: | SideFriendly
Vrací hodnotu: | strana ("FRIENDLY")
Příklad použití: | SideFriendly
Poznámka: | POZOR!!! V oficiálním manuálu je tato funkce uvedena jako "Friendly", toto však nefunguje, namísto toho je nutné požívat toto klíčové slovo ("SideFriendly").


SideChat
Popis | Vypíše zadaný text na radiovém kanálu strany dané jednotky.
Syntaxe | jednotka SideChat "TEXT"
Vrací hodnotu | žádná
Příklad použití | voj1 SideChat "Vypiš tento text" - barva textu MODRÁ
Další | Jak upozorňuje výrobce ve svém oficiálním Scripting Command Manual tento příkaz pouze zadaný text uloží do seznamu, ale nerozešle ho na jiné PC. Chcete-li tuto zprávu zobrazit na všech počítačích, musíte ji taky na každém tomto PC tímto příkazem vykonat. Toto jsem však nebyl schopen ověřit, neboť ať jsem to zkoušel jakkoli zpráva byla vždy zobrazena.


SideRadio
Popis | Pošle zadanou radiovou zprávu na radiový kanál strany dané jednotky. Zpráva musí být definována v souboru description.ext.
Syntaxe | jednotka SideRadio "ZPRÁVA"
Vrací hodnotu | žádná
Příklad použití | voj1 SideRadio "zprava1" - barva textu ČERNÁ
Další | Pokud je tak definováno v souboru description.ext zpráva může obsahovat zvuk i text, nebo jenom zvuk či text.


Skill
Popis: | Zjistí stávající úroveň dovednosti dané jednotky nebo vozidla.
Syntaxe: | Skill jednotka/vozidlo
Vrací hodnotu: | číslo
Příklad použití: | Skill voj1
Poznámka: | Úroveň dovednosti můžete nastavit pro danou jednotku nebo vozidlo přímo v editoru nebo příkazem SetSkill.


SkipTime
Popis: | Posouvá (časově) hru dále
Syntaxe: | SkipTime Hodnota Hodnota určuje počet hodin o kolik se čas posune.
Vrací hodnotu: | žádnou
Příklad použití: | SkipTime 3
Další: | Hodnota je číslo udávané v hodinách, avšak nemá šedesátkový formát, nýbrž desetinný. Tzn. že hodnota argumentu tohoto příkazu 14.5 se rovná 14-ti hodinám a 30-ti minutám.


SliderPosition
Popis: | Vrátí aktuální pozici posuvného ukazovátka (sliderthumb) šoupátka (slider) se zadaným IDC aktuálně spuštěného dialogu.
Syntaxe: | SliderPosition IDC
Vrací hodnotu: | číslo
Příklad použití: | _sliderPos = SliderPosition 101
Poznámka: | Bližší informace o práci s dialogy najdete v tutoriálech Práce s dialogy - #1 a Práce s dialogy - #2.


SliderRange
Popis: | Vrátí pole dvou prvků s rozsahem šoupátka (slider) se zadaným IDC aktuálně spuštěného dialogu.
Syntaxe: | SliderRange IDC
Vrací hodnotu: | pole čísel [min, max]
Příklad použití: | _sliderLimits = SliderRange 101
Poznámka: | Bližší informace o práci s dialogy najdete v tutoriálech Práce s dialogy - #1 a Práce s dialogy - #2.


SliderSetPosition
Popis: | Nastaví pozici posuvného ukazovátka (sliderthumb) šoupátka (slider) se zadaným IDC aktuálně spuštěného dialogu.
Syntaxe: | SliderSetPosition [IDC, Position]
Vrací hodnotu: | žádnou
Příklad použití: | SliderSetPosition [101, 0]
Poznámka: | Bližší informace o práci s dialogy najdete v tutoriálech Práce s dialogy - #1 a Práce s dialogy - #2.


SliderSetRange
Popis: | Nastaví rozsah pozic šoupátka se zadaným IDC aktuálně spuštěného dialogu.
Syntaxe: | SliderSetRange[IDC, Min, Max]
Vrací hodnotu: | žádnou
Příklad použití: | SliderSetRange[101, 0, 10]
Poznámka: | Bližší informace o práci s dialogy najdete v tutoriálech Práce s dialogy - #1 a Práce s dialogy - #2.


SliderSetSpeed
Popis: | Nastaví rychlost posuvu ukazatele (sliderthumb) šoupátka (slider) se zadaným IDC aktuálně spuštěného dialogu.
Syntaxe: | SliderSetSpeed [IDC, rychlost_posuvu_horizontalni, rychlost_posuvu_vertikalni]
Vrací hodnotu: | žádnou
Příklad použití: | sliderSetSpeed [101, 0.5, 2.0]
Poznámka: | Bližší informace o práci s dialogy najdete v tutoriálech Práce s dialogy - #1 a Práce s dialogy - #2.


SliderSpeed
Popis: | Vrátí dvojrozměrné pole udávající rychlost posuvného ukazatele(sliderthumb) šoupátka (slider) se zadaným IDC aktuálně spuštěného dialogu.
Syntaxe: | SliderSpeed IDC
Vrací hodnotu: | pole čísel [rychlost_posuvu_horizontalni, rychlost_posuvu_vertikalni]
Příklad použití: | _sliderSpeed = SliderSpeed 101
Poznámka: | Bližší informace o práci s dialogy najdete v tutoriálech Práce s dialogy - #1 a Práce s dialogy - #2.


SomeAmmo
Popis: | Zjišťuje, zda má jednotka ještě nejaké střelivo.
Syntaxe: | SomeAmmo NázevJednotky NázevJednotky je název jednotky, u které to chceme zjistit
Vrací hodnotu: | Boolean true - jednotka má ještě střelivo false - jednotka nemá střelivo
Příklad použití: | SomeAmmo MujHrac
Další: |


SoundVolume
Popis | Zjistí aktuální nastavení hlasitosti zvuku.
Syntaxe | SoundVolume
Vrací hodnotu | číslo
Příklad použití | _sv = SoundVolume
Další |


Speed
Popis | Zjistí aktuální rychlost zadaného objektu. Rychlost je udávaná v km/h.
Syntaxe | Speed objekt
Vrací hodnotu | číslo
Příklad použití | Speed jeep1
Další |


SpeedMode
Popis | Zjistí aktuální nastavení režimu rychlosti skupiny nebo jednotky, nastavené příkazem SetSpeedMode.
Syntaxe | SpeedMode skupina
Vrací hodnotu | řetězec ("LIMITED","NORMAL","FULL")
Příklad použití | _sm = SpeedMode sk1
Další |


Stop
Popis | Zastaví AI jednotku.
Syntaxe | jednotka Stop stop
Vrací hodnotu | žádná
Příklad použití | voj1 Stop true
Další | Oficiální Scripting Command manuál tvrdí, že tento příkaz je zastaralý, a že by měl být pro lepší kontrolu nad zastavením AI jednotky používán příkaz DisableAI . Toto však příliš nedoporučuji (viz popis příkazu DisableAI ) a i vzhledem k tomu, že v kampani Resistance je příkaz Stop hojně využíván, nepovažuji ho rozhodně za zastaralý.


Stopped
Popis | Zjistí, zda-li je jednotka zastavena příkazem Stop.
Syntaxe | Stopped jednotka
Vrací hodnotu | Boolean (true nebo false)
Příklad použití | Stopped jeep1
Další |


SwitchCamera
Popis | Přepne kameru na zadané vozidlo / kameru.
Syntaxe | objekt SwitchCamera "REŽIM"
Vrací hodnotu | žádná
Příklad použití | voj1 SwitchCamera "GUNNER"
Další | Režim kamery může být : INTERNAL - pohled 1.osoby GUNNER - pohled střelce (optika / mířidla) EXTERNAL - pohled 3. osoby GROUP - pohled skupiny


SwitchLight

Popis: | Nastaví režim pouličního osvětlení.
Syntaxe: | objekt SwitchLight "Režim"
Vrací hodnotu: | žádná
Příklad použití: | NearestObject [Player, "StreetLamp"] SwitchLight "Off"
Další: | Režim může být následující : ON OFF AUTO (default - v noci svítí, ve dne zhasnuto)


SwitchMove
Popis | Osoba vykoná zadaný pohyb. Pohyb je vykonán okamžitě bez přechodu.
Syntaxe | osoba SwitchMove "POHYB"
Vrací hodnotu | žádná
Příklad použití | voj1 SwitchMove "EffectStandSalute" - osoba zasalutuje
Další | Pro přepnutí zpět do standardního postoje osoby použijte příkaz osoba SwitchMove "". Pokud tak neučiníte, může se stát, že osoba v daném pohybu "zamrzne". Příloha se seznamem typů pohybu


TextLog

Popis: | Oficiální Scripting Commandd Manual tvrdí, že tento příkaz vypíše hodnotu zadaného argumentu do výstupu debbugeru.
Syntaxe: | TextLog player
Vrací hodnotu: | žádný
Příklad použití: | TextLog player
Další: | Bohužel, tento příkaz jsem nemohl ověřit, neboť jsem nezjistil žádné výstupní okno nebo prostor. Po konzultaci na oficiálním OF Fóru jsem se dozvěděl, že tento příkaz vůbec nefunguje.


_this
Popis: Odkazuje na volací parametry funkcí uvnitř scriptu a pouze v rozsahu tohoto scriptu.
Syntaxe: _this
Vrací hodnotu: jakoukoli
Příklad použití: _objectPos = _this Position Select 0
Poznámka: Toto klíčové slovo odkazuje např. na parametr příkazu Exec. Příkaz Exec může být volán s neomezeným počtem parametrů, přičemž každý z nich je buď elementem pole parametrů nebo objektem.

Voláte-li příkaz Exec s parametry v poli, klíčové slovo _this musíte použít s příkazem Select, který vybere z pole parametrů požadovaný element. Např. je-li příkaz Exec volán následujícím způsobem:

[10, "SoldierWB", 1] Exec "myscript.sqs"

klíčové slovo _this Select 1 vybere z pole argumentů element "SoldierWB". Jinými slovy použijete-li následující kód :

_myVariable = _this Select 1

proměnné _myVariable bude přiřazena hodnota "SoldierWB".

Pokud volacím parametrem příkazu Exec není pole ale objekt, klíčové slovo _this reprezentuje tento objekt. Např. je-li příkaz Exec volán následujícím způsobem:

voj1 Exec "myscript.sqs"

klíčové slovo _this reprezentuje objekt voj1.


Time
Popis | Kontroluje čas uběhlý od začátku mise. Čas je udáván v sekundách.
Syntaxe | Time
Vrací hodnotu | číslo
Příklad použití | _akttime = TIME
Další | Oproti tomu lokální proměnná "_time" použitá ve skriptu načítá čas uběhlý od spuštění scriptu, ve kterém je tato proměnná umístěna.


TitleCut
Popis | Vypíše zadaný text na obrazovku, přičemž se použije zadaný efekt. Oficiální Scripting Command Manual tvrdí, že tento příkaz je zastaralý. Zřejmě by měl být používán příkaz TitleText. Tento příkaz se však chová naprosto identicky.
Syntaxe | TitleCut["TEXT", "EFEKT", speed]
Vrací hodnotu | žádná
Příklad použití | TitleCut["Vypiš tento text", "BLACK OUT", 0.5]
Další | Efekty textu mohou být následující : PLAIN PLAIN DOWN BLACK BLACK FADED BLACK IN BLACK OUT WHITE IN WHITE OUT speed - je doba v sekundách, po jakou bude vypsáný text zobrazen


TitleObj
Popis | Zobrazí zadaný objekt včetně textu definovaný souborem description.ext nebo globálním souborem config.bin.
Syntaxe | TitleObj["OBJEKT", "EFEKT", rychlost]
Vrací hodnotu | žádná
Příklad použití | TitleObj["BIS", "PLAIN", 3]
Další | Efekty zobrazení objektu mohou být následující : PLAIN PLAIN DOWN BLACK BLACK FADED BLACK IN BLACK OUT WHITE IN WHITE OUT Pokud není zadána rychlost je automaticky dosazena hodnota 1. Předdefinované objekty jsou : BIS SPHERE TVSet Souborem description.ext mohou být nadefinovány i další vlastní objekty. Bližší informace naleznete v tomto tutoriálu.


TitleRsc
Popis | Zobrazí zadaný zdroj. Použití je shodné s příkazem TitleObj.
Syntaxe | TitleRsc["TEXT", "EFEKT", rychlost]
Vrací hodnotu | žádná
Příklad použití | TitleRsc["BIS", "PLAIN", 3]
Další | Efekty zobrazení objektu mohou být následující : PLAIN PLAIN DOWN BLACK BLACK FADED BLACK IN BLACK OUT WHITE IN WHITE OUT Pokud není zadána rychlost je automaticky dosazena hodnota 1. Předdefinované zdroje jsou : BIS SPHERE TVSet FLASHPOINT (od verze 1.75 - zobrazí logo firmy Codemsters) Souborem description.ext mohou být nadefinovány i další vlastní zdroje. Bližší informace naleznete v tomto tutoriálu.


TitleText
Popis | Vypíše zadaný text na obrazovku, přičemž se použije zadaný efekt.
Syntaxe | TitleText["TEXT", "EFEKT", speed]
Vrací hodnotu | žádná
Příklad použití | TitleText["Vypiš tento text", "BLACK OUT", 0.5] TitleText[Localize "STR_Muj_Text", PLAIN", 2]
Další | Efekty textu mohou být následující : PLAIN PLAIN DOWN BLACK BLACK FADED BLACK IN BLACK OUT WHITE IN WHITE OUT speed - je doba v sekundách, po jakou bude vypsáný text zobrazen


TypeOf
Popis: | Vrátí název třídy zadaného objektu.
Syntaxe: | TypeOf objekt
Vrací hodnotu: | řetězec
Příklad použití: | TitleText[Format[Třída hráče = %1], TypeOf Player], "PLAIN"]
Poznámka: | Každý objekt je definován třídou odvozenou od některé základní třídy definované souborem config.bin. Tato funkce vrací právě onu odvozenou třídu zadaného objektu (vozidlo, jednotka). Pro bližší popis tříd objektů si prohlédněte přiložený dekódovaný soubor config.bin k verzi hry 1.91.


UnassignVehicle
Popis | Zruší přiřazení zadané osoby k zadanému vozidlu. Pokud je osoba právě ve vozidle, velitel skupiny vydá rozkaz k vystoupení.
Syntaxe | UnassignVehicle osoba
Vrací hodnotu | žádná
Příklad použití | UnassignVehicle voj1
Další |


UnitReady
Popis | Zjistí, zda-li je jednotka připravena vykonat příkaz. Jednotka není připravena pokud právě provádí nějaký příkaz jako např. "Move", a to až do doby jeho dokončení.
Syntaxe | UnitReady jednotka
Vrací hodnotu | Boolean (true nebo false)
Příklad použití | UnitReady voj1
Další |


Units
Popis | Vrátí pole proměnných obsahující seznam všech jednotek ve skupině zadaného objektu nebo skupiny. Pokud je zadaný objekt mrtev, příkaz vrátí prázdné pole proměnných.
Syntaxe | Units objekt
Vrací hodnotu | pole proměnných
Příklad použití | _grouplist = Units hrac TitleText[Format["%1", Units Group hrac], "PLAIN"]
Další |


Vehicle
Popis | Zjistí název vozidla, ve kterém právě nachází zadaná jednotka. Pokud jednotka není ve vozidle je vrácen název jednotky.
Syntaxe | Vehicle jednotka
Vrací hodnotu | objekt nebo Boolean
Příklad použití | ? Vehicle hrac != jeep1 : voj1 GroupChat "Hráč není v džípu !"
Další

Pokud chcete zjistit, zda-li se vůbec voják v nějakém vozidle nachází a v případě, že ano, tak zjistit název toho vozidla použijte ve scriptu tyto řádky kódu:

? Vehicle voj1 != voj1: TitleText[Format[" Voj1 je právě ve vozidle %1", Vehicle voj1], "PLAIN"]; GoTo "IsInVehicle"

TitleText["Voj1 není v žádném vozidle", "PLAIN"]

#IsInVehicle

skript dále pokračuje


VehicleChat
Popis | Vypíše zadaný text na radiovém kanálu vozidla dané jednotky.
Syntaxe | jednotka VehicleChat "TEXT"
Vrací hodnotu | žádná
Příklad použití | voj1 VehicleChat "Vypiš tento text" - barva textu ŽLUTÁ
Další | Jak upozorňuje výrobce ve svém oficiálním Scripting Command Manual tento příkaz pouze zadaný text uloží do seznamu, ale nerozešle ho na jiné PC. Chcete-li tuto zprávu zobrazit na všech počítačích, musíte ji taky na každém tomto PC tímto příkazem vykonat. Toto jsem však nebyl schopen ověřit, neboť ať jsem to zkoušel jakkoli zpráva byla vždy zobrazena.


VehicleRadio
Popis | Pošle zadanou radiovou zprávu na radiový kanál vozidla dané jednotky. Zpráva musí být definována v souboru description.ext.
Syntaxe | jednotka VehicleRadio "ZPRÁVA"
Vrací hodnotu | žádná
Příklad použití | voj1 VehicleRadio "zprava1" - barva textu ŽLUTÁ
Další | Pokud je tak definováno v souboru description.ext zpráva může obsahovat zvuk i text, nebo jenom zvuk či text.


Velocity
Popis: Zjistí vector pohybu vozidla a vrátí trojrozměrné pole se zjištěnými koordináty.
Syntaxe: Velocity vozidlo
Vrací hodnotu: trojrozměrné pole čísel
Příklad použití: Velocity plane1
Poznámka: POZOR !!!

Tato funkce funguje skutečně pouze je-li jako parametr zadán název vozidla (džíp, tank, letadlo apod), nikoli vojáka nebo jakékoli jiné osoby, spínače nebo logického členu.

Zjištěné hodnoty jsou udány ve standardním souřadnicovém formátu [X, Y, Z] a jsou vypočteny tak, že při spuštění funkce se zaznamenají aktuální souřadnice vozidla (pozice 1) a porovnají se se souřadnicemi zjištěným po určitém časovém intervalu (pozice 2) (při testování této funkce jsem došel k závěru, že tento interval je standardně nastaven přibližně na jednu sekundu, může se však lišit v rozsahu >= +/- 500 milisekund - toto je však zcela nepodstatné, neboť vrácená hodnota vyjadřuje samotný vektor nikoli změnu vektoru). Výsledkem funkce jsou pak souřadnice udávající relativní polohu vozidla po ukončení funkce (pozice 2) k poloze zjištěné před spuštěním funkce (pozice 1), která je tak chápána jako výchozí bod NULA.

Tuto funkci lze velmi účinně využívat ve spojení s příkazem SetVelocity, Speed, SetPos a Position ke zjišťování a nastavování rychlosti, směru a pohybu vozidel (např. zpomalování, zrychlování letadel a vrtulníků, inicializační pozice vozidel apod.)


WaypointPosition

Popis: | Vrátí pozici bodu trasy (waypointu) ve formátu [x,y]. Příkaz je identický s příkazem GetWPPos.
Syntaxe: | WaypointPosition [skupina, pořadové číslo bodu trasy]
Vrací hodnotu: | pole [x,y] x = východ-západ, y = jih-sever.
Příklad použití: | WaypointPosition [Group Player, 2]
Další: | Mějte na paměti, že v Editoru misí má první Waypoint pořadové číslo 0, avšak pro použití v tomto příkazu má první Waypoint pořadové číslo 1. Je vyžadována verze hry 1.75 a vyšší.


Weapons

Popis: | Vrátí pole s názvy všech zbraní, které jednotka právě má.
Syntaxe: | Weapons jednotka
Vrací hodnotu: | pole
Příklad použití: | Weapons voj1
Další: | Vyžadována verze hry 1.75 a vyšší.


West
Popis | Vrátí název strany západu
Syntaxe | West
Vrací hodnotu | strana
Příklad použití | West
Další |


While...Do
Popis: | Provádí smyčku dokud zadaná podmínka vrací True. Pokud se smyčka zopakuje 10.000 krát a podmínka stále vrací True, smyčka se ukončí a zobrazí se chybová zpráva.
Syntaxe: | While "podminka" Do {sada_prikazu}
Vrací hodnotu: | pomocný typ
Příklad použití: | While "a <= b" Do {a = a + 1}
Poznámka: | Bližší popis této konstrukce naleznete v tutoriálu Podmínky.


Operation FlashPoint - Seznam operátorů a matematických funkcí

Operation FlashPoint - Editor - SEZNAM OPERÁTORŮ A MATEMATICKÝCH FUNKCÍ
not a ( ! a) | a < b | grp1 != grp2 | pi
- a | a <= b | side1 != side2 | rad x
+ a | a AND b ( a && b) | abs x | random x
a - b | a OR b (a || b) | acos x | sin x
a + b | a mod b (a % b) | asin x | sqrt x
a != b | arrayA - arrayB | atan x (atg x) | tan x (tg x)
a * b | arrayA + arrayB | cos x | True / False
a / b | stringA + stringB | deg x | x atan2 y
a ^ b | obj1 == obj2 | exp x | $ (HEX konvertor)
a == b | grp1 == grp2 | ln x | _this
a > b | side1 == side2 | log x | ~Prodleva
a >= b | obj1 != obj2 | nil | @Podminka


! a

not a ( ! a )

Popis: | Logický operátor. Neguje hodnotu proměnné.
Syntaxe: | ! a
Vrací hodnotu: | Negace hodnoty
Příklad použití: | ! True , výsledkem False
Další: |


- a

Popis: | Převrací hodnotu čísla z plus na minus a obráceně.
Syntaxe: | - a
Vrací hodnotu: | převrácená hodnota proměnné
Příklad použití: | - - 3 , výsledkem je + 3
Další: |


+ a

Popis: | Odstraní znaménko plus od zdaného čísla nebo vrací kopii pole proměnných.
Syntaxe: | + a
Vrací hodnotu: | kladné číslo nebo pole proměnných
Příklad použití: | + 3 , výsledkem je 3 + [0, 1, 2] , výsledkem je [0, 1, 2]
Další: | Použití této matematické funkce mi není zcela známo.


a - b

Popis: | Odečte b od a.
Syntaxe: | a - b
Vrací hodnotu: | rozdíl
Příklad použití: | 5 - 3, výsledkem je 2
Další: |


a + b

Popis: | Sečte a a b.
Syntaxe: | a + b
Vrací hodnotu: | rozdíl
Příklad použití: | 5 + 3, výsledkem je 8
Další: |


a != b

Popis: | Zjistí, zda-li jsou dvě proměnné rozdílné.
Syntaxe: | a != b
Vrací hodnotu: | boolean (true nebo false)
Příklad použití: | 25 != 31, výsledkem je true
Další: |


a * b

Popis: | Násobí a * b.
Syntaxe: | a * b
Vrací hodnotu: | součin
Příklad použití: | 5 * 3, výsledkem je 15
Další: |


a / b

Popis: | Dělí a / b .
Syntaxe: | a / b
Vrací hodnotu: | podíl
Příklad použití: | 6 / 3, výsledkem je 2
Další: |


a ^ b

Popis: | b-tá mocnina na a .
Syntaxe: | a ^ b
Vrací hodnotu: | mocnina
Příklad použití: | 6 ^ 3, výsledkem je 216
Další: |


a == b

Popis: | Porovná dvě proměnné a zjistí, zda-li jsou shodné.
Syntaxe: | a = = b
Vrací hodnotu: | boolean (true nebo false)
Příklad použití: | a = 25 b = 25 a = = b, výsledkem je true
Další: | Porovnávají-li se dvě řetězvové proměnné, výsledkem bude true pouze bude-li shoda úplná, tzn. "Franta Vonásek" = = "Franta Vonasek" vrátí false, přičemž se nerozlišují malá a velká písmena.


a > b

Popis: | Porovná dvě proměnné a zjistí zdali je proměnná a větší než proměnná b.
Syntaxe: | a > b
Vrací hodnotu: | Boolean (true nebo false)
Příklad použití: | pocitadlo > 5
Další: |


a >= b

Popis: | Porovná dvě proměnné a zjistí zdali je proměnná a větší než proměnná b.
Syntaxe: | a >= b
Vrací hodnotu: | Boolean (true nebo false)
Příklad použití: | pocitadlo >= 5
Další: |


a < b

Popis: | Porovná dvě proměnné a zjistí zdali je proměnná a menší než proměnná b.
Syntaxe: | a < b
Vrací hodnotu: | Boolean (true nebo false)
Příklad použití: | pocitadlo < 5
Další: |


a <= b

Popis: | Porovná dvě proměnné a zjistí zdali je proměnná a menší nebo rovna proměnné b.
Syntaxe: | a <= b
Vrací hodnotu: | Boolean (true nebo false)
Příklad použití: | pocitadlo <= 5
Další: |


And (též &&)

Popis: | Logický operátor. Vrací TRUE, když porovnávané výrazy mají hodnotu TRUE.
Syntaxe: | výraz1And výraz2 výraz1 je první porovnávaný výraz. Musí umožňovat vrácení TRUE/FALSE výraz2 je druhý porovnávaný výraz. Musí umožňovat vrácení TRUE/FALSE
Vrací hodnotu: | Vrací hodnotu TRUE nebo FALSE
Příklad použití: | ? (pocitadlo ==0) And (Alive MujHrac): MujHrac SideChat "Jdu na to!"
Další: |


a OR b

a OR b ( a || b)

Popis: | Logický operátor. Vrací TRUE, polud je alespoň jeden z výrazů true.
Syntaxe: | výraz1OR výraz2 výraz1 je první porovnávaný výraz. Musí umožňovat vrácení TRUE/FALSE výraz2 je druhý porovnávaný výraz. Musí umožňovat vrácení TRUE/FALSE
Vrací hodnotu: | Vrací hodnotu TRUE nebo FALSE
Příklad použití: | ? (pocitadlo ==0) OR (Alive MujHrac): end_loose = true
Další: |


a % b

a mod b ( a % b )

Popis: | Vypočítá zůstatek po dělení.
Syntaxe: | a % b
Vrací hodnotu: | číslo
Příklad použití: | 4.5 % 3, výsledkem je 1.5
Další: | Výsledek je kalkulován v reálné oblasti.


arrayA - arrayB

Popis: | Odebere všechny elementy pole B z pole A.
Syntaxe: | arrayA - arrayB
Vrací hodnotu: | Zkrácené pole proměnných
Příklad použití: | [0, 1, 2, 4, 0, 1, 2, 3, 4, 5] - [1, 2, 3] , výsledkem je [0, 4, 0, 4, 5]
Další: |


arrayA + arrayB

Popis: | Přidá na konec pole A všechny elementy pole B.
Syntaxe: | arrayA + arrayB
Vrací hodnotu: | Rozšířené pole proměnných
Příklad použití: | [0, 1, 2, 3] + [4, 5, 6] , výsledkem je [0, 1, 2, 3, 4, 5, 6]
Další: |


stringA + stringB

Popis: | Spojí dohromady řetězecA + řetězecB.
Syntaxe: | řetězecA + řetězecB
Vrací hodnotu: | zřetězený soubor dat
Příklad použití: | a = "Ahoj, " b = "zdraví " c = "Vás " d = "Ruprt !" e = a + b + c + d, výsledkem je e = "Ahoj, zdraví Vás Ruprt !"
Další: |


obj1 == obj2

Popis: | Porovná dva objekty a zjistí, zda-li jsou shodné.
Syntaxe: | obj1 = = obj2
Vrací hodnotu: | boolean (true nebo false)
Příklad použití: | vehicle hrac = = jeep1
Další: | Pokud je jeden z objektů ObjNull, funkce vrátí false.


grp1 == grp2

Popis: | Porovnaá dvě skupiny a zjistí, zda-li jsou shodné.
Syntaxe: | grp1 = = grp2
Vrací hodnotu: | boolean (true nebo false)
Příklad použití: | group hrac = = group voj1
Další: | Pokud je jedna ze skupin GrpNull, funkce vrátí false.


side1 == side2

Popis: | Porovná dvě strany a zjistí, zda-li jsou shodné.
Syntaxe: | side1 = = side2
Vrací hodnotu: | boolean (true nebo false)
Příklad použití: | side player = = west
Další: |


obj1 != obj2

Popis: | Zjistí, zda-li jsou dva objekty rozdílné.
Syntaxe: | obj1 != obj2
Vrací hodnotu: | boolean (true nebo false)
Příklad použití: | vehicle hrac != jeep1
Další: | Pokud je jeden z objektů ObjNull, funkce vrátí true.


grp1 != grp2

Popis: | Zjistí, zda-li jsou dvě skupiny rozdílné.
Syntaxe: | grp1 != grp2
Vrací hodnotu: | boolean (true nebo false)
Příklad použití: | group hrac != group voj1
Další: | Pokud je jedna ze skupin GrpNull, funkce vrátí true.


side1 != side2

Popis: | Zjistí, zda-li jsou dvě strany rozdílné.
Syntaxe: | side1 ! = side2
Vrací hodnotu: | boolean (true nebo false)
Příklad použití: | side player != west
Další: |


abs x

Popis: | Matemaická funkce. Vrátí absolutní hodnotu čísla x.
Syntaxe: | abs x
Vrací hodnotu: | absolutní hodnotu čísla
Příklad použití: | abs -285, výsledkem je 285
Další: |


acos x

Popis: | Matemaická funkce. Vrátí arcus cosinus čísla x. Výsledek je vrácen ve stupních.
Syntaxe: | acos x
Vrací hodnotu: | arcus cosinus čísla
Příklad použití: | acos 0,5, výsledkem je 60
Další: |


asin x

Popis: | Matemaická funkce. Vrátí arcus sinus čísla x. Výsledek je vrácen ve stupních.
Syntaxe: | asin x
Vrací hodnotu: | arcus sinus čísla
Příklad použití: | asin 0,5, výsledkem je 30
Další: |


atan x

atan x ( atg x )

Popis: | Matemaická funkce. Vrátí arcus tangens čísla x. Výsledek je vrácen ve stupních.
Syntaxe: | atan x
Vrací hodnotu: | arcus tangens čísla
Příklad použití: | asin 1, výsledkem je 45
Další: |


cos x

Popis: | Matemaická funkce. Vrátí cosinus čísla x. Agrument je ve stupních.
Syntaxe: | cos x
Vrací hodnotu: | cosinus čísla
Příklad použití: | cos 60, výsledkem je 0,5
Další: |


deg x

Popis: | Matemaická funkce. Převede radiany na stupně.(opak rad x)
Syntaxe: | deg x
Vrací hodnotu: | číslo ve stupních
Příklad použití: | deg 1, výsledkem je 57.295
Další: |


exp x

Popis: | Matemaická funkce. Vrátí exponenciál čísla x.
Syntaxe: | exp x
Vrací hodnotu: | exponenciál čísla
Příklad použití: | exp 1 , výsledkem je 2.7182
Další: |


ln x

Popis: | Matemaická funkce. Vrátí přirozený logaritmus čísla x.
Syntaxe: | ln x
Vrací hodnotu: | přirozený logaritmus čísla
Příklad použití: | ln 10 , výsledkem je 2.302
Další: |


log x

Popis: | Matemaická funkce. Vypočítá logaritmus čísla x se základem 10.
Syntaxe: | log x
Vrací hodnotu: | číslo
Příklad použití: | log 10 , výsledkem je 1
Další: |


nil

Popis: | Vymaže (odstraní) proměnou.
Syntaxe: | a = Nil
Vrací hodnotu: | jakákoli
Příklad použití: | prom1 = Nil
Další: |


pi

Popis: | Číslo pí (180 stupňů převedeno na radiány)
Syntaxe: | pi
Vrací hodnotu: | číslo
Příklad použití: | pi, výsledkem je 3.1415
Další: |


rad x

Popis: | Matemaická funkce. Převede stupně na radiány.(opak deg x)
Syntaxe: | rad x
Vrací hodnotu: | číslo ve radiánech
Příklad použití: | rad 180, výsledkem je 3.1415 (pi)
Další: |


sin x

Popis: | Matemaická funkce. Vrátí sinus čísla x. Argument je ve stupních.
Syntaxe: | sin x
Vrací hodnotu: | sinus čísla
Příklad použití: | sin 30, výsledkem je 0,5
Další: |


sqrt x

Popis: | Matemaická funkce. Odmocnina z x.
Syntaxe: | sqrt x
Vrací hodnotu: | odmocninu čísla
Příklad použití: | sqrt 9, výsledkem je 3
Další: |


tan x ( tg x )

Popis: | Matemaická funkce. Vrátí tangens čísla x. Argument je ve stupních.
Syntaxe: | tan x nebo tg x
Vrací hodnotu: | tangens čísla
Příklad použití: | tan 45, výsledkem je 1
Další: |


x atan2 y

Popis: | Matemaická funkce. Vrátí arcus tangens z x/y. Výsledek je vrácen ve stupních.
Syntaxe: | x atan2 y
Vrací hodnotu: | arcus tangens x/y
Příklad použití: | 5 atan2 3, výsledkem je 59.0362
Další: |


$

$ (HEX konvertor)

Popis: | Převede hexadecimální číslo do desítkového formátu.
Syntaxe: | $HEX
Vrací hodnotu: | číslo v desítkové soustavě
Příklad použití: | $FF - výsledkem je 16
Další: |


Výčet akcí k příkazu Action

Action - výčet akcí

Vzhledem k tomu, že jsem nebyl schopen sehnat kompletní seznam všech akcí a akce uvedené v seznamu v předchozích verzích této nápovědy nebyly všechny funkční, uvádím zde ve většině případů příkaz pro náhradní řešení provedení požadované akce. Mějte na paměti, že obvykle existuje několik způsobů jak dosáhnout požadovaného výsledku.

AssignAsCommander, OrderGetIn, MoveInCommander | nastoupit jako velitel
AssignAsDriver, OrderGetIn, MoveInDriver | nastoupit jako řidič, pilot
AssignAsGunner, OrderGetIn, MoveInGunner | nastoupit jako střelec
AssignAsCargo, OrderGetIn, MoveInCargo | nastoupit jako pasažér
SetDammage, SetDamage, ["HEAL", jmeno_zdravotnika] | léčit
SetDammage, SetDamage | opravit
SetFuel | dotankovat
AddMagazine, AddWeapon, FillWeaponsFromPool | dozbrojit
UnassignVehicle, ["EJECT"] | vystoupit, vyskočit
SelectWeapon | vybrat zbraňzbraň
SetFlagOwner | zmocnit se vlajky, vrátit vlajku
SetUnitPos | lehnout, vstát
["WEAPONINHAND"] | zbraň do rukou
["WEAPONONBACK"] | zbraň na záda
["SITDOWN"] - pouze při SetBehaviour "SAFE" / "CARELESS" PlayMove "EffectStandSitDown", "EffectStandSitDownVer1", "EffectStandSitDownVer2" nebo "EffectStandSitDownStill" | sednout
Land / Move | přistát / zrušit přistání
MoveInDriver | na místo řidiče, pilota
MoveInGunner | na místo střelce
MoveInCommander | na místo velitele
MoveInCargo | na místo pasažéra
["HIDEBODY", jméno mrtvoly] | ukrýt tělo
["TOUCHOFF"] | odpálit nálož
["SETTIMER"] | nastavit časovač nálože na 30 vteřin
["DEACTIVATE"] | deaktivovat
["NVGOGGLES"] | nasadit/sundat noční vidění
vrtulník Move Position vrtulník(ten samý) | stabilizátor
vrtulník Move WaypoinPosition [vrtulník(ten samý), další WP] | vypnout stabilizátor
["STROKEFIST"] | zaútočit ručně
["STROKEGUN"] | zaútočit zbraní
["REARM", "Nazev_zasobniku"] | zvednout zásobník


PlayMusic

Seznam hudebních skladeb hry
Toto je seznam již definovaných skladeb :

Skladby z OFP Resistance

res01a.ogg - PlayMusic "Rtrack1a"
res01b.ogg - PlayMusic "Rtrack1b"
res02.ogg - PlayMusic "Rtrack2"
res03.ogg - PlayMusic "Rtrack3"
res04.ogg - PlayMusic "Rtrack4"
res05.ogg - PlayMusic "Rtrack5"
res06.ogg - PlayMusic "Rtrack6"
res07.ogg - PlayMusic "Rtrack7"
res08.ogg - PlayMusic "Rtrack8"
res09.ogg - PlayMusic "Rtrack9"
res10.ogg - PlayMusic "Rtrack10"
Seventh_Darken.ogg - PlayMusic "7thDarken"
Seventh_My_Life.ogg - PlayMusic "7thMyLife"

Skladby z OFP Cold War Crisis

01.ogg - PlayMusic "Track1"
02.ogg - PlayMusic "Track2"
03.ogg - PlayMusic "Track3"
04.ogg - PlayMusic "Track4"
05.ogg - PlayMusic "Track5"
06.ogg - PlayMusic "Track6"
07.ogg - PlayMusic "Track7"
08.ogg - PlayMusic "Track8"
09.ogg - PlayMusic "Track9"
10.ogg - PlayMusic "Track10"
11.ogg - PlayMusic "Track11"
12.ogg - PlayMusic "Track12"
13.ogg - PlayMusic "Track13"
14.ogg - PlayMusic "Track14"
15.ogg - PlayMusic "Track15"
16.ogg - PlayMusic "Track16"
Frost.ogg - PlayMusic "Frost"
Seventh_decide.ogg - PlayMusic "7thDecide"
Seventh_iamgonnafly.ogg - PlayMusic "7thIamGonaFly" - Tady pozor, je tu chyba, oproti nazvu souboru je tu jen jedno "n"
Seventh_lifeless.ogg - PlayMusic "7thLifeless"
Seventh_overdose.ogg - PlayMusic "7thOverdose"

Soubor music.pbo v CWC obsahuje jeste soubor se skladbou Mixdown.ogg, ale ten neni nadefinovany, takze pro jeho pouziti by bylo nezbytné ho definovat v description.ext mise.


Seznam zbraní a munice

Seznam všech použitelných zbraní, munice a vybavení

(pouze oficiální - do verze hry 1.96)

Weapons | Magazines | Popis
9K32Launcher | 9K32Launcher | Raketomet s tepelně naváděnou střelou pro protivzdušnou obranu používaný ruskou armádou a partyzány.
AALauncher | AALauncher | Raketomet s tepelně naváděnou střelou pro protivzdušnou obranu používaný americkou armádou
AK47 | AK47 | Samopal ruské armády a partyzánů
AK47CZ | AK47 | Samopal ruské armády a partyzánů
AK47GrenadeLauncher | AK47 GrenadeLauncher Flare FlareGreen FlareRed FlareYellow | Samopal ruské armády a partyzánů s granátometem
AK74 | AK74 | Samopal ruské armády a partyzánů
AK74GrenadeLauncher | AK74 GrenadeLauncher Flare FlareGreen FlareRed FlareYellow | Samopal ruské armády a partyzánů s granátometem
AK74SU | AK74 | Samopal ruské armády a partyzánů
AT3Launcher | AT3Launcher | Raketomet pro obrněný transportér M113 a BVP
AT4Launcher | AT4Launcher | Raketomet ruských a partyzánských raketometčíků
Binocular |  | Dalekohled
Browning | Browning | Těžký kulomet americké armády používaný pro : americká loď Mark II. PBR americký jeep s kulometem americký obrněný transportér M113 americký vrtulník UH60 s kulometem americký vrtulník CH-47D
Cannon25HE | Cannon25HE | Těžký kulomet
Cannon30 Cannon30AP | Cannon30AP Cannon30HE | Těžký kulomet ruského vrtulníku V-80 Kamov Kanón pro BMP2
CarHorn |  | Automobilový klakson
CarlGustavLauncher | CarlGustavLauncher | Raketomet amerických raketometčíků
CH29TLauncher | CH29TLauncher | Teplem naváděná raketa pro SU25
 | Flare | Světlice bílá
 | FlareGreen | Světlice zelená
 | FlareRed | Světlice červená
 | FlareYellow | Světlice žlutá
 | GrenadeLauncher | Základní třída - raketomet. Používá se pouze pro odvození ostatních tříd zbraní a přidávání nebo ubírání munice do raketometů.
Gun105 | Heat105 Shel105 | Dělo amerického tanku M60, ruského tanku T55-G a partyzánského tanku T55
Gun120 | Heat120 Shel120 | Dělo amerického tanku M1Abrams a ruských tanků T-72 a T-80
Gun125 | Heat125 Shel125 | Dělo. Ve verzi hry 1.75 není použito u žádného vozidla.
Gun73 | Heat73 Shel73 | Dělo ruského obrněného transportéru BVP
 | HandGrenade | Ruční granát
 | Heat105 | Protipěchotní tříštivá munice do děla Gun105
 | Heat120 | Protipěchotní tříštivá munice do děla Gun120
 | Heat125 | Protipěchotní tříštivá munice do děla Gun125
 | Heat73 | Protipěchotní tříštivá munice do děla Gun73
HellfireLauncher | HellfireLauncher | Raketomet s automatickým naváděním. Lze použít do všech vrtulníků.
HellfireLauncherCobra | HellfireLauncherCobra | Raketomet s automatickým naváděním pro americký vrtulník AH1.
HellfireLauncherHind | HellfireLauncherHind | Raketomet s automatickým naváděním pro ruský vrtulník Mi-24 Hind.
HK | HK | Samopal s tlumičem amerických speciálních jednotek BlackOps.
HellfireLauncherKamov | HellfireLauncherKamov | Raketomet s automatickým naváděním pro ruský vrtulník V-80 Kamov.
LAWLauncher | LAWLauncher | Lehký raketomet amerických lehkých raketometčíků.
LaserDesignatorOH | LaserDesignatorOH | Laserový zaměřovač pro LGB
LaserGuidedBombLauncher | LaserGuidedBombLauncher | Laserem naváděná bomba (LGB) pro letouny A10-LGB
M16 | M16 Mortar | Automatická puška amerických vojáků.
M16GrenadeLauncher | M16 GrenadeLauncher Flare FlareGreen FlareRed FlareYellow | Automatická puška amerických vojáků a granátometem.
M16S | M16 Mortar | Automatická puška amerických vojáků.
M21 | M21 | Americká ostřelovací puška.
M4 | M4 Mortar | Americký samopal leteckých a tankových posádek.
M60 | M60 | Americký lehký kulomet.
MachineGun12_7 | MachineGun12_7 | Kulomet pro : americký obrněný transportér M113 americký tank M1Abrams ruský tank T-80
MachineGun30A10 | MachineGun30A10 | Kulomet pro americké letadlo A10.
MachineGun30E | MachineGun30E | Kulomet pro ruský vrtulník Mi-24 Hind.
MachineGun30W | MachineGun30W | Kulomet pro americký vrtulník AH1.
MachineGun7_6 | MachineGun7_6 | Kulomet pro : americký tank M60 ruský obrněný transportér BVP ruský tank T-72 ruský tank T-55G tank partyzánů T-55
MaverickLauncher | MaverickLauncher | Raketomet střel vzduch-země pro americké letadlo A10.
 | Mine | Mina.
 | MineE | Mina.
Mortar | Mortar | minometný granát
NVGoggles |  | Brýle pro noční vidění
Phone |  | Telefon - pro použití s příkazem vojak SwitchMove "FXStandToTelHand".
 | PipeBomb | Nálož s dálkovým nebo časovým odpálením.
PK |  | Ruský lehký kulomet.
Rocket57x192 | Rocket57x192 | Neřízené rakety pro ruský vrtulník Mi-17
Rocket57x64 | Rocket57x64 | Neřízené rakety pro ruský vrtulník Mi-24-Hind
Rocket57x40Kamov | Rocket57x40Kamov | Neřízené rakety pro ruský vrtulník V-80 Kamov
RPGLauncher | RPGLauncher | Lehký raketomet ruských lehkých raketometčíků.
 | Shell105 | Protitanková průrazná munice pro dělo Gun105
 | Shell120 | Protitanková průrazná munice pro dělo Gun120
 | Shell125 | Protitanková průrazná munice pro dělo Gun125
 | Shell73 | Protitanková průrazná munice pro dělo Gun73
 | SmokeShell | Dýmovnice
 | SmokeShellGreen | Dýmovnice zelená
 | SmokeShellRed | Dýmovnice červená
SportCarHorn |  | Klakson sportovního auta.
 | StrokeFist | Úder pěstí. V akčním menu se Vám zobrazí nabídka: Nabít Pěst :o)))
StrokeGun |  | Úder zbraní. V akčním menu se Vám zobrazí nabídka: Nabít Úder :o)))
SVDDragunov | SVDDragunov | Ruská ostřelovací puška.
TruckHorn |  | Klakson nákladního vozidla.
VulcanCannon | VulcanCannon | Kanón pro Vulcan.
ZsuCannon |  | Čtyřhlavňový kanón pro ruskou Šilku.
ZuniLauncher38 | ZuniLauncher38 | Neřízené rakety pro americké vrtulníky AH1 a UH60
Oficiální AddOny
Bizon | BizonMag | Samopal pro ruské speciální jednotky SpecNaz s tlumičem
Kozlice | KozliceBall | Jednoraná kulovnice - lze přiřadit komukoli.
XMS | M4 | Americká automatická puška s optikou
Steyr | SteyrMag | Americký samopal s optikou.
LaserDesignator | LaserDesignator | Laserový značkovač
Beretta | BerettaMag | Pistole
CZ75 | CZ75Mag | Pistole
Glock | GlockMag | Pistole
GlockS | GlockSMag | Pistole (Glock 17S)
Revolver | RevolverMag | Revolver Smith & Wesson
HuntingRifle | HuntingRifleMag | Lovecká puška
Ingram | IngramMag | Plnoautomatická pistole (ekvivalent UZI)
Skorpion | SkorpionMag | Pistole
Tokarev | TokarevMag | Pistole
Uzi | UziMag | Samopal
FAL | FALMag | Samopal
HKG3 | HKG3Mag | Samopal
G36a | G36aMag | Samopal s optikou

Poznámka :

Názvy zbraní a munice jednotlivých neoficiálních AddOnů tento seznam neobsahuje. Tyto názvy je nutné hledat v dekódovaných souborech config.cpp těchto AddOnů. Mnoho lidí se na mě obrátilo s tím, že v předchozích verzích této nápovědy nebyl tento seznam zcela vyčerpávající. Nyní je kompletně doplněn a lépe vysvětlen, avšak pouze pro zbraně a munici z oficiálního vybavení hry verze 1.96.


Pohyby a gesta

Seznam všech použitelných parametrů příkazů

PlayMove a SwitchMove

5TCoDriver | CombatSprintF | HandGunPutDownToHandGunStand | Pilot
5TCoDriverDead | CombatSprintLF | HandGunStand | PutDown
5TCoDriverDying | CombatSprintRF | HandGunStand | PutDownLying
5TCoDriverV1 | CombatStillPlayer | HandGunStandBase | PutDownLyingToLying
5TDriver | CombatStillV1 | HandGunStandBase | PutDownToCombat
5TDriverDead | CombatStrokeGun | HandGunStandDead | ScudCoDriver
5TDriverDying | CombatStrokeGunEnd | HandGunStandDeadVer2 | ScudCoDriverDead
5TDriverV1 | CombatThrowGrenadeEnd | HandGunStandDying | ScudCoDriverDying
A10Pilot | CombatThrowGrenadeEnd | HandGunStandDying | ScudCoDriverV1
A10PilotDead | CombatThrowGrenadeStart | HandGunStandDyingVer2 | ScudDriver
A10PilotDying | CombatThrowGrenadeStart | HandGunStandRelaxed | ScudDriverDead
A10PilotV1 | CombatThrowGrenadeStart | HandGunStandRelaxedStill | ScudDriverDying
AH1Gunner | CombatToBinoc | HandGunStandRunB | ScudDriverV1
AH1GunnerDead | CombatToCrouch | HandGunStandRunB | showHandGun
AH1GunnerDying | CombatToHandGunStand1 | HandGunStandRunB | SitDownDead
AH1GunnerV1 | CombatToHandGunStand2 | HandGunStandRunF | SitDownToStand
AH1Pilot | CombatToLying | HandGunStandRunF | SkodaCoDriver
AH1PilotDead | CombatToMedic | HandGunStandRunL | SkodaCoDriverBack
AH1PilotDying | CombatToPutDown | HandGunStandRunLB | SkodaCoDriverBackDead
AH1PilotV1 | CombatToStand | HandGunStandRunLF | SkodaCoDriverBackDying
Binoc | CombatToTakeFlag | HandGunStandRunR | SkodaCoDriverBackV1
BinocCrouch | CombatToTreated | HandGunStandRunRB | SkodaCoDriverDead
BinocCrouchToCrouch | CombatToWeapon | HandGunStandRunRB | SkodaCoDriverDying
BinocHandGunCrouchActions | CombatTurnL | HandGunStandRunRF | SkodaCoDriverV1
BinocHandGunCrouchToHandGunCrouch | CombatTurnLRelaxed | HandGunStandToBinocHandGunStand | SkodaDriver
BinocHandGunLyingActions | CombatTurnR | HandGunStandToCivil1 | SkodaDriverDead
BinocHandGunLyingToHandGunLying | CombatTurnRRelaxed | HandGunStandToCivil2 | SkodaDriverDying
BinocHandGunStandActions | CombatWalkB | HandGunStandToCombat1 | SkodaDriverV1
BinocHandGunStandToHandGunStand | CombatWalkF | HandGunStandToCombat2 | Stand
BinocLying | CombatWalkL | HandGunStandToHandGunCrouch | StandBase
BinocLyingToLying | CombatWalkLB | HandGunStandToHandGunMedic | StandDead
BinocStand | CombatWalkLF | HandGunStandToHandGunPutDown | StandDeadVer2
BinocStandToStand | CombatWalkR | HandGunStandToHandGunTreated | StandDying
BinocToCombat | CombatWalkRB | HandGunStandToStand1 | StandDyingVer2
BMPCommander | CombatWalkRF | HandGunStandToStand2 | StandDyingVer2
BMPCommanderOut | CommandEngageAtWill | HandGunStandTurnL | StandGetInCar
BMPCommanderOutDead | Commander | HandGunStandTurnL | StandGetInTank
BMPCommanderOutDying | CommandFireAtWill | HandGunStandTurnLRelaxed | StandGetOutTank
BMPCommanderOutV1 | CommandFormation | HandGunStandTurnR | StandPutDown
BMPCommanderV1 | CommandForward | HandGunStandTurnR | StandPutDownToStand
BMPDriver | CommandHoldFire | HandGunStandTurnRRelaxed | StandRunF
BMPDriverOut | CommandStop | HandGunStandVar2 | StandStrokeFist
BMPDriverOutDead | Crouch | HandGunStandWalkB | StandStrokeFistEnd
BMPDriverOutDying | CrouchDead | HandGunStandWalkB | StandTakeFlag
BMPDriverOutV1 | CrouchDying | HandGunStandWalkF | StandTakeFlagToStand
BMPDriverV1 | CrouchDying | HandGunStandWalkF | StandThrowGrenadeEnd
BMPGunner | CrouchIM | HandGunStandWalkL | StandThrowGrenadeStart
BMPGunnerOut | CrouchReloadMagazine | HandGunStandWalkLB | StandToBinocStand
BMPGunnerOutDead | CrouchRunB | HandGunStandWalkLF | StandToCombat
BMPGunnerOutDying | CrouchRunF | HandGunStandWalkR | StandToHandGunStand1
BMPGunnerOutV1 | CrouchRunL | HandGunStandWalkRB | StandToHandGunStand2
BMPGunnerV1 | CrouchRunLB | HandGunStandWalkRF | StandToSitDown
busCargoDead busCargoDying | CrouchRunLF | HandGunTakeFlag | StandToStandPutDown
busCargoDying | CrouchRunR | HandGunTakeFlagActions | StandToStandTakeFlag
busCargoV1 | CrouchRunRB | HandGunTakeFlagToHandGunStand | StandTurnL
busDriverDead busDriverDying | CrouchRunRF | HandGunTreatedActions | StandTurnR
busDriverV1 | CrouchSprintF | HandGunTreatedToHandGunStand | StandVar2
Cargo | CrouchSprintLF | HRLGunner | StandWalkB
CargoDead | CrouchSprintRF | HRLGunnerDead | StandWalkF
CargoDying | CrouchToBinocCrouch | HRLGunnerDying | StandWalkL
CargoVer1 | CrouchToCombat | HRLGunnerV1 | StandWalkLB
CargoVer2 | CrouchToCrouchSprintF | JeepCoDriver | StandWalkLF
CargoVer3 | CrouchToHandGunCrouch1 | JeepCoDriverBack | StandWalkR
CargoVer4 | CrouchToHandGunCrouch2 | JeepCoDriverBackDead | StandWalkRB
CargoVer5 | CrouchToLying | JeepCoDriverBackDying | StandWalkRF
CesnaCargo | CrouchToWeapon | JeepCoDriverBackV1 | StatesExt
CesnaCargoDead | CrouchTurnL | JeepCoDriverDead | T55Commander
CesnaCargoDying | CrouchTurnR | JeepCoDriverDying | T55CommanderOut
CesnaCargoV1 | CrouchWalkB | JeepCoDriverV1 | T55CommanderOutDead
CesnaPilot | CrouchWalkF | JeepDriver | T55CommanderOutDying
CesnaPilotDead | CrouchWalkL | JeepDriverDead | T55CommanderOutV1
CesnaPilotDying | CrouchWalkLB | JeepDriverDying | T55CommanderV1
CesnaPilotV1 | CrouchWalkLF | JeepDriverV1 | T55DriverOut
Civil | CrouchWalkR | JeepGunner | T55DriverOutDead
CivilBase | CrouchWalkRB | JeepGunnerDead | T55DriverOutDying
CivilBase | CrouchWalkRF | JeepGunnerDying | T55DriverOutV1
CivilBase Default | DeadState | JeepGunnerV1 | T55Gunner
CivilDead | Driver | LadderDownBase | T55GunnerV1
CivilDeadVer2 | EffectCombatStand | LadderDownEnd | T72Commander
CivilDying | EffectStand | LadderDownLoop | T72CommanderOut
CivilDyingVer2 | EffectStandmove | LadderDownStart | T72CommanderOutDead
CivilDyingVer2 | EffectStandSalute | LadderStatic | T72CommanderOutDying
CivilGetInCar | EffectStandSaluteEnd | LadderUpEnd | T72CommanderOutV1
CivilGetInTank | EffectStandSaluteStart | LadderUpLoop | T72CommanderV1
CivilGetOutTank | EffectStandSitDown | LadderUpStart | T72Driver
CivilLying | EffectStandSitDownStill | Lying | T72DriverOut
CivilLyingCrawlB | EffectStandSitDownVer1 | LyingCrawlB | T72DriverOutDead
CivilLyingCrawlF | EffectStandSitDownVer2 | LyingCrawlF | T72DriverOutDying
CivilLyingCrawlL | EffectStandStill | LyingCrawlL | T72DriverOutV1
CivilLyingCrawlLB | EffectStandTalk | LyingCrawlLB | T72Gunner
CivilLyingCrawlLF | EffectWeaponPanic | LyingCrawlLF | T72GunnerOut
CivilLyingCrawlR | FXangel | LyingCrawlR | T72GunnerOutDead
CivilLyingCrawlRB | FXangel2 | LyingCrawlRB | T72GunnerOutDying
CivilLyingCrawlRF | FXBase | LyingCrawlRF | T72GunnerOutV1
CivilLyingDead | FXCivilArmsAkimboL | LyingDead | T72GunnerV1
CivilLyingDying | FXCivilArmsAkimboR | LyingDying | T80CommanderOut
CivilLyingDying | FXCivilFoldOnesArms | LyingFastCrawlF | T80CommanderOutDead
CivilLyingFastCrawlF | FXCivilHandMouth | LyingNoAim | T80CommanderOutDying
CivilLyingNoAim | FXCivilLookaround | LyingReloadMagazine | T80CommanderOutV1
CivilLyingPutDown | FXCivilLookaround2 | LyingStillV1 | T80GunnerOut
CivilLyingPutDownToCivilLying | FXCivilLookback | LyingThrowGrenadeEnd | T80GunnerOutDead
CivilLyingStillV1 | FXdismay | LyingThrowGrenadeStart | T80GunnerOutDying
CivilLyingTakeFlag | FXexecution | LyingToBinocLying | T80GunnerOutV1
CivilLyingTakeFlagToCivilLying | FXexecutionDead | LyingToCombat | TakeFlag
CivilLyingToCivil | FXFromHand | LyingToCombatRun | TakeFlagToCombat
CivilLyingToCivilLyingPutDown | FXFromKneel | LyingToCrouch | TractorDriver
CivilLyingToCivilLyingTakeFlag | FXFromTable | LyingToHandGunLying1 | TractorDriverDead
CivilLyingToHandGunLying1 | FXInHand | LyingToHandGunLying2 | TractorDriverDying
CivilLyingToHandGunLying2 | FXInHandStat | LyingToPutDownLying | TractorDriverV1
CivilPutDown | FXInKneel | LyingToTreatedLying | Treated
CivilPutDownToCivil | FXNewcivil | LyingToWeapon | TreatedLying
CivilRunB | FXshow1 | LyingTurnL | TreatedLyingToLying
CivilRunF | FXshow2 | LyingTurnR | TreatedToCombat
CivilRunL | FXshow3 | M113Driver | turnLRelaxed
CivilRunLB | FXshow4 | M113DriverOut | UazCoDriver
CivilRunLF | FXshow5 | M113DriverOutDead | UazCoDriverDead
CivilRunR | FXSitHandsOnTable | M113DriverOutDying | UazCoDriverDying
CivilRunRB | FXSitLeftHandDown | M113DriverOutV1 | UazCoDriverV1
CivilRunRF | FXSitRightHandDown | M113DriverV1 | UazDriver
CivilRunThrowGrenadeEnd | FXStandAtt | M113Gunner | UazDriverDead
CivilRunThrowGrenadeStart | FXStandAttVar1 | M113GunnerDead | UazDriverDying
CivilStillV1 | FXStandBug | M113GunnerDying | UazDriverV1
CivilStillV1 | FXStandDangle | M113GunnerV1 | UH60Gunner
CivilStillV1 | FXStandDip | M113Medic | UH60GunnerDead
CivilTakeFlag | FXStandDropTel | M113MedicV1 | UH60GunnerDying
CivilTakeFlagToCivil | FXStandEndTable | M1A1Commander | UH60GunnerV1
CivilThrowGrenadeEnd | FXStandFromDip | M1A1CommanderOut | UH60Pilot
CivilThrowGrenadeStart | FXStandFromTable | M1A1CommanderOutDead | UH60PilotDead
CivilToCivilLying | FXStandhip | M1A1CommanderOutDying | UH60PilotDying
CivilToCivilPutDown | FXStandRotateTable | M1A1CommanderOutV1 | UH60PilotV1
CivilToCivilTakeFlag | FXStandShowTable | M1A1CommanderV1 | UralCoDriver
CivilToHandGunStand1 | FXStandStraight | M1A1Driver | UralCoDriverDead
CivilToHandGunStand2 | FXStandSur | M1A1DriverOut | UralCoDriverDying
CivilTurnL | FXStandSurDead | M1A1DriverOutDead | UralCoDriverV1
CivilTurnR | FXStandSurDown | M1A1DriverOutDying | UralDriver
CivilWalkB | FXStandSurUniv | M1A1DriverOutV1 | UralDriverDead
CivilWalkF | FXStandTelLoop | M1A1Gunner | UralDriverDying
CivilWalkL | FXStandToDip | M1A1GunnerV1 | UralDriverV1
CivilWalkLB | FXStandToTable | M2Gunner | V3SCoDriver
CivilWalkLF | FXStandToTel | M2GunnerDead | V3SCoDriverDead
CivilWalkR | FXStandToTelHand | M2GunnerDying | V3SCoDriverDying
CivilWalkRB | FXStandUnivTable | M2GunnerV1 | V3SCoDriverV1
CivilWalkRF | FXToHand | M60Commander | V3SDriver
Combat | FXToKneel | M60CommanderOut | V3SDriverDead
CombatDead | FXToTable | M60CommanderOutDead | V3SDriverDying
CombatDeadVer2 | FXWomanSur | M60CommanderOutDying | V3SDriverV1
CombatDeadVer3 | Gunner | M60CommanderOutV1 | Weapon
CombatDying | HandGunCrouch | M60CommanderV1 | WeaponDead
CombatDying | HandGunCrouch | M60Driver | WeaponDeadVer2
CombatDyingVer | HandGunCrouchBase | M60DriverOut | WeaponDying
CombatDyingVer2 | HandGunCrouchBase | M60DriverOutDead | WeaponDying
CombatDyingVer3 | HandGunCrouchBase | M60DriverOutDying | WeaponDyingVer2
CombatDyingVer3 | HandGunCrouchDead | M60DriverOutV1 | WeaponDyingVer2
CombatGetInCar | HandGunCrouchDeadVer2 | M60DriverV1 | WeaponReloadAT
CombatGetInTank | HandGunCrouchDying | M60Gunner | WeaponToCombat
CombatGetOutTank | HandGunCrouchDying | M60GunnerV1 | WeaponToCrouch
CombatRelaxed | HandGunCrouchDyingVer2 | ManPosBinoc | WeaponToHandGunCrouch1
CombatRelaxedDead | HandGunCrouchToBinocHandGunCrouch | ManPosBinocLying | WeaponToHandGunCrouch2
CombatRelaxedDeadVer2 | HandGunCrouchToCrouch1 | ManPosBinocStand | WeaponToLying
CombatRelaxedDying | HandGunCrouchToCrouch2 | ManPosHandGunStand | WeaponTurnL
CombatRelaxedDyingVer2 | HandGunCrouchToHandGunLying | Medic | WeaponTurnR
CombatRelaxedStill | HandGunCrouchToHandGunStand | MedicToCombat | WeaponWalkB
CombatReloadMagazine | HandGunCrouchToWeapon1 | Mi17Pilot | WeaponWalkF
CombatReloadMGun | HandGunCrouchToWeapon2 | Mi17PilotDead | WeaponWalkL
CombatReloadMortarEnd | HandGunCrouchVar2 | Mi17PilotDying | WeaponWalkLB
CombatReloadMortarStart | HandGunDie | Mi17PilotV1 | WeaponWalkLF
CombatRunB | HandGunLying | Mi24Gunner | WeaponWalkR
CombatRunBDead | HandGunLyingCrawlB | Mi24GunnerDead | WeaponWalkRB
CombatRunBDeadVer2 | HandGunLyingCrawlB | Mi24GunnerDying | WeaponWalkRF
CombatRunBDying | HandGunLyingCrawlB | Mi24GunnerV1 | ZSUCommander
CombatRunBDyingVer2 | HandGunLyingCrawlF | Mi24Pilot | ZSUCommanderOut
CombatRunDead | HandGunLyingDying | Mi24PilotDead | ZSUCommanderOutDead
CombatRunDeadVer2 | HandGunLyingPutDownActions | Mi24PilotDying | ZSUCommanderOutDying
CombatRunDying | HandGunLyingPutDownToHandGunLying | Mi24PilotV1 | ZSUCommanderOutV1
CombatRunDyingVer2 | HandGunLyingThrowGrenade2 | Nemocnej | ZSUCommanderV1
CombatRunF | HandGunLyingToBinocHandGunLying | OnChair | ZSUDriver
CombatRunFToLying | HandGunLyingToCivilLying1 | Para | ZSUDriverDead
CombatRunL | HandGunLyingToCivilLying2 | ParaDead | ZSUDriverDying
CombatRunLB | HandGunLyingToHandGunCrouch | ParaDying | ZSUDriverV1
CombatRunLF | HandGunLyingToHandGunLyingPutDown | ParaV1 | ZSUGunner
CombatRunNF | HandGunLyingToHandGunLyingTreated | PBRDriver | ZSUGunnerOut
CombatRunR | HandGunLyingToLying1 | PBRDriverDead | ZSUGunnerOutDead
CombatRunRB | HandGunLyingToLying2 | PBRDriverDying | ZSUGunnerOutDying
CombatRunRF | HandGunLyingTreatedActions | PBRDriverV1 | ZSUGunnerOutV1
CombatRunThrowGrenadeEnd | HandGunLyingTreatedToHandGunLying | PBRGunner | ZSUGunnerV1
CombatRunThrowGrenadeStart | HandGunLyingVar2 | PBRGunnerDead |
CombatRunThrowGrenadeStart | HandGunMedicToHandGunStand | PBRGunnerDying |
CombatRunThrowGrenadeStart | HandGunPutDownActions | PBRGunnerV1 |


EventHandlers List

Popis správců událostí (EventHandlers) existujících ve verzi hry do 1.91 CZ
Killed | Tato událost proběhne ihned poté co je daná jednotka zabita. Správce této události vytvoří dvojrozměrné pole, kde : _this Select 0 = název zabité jednotky _this Select 1 = název toho kdo jednotku zabil Tato událost proběhne vždy pouze lokálně, resp. pouze v počítači hráče a není rozeslána do ostatních počítačů při MP misi.
Hit | Tato událost proběhne ihned poté co je daná jednotka zasažena. Správce této události vytvoří trojrozměrné pole, kde : _this Select 0 = zasažená jednotka _this Select 1 = název toho kdo jednotku zasáhl _this Select 2 = míra poškození (hodnota Damage) Tato událost proběhne vždy pouze lokálně, resp. pouze v počítači hráče a není rozeslána do ostatních počítačů při MP misi.
Engine | Tato událost proběhne vždy, když se nastartuje nebo vypne motor daného vozidla. Správce této události vytvoří dvojrozměrné pole, kde : _this Select 0 = název vozidla _this Select 1 = stav motoru (True -> motor běží, False -> motor je vypnut)
GetIn | Tato událost proběhne vždy, když do zadaného vozidla nastoupí nějaká jednotka. Správce této události vytvoří trojrozměrné pole, kde : _this Select 0 = název vozidla, do kterého jednotka nastoupila _this Select 1 = pozice kam jednotka nastoupila ("driver", "gunner", "commander", "cargo") _this Select 2 = název jednotky, která právě nastoupila
GetOut | Tato událost proběhne vždy, když ze zadaného vozidla vystoupí nějaká jednotka. Správce této události vytvoří trojrozměrné pole, kde : _this Select 0 = název vozidla, ze kterého jednotka vystoupila _this Select 1 = pozice, z které jednotka vystoupila ("driver", "gunner", "commander", "cargo") _this Select 2 = název jednotky, která právě vystoupila
Fired | Tato událost proběhne vždy, když zadaná jednotka vystřelí, hodí granát apod. Správce této události vytvoří pětirozměrné pole, kde : _this Select 0 = název jednotky, která vystřelila _this Select 1 = typ zbraně, ze které jednotka vystřelila _this Select 2 = typ ústí, z kterého jednotka vystřelila (shodné s typem zbraně) _this Select 3 = mód střelby (jednotlivý výstřel, dávka apod.) _this Select 4 = typ munice, kterou jednotka vystřelila
IncomingMissile | Tato událost proběhne vždy, když je na dané vozidlo vystřelena jakákoli střela. Správce této události vytvoří trojrozměrné pole, kde : _this Select 0 = vozidlo, na které byla střela vystřelena _this Select 1 = název/typ střely pokud střela nemá žádný název, resp. vrací hodnotu NULL, použijte : _missileName = NearestObject [ _this Select 2, _this Select 1] _this Select 2 = název toho kdo střelu vystřelil
Dammaged | Tato událost proběhne ihned poté co je daná jednotka zasažena (Viz "Hit"). Správce této události vytvoří trojrozměrné pole, kde : _this Select 0 = zasažená jednotka _this Select 1 = název části těla, která byla zasažena (např.: "noha", "ruce") _this Select 2 = míra poškození (hodnota Damage)
Gear | Tato událost proběhne vždy, když se vysune nebo zasune podvozek daného letadle. Správce této události vytvoří dvojrozměrné pole, kde : _this Select 0 = název letadla _this Select 1 = stav podvozku (True -> podvozek vysunut, False -> podvozek zasunut)
Fuel | Tato událost proběhne vždy, když buď zadanému vozidlu zcela dojde palivo nebo je opět doplněno (viz. SetFuel). Správce této události vytvoří dvojrozměrné pole, kde : _this Select 0 = název vozidla _this Select 1 = True -> plná nádrž (Fuel vrací 1), False -> prázdná nádrž (Fuel vrací 0)
Init | Tato událost by měla proběhnou vždy, když je nějaká jednotka vytvořena a Správce této události by měl vždy vykonat požadovanou akci. Bohužel se mi však nepodařilo tuto doměnku potvrdit, neboť tato událost se mi nespustila nikdy, MP mise v to počítaje. Problémem zde je hlavně skutečnost, že funkce addEventHandler vyžaduje jako volací parametr název jednotky, který lze těžko přiřadit, když daná jednotka ještě neexistuje. Při respawnu jednotek v MP misích (které už svá jména mají) se však tato událost také nespouští. Pokud by znal někdo řešení, pošlete mi ho prosím na ruprt@atlas.cz. Ekvivalentem této události (ne-li událost sama) je zřejmě samotné pole Inicializace jednotek v editoru nebo parametr Inicializace funkce CreateUnit.

Příklad práce s EventHandlery

Jako příklad práce s EventHandlerem zde uvádím ukázku zpracování událostí GetIn a GetOut.

1) Objekty editoru | Vytvořte si v editoru kdekoli na mapě vozidlo Džíp a pojmenujte si ho jeep1. Poté si vytvořte hráče.
2) Soubory scriptů | Budeme potřebovat tři soubory scriptů : init.sqs, getIn.sqs, getOut.sqs (dva posledně jmenované soubory mohou být samozřejmě pojmenovány libovolně, tato jména jsem použil pouze z důvodu lepší přehlednosti).
Init.sqs :

Do souboru init.sqs zapište následující kód, kterým přiřadíte vozidlu jeep1 správce událostí GetIn a GetOut a ten tak bude od spuštění mise sledovat, zda-li do džípu někdo nastoupil nebo z něj vystoupil :

hGetIn = jeep1 AddEventHandler ["GetIn",{_this Exec "getIn.sqs"}]

hGetOut = jeep1 AddEventHandler ["GetOut",{_this Exec "getOut.sqs"}]

getIn.sqs

Do souboru getIn.sqs musíme zapsat kód, který se vykoná v případě, že do džípu někdo nastopupí. V tomto případě jsem zvolil tu nejjednodušší cestu jak vizuálně potvrdit fakt, že do džípu někdo nastoupil a že Správce události GetIn udělal to co má, a proto zapíšeme následující kód :

TitleText[Format["Do džípu : %1\nnastoupil : %2\n na pozici : %3", _this Select 0, _this Select 2, _this Select 1], "PLAIN"]

getOut.sqs

Soubor getOut.sqs je vlastně velmi obdobný jako getIn s tím rozdílem, že kód zapsaný zde se provede pokud někdo z džípu vystoupí. Takže zapíšeme následující kód :

TitleText[Format["Z džípu : %1\nvystoupil : %2\nz pozice : %3", _this Select 0, _this Select 2, _this Select 1], "PLAIN"]

3) Ukončení Správce událostí Ve chvíli kdy už nebudete Správce událostí potřebovat je vhodné jej ukončit, čímž se ukončí proces sledování událostí a tím se samozřejmě i uvolní prostředky počítače a scripty spouštěné při událostech tak již nemohou případně kolidovat s dalším vývojem hry.

Pro ukončení procesu sledování událostí máme ve scriptovacím jazyku OFP dva nástroje : RemoveEventHandler a RemoveAllEventHandlers.

Varianta 1. - RemoveEventHandler

Při přiřazování Správců událostí GetIn a GetOut jsme si v souboru init.sqs uložili jejich identifikátory do proměnnýh hGetIn a hGetOut, které nyní s funkcí RemoveEventHandler využijeme. Pro odstranění Správce události GetIn a GetOut zapíšeme a provedeme následující kód, který může být umístěn v poli Při Aktivaci jakéhokoli spínače nebo v souboru scriptu, který si zavoláme standardně příkazem Exec :

jeep1 RemoveEventHandler ["GetIn", hGetIn]

jeep1 RemoveEventHandler ["GetOut", hGetOut]

Varianta 2. - RemoveAllEventHandlers

Při použití této varianty nepotřebujeme znát identifikátory správců ( handlery), neboť tato funkce pracuje pouze s názvy událostí a nikoli s jejich identifikátory, a proto zůstanou proměnné hGetIn a hGetOut nevyužity.

Pro odstranění Správců události GetIn a GetOut zapíšeme a provedeme následující kód, který může být (tak jako při variantě 1.) umístěn v poli Při Aktivaci jakéhokoli spínače nebo v souboru scriptu, který si zavoláme standardně příkazem Exec :

jeep1 RemoveAllEventHandlers "GetIn"

jeep1 RemoveAllEventHandlers "GetOut"

Na závěr pak pro uvolnění paměti v obou variantách vymažeme obě již nepotřebné proměnné hGetIn a hGetOut, a to následovně :

hGetIn = Nil

hGetOut = Nil


Seznam objektů GfgVehicles

Seznam tříd objektů pro CfgVehicles
 | Název třídy | Popis
 | All | všechna vozidla
+ | Logic | Logický člen - neviditelná jednotka
- | Land | Pozemní vozidla
- | Car |
- | Motorcycle |
- | Tank |
- | APC |
- | Man |
+ | Civilian |
+ | Civilian2 |
+ | Civilian3 |
- | Soldier |
- | SoldierLAW |
- | Air | Letadla a helikoptéry
- | Helicopter | Helikoptéra
- | Plane | Letadlo
- | Ship | Loď
- | SmallShip | Malá loď
- | BigShip | Velká loď
+ | Jeep |
+ | JeepMG |
+ | Rapid |
+ | RapidY |
+ | Skoda |
+ | SkodaBlue |
+ | SkodaRed |
+ | SkodaGreen |
+ | Tractor |
- | Truck |
+ | Truck5t | 5-ti tunový nálaďák
+ | Truck5tOpen |
+ | Truck5tRepair |
+ | Truck5tReammo |
+ | Truck5tRefuel |
+ | SoldierWB | Západní voják - základní
+ | SoldierWG | Západní voják - gránátometčík
+ | SoldierWMedic |
+ | SoldierWCrew |
+ | SoldierWPilot |
+ | SoldierWMG | Západní voják - kulometčík
+ | SoldierWLAW | Západní voják - lehký LAW raketometčík
+ | SoldierWAT | Západní voják - s naváděnou země-vzduch raketou
+ | SoldierWAA | Západní voják - s raketou vzduch-vzduch
+ | SoldierWMortar | Západní voják - s minometem
+ | SoldierWSniper |
+ | SoldierWSaboteurPipe |
+ | SoldierWSaboteurDay |
+ | SoldierWMiner |
+ | OfficerW |
+ | SoldierWCaptive |
+ | M1Abrams |
+ | M60 |
+ | M113 |
+ | M113Ambul |
+ | Cobra |
- | Ch47D |
+ | ParachuteEast |
+ | ParachuteWest |
+ | ParachuteC |
+ | ParachuteG |
+ | UH60 |
+ | UH60MG |
- | Su25 |
+ | A10 |
+ | Cessna |
+ | BoatW |
+ | M2StaticMG |
+ | UAZ |
+ | Ural |
+ | UralRepair |
+ | UralReammo |
+ | UralRefuel |
+ | Scud |
+ | SoldierEB |
+ | SoldierWFakeE |
+ | SoldierEG |
+ | SoldierEMedic |
+ | SoldierECrew |
+ | SoldierEPilot |
+ | SoldierEMG |
+ | SoldierELAW |
+ | SoldierEAT |
+ | SoldierEAA |
+ | SoldierEMiner |
+ | OfficerE |
+ | OfficerENight |
+ | GeneralE |
+ | Angelina |
+ | SoldierESniper |
+ | SoldierESaboteurPipe |
+ | SoldierEFakeW |
- | LaserTarget | Laserové zaměřování
+ | BMP |
+ | BMPAmbul |
- | RussianTank |
+ | T72 |
+ | T80 |
+ | ZSU |
+ | M2StaticMGE |
+ | Mi24 |
+ | Mi17 |
+ | CarrierW |
+ | BoatE |
+ | TruckV3SG |
+ | GJeep |
+ | TruckV3SCivil |
+ | TruckV3SGRefuel |
+ | TruckV3SGRepair |
+ | TruckV3SGReammo |
+ | UAZG |
+ | SGUAZG |
+ | SoldierGB |
+ | SoldierGMedic |
+ | SoldierGCrew |
+ | SoldierGPilot |
+ | SoldierGG |
+ | SoldierGMG |
+ | SoldierGLAW |
+ | SoldierGAT |
+ | SoldierGAA |
+ | OfficerG |
+ | OfficerGNight |
+ | SoldierGFakeE |
+ | SoldierGFakeC |
+ | SoldierGFakeC2 |
+ | T55G |
- | Static | Statické objekty nebo budovy.
+ | ReammoBox |
+ | ReammoBoxWest |
+ | ReammoBoxEast |
+ | ReammoBoxGuer |
+ | HeavyReammoBox |
+ | HeavyReammoBoxWest |
+ | HeavyReammoBoxEast |
+ | HeavyReammoBoxRes |
+ | MachineGunBox |
+ | FlagCarrier |
+ | Danger |
+ | Fire |
+ | Target |
+ | TargetE |
+ | Camp |
+ | Fortress1 |
+ | Fortress2 |
+ | CampEmpty |
+ | CampEast |
+ | CampEastC |
+ | Grave |
+ | GraveCross1 |
+ | GraveCross2 |
+ | GraveCrossHelmet |
+ | ACamp |
+ | MASH |
+ | Fence |
+ | FenceWood |
+ | Wire |
+ | WireFence |
+ | Barrels |
+ | Barrel1 |
+ | Barrel2 |
+ | Barrel3 |
+ | Barrel4 |
+ | Table |
+ | Tablemap |
+ | Chair |
+ | Phone |
+ | Camera1 |
+ | Computer |
+ | ChairHangar |
+ | ChairX |
+ | VideoTable |
+ | TablePub |
+ | Radio |
+ | ChairSmall |
+ | Crawling |
+ | ExcerciseTrack |
+ | ExcerciseTrack2 |
+ | ExcerciseTrack3 |
+ | Paleta1 |
+ | Paleta2 |
+ | JeepWreck1 |
+ | JeepWreck2 |
+ | JeepWreck3 |
+ | M113Wreck |
+ | UralWreck |
+ | Body |
+ | Shed |
+ | Office |
+ | Barracks |
+ | Hangar |
+ | Hangar_Hall |
+ | Hangar_Office |
+ | ShedSmall |
+ | HeliH |
+ | HeliHEmpty |
+ | TargetTraining |
+ | TargetGrenade |
+ | FuelStation | Budova čerpací stanice

Znaménka v prvním sloupci :

- základní třída objektu

+ odvozená třída objektu

Pro tvůrce AddOnů :

Mezi základní a odvozenou třídou se v souboru config.bin nalézají ještě další nadřazené třídy, např. Západní voják - LAW raketometčík to je :

class
 All{};
class AllVehicles:All{};
class Land:AllVehicles{};
class Man:Land{};
class Soldier:Man{};

class SoldierWB:Soldier{};

class SoldierWLAW: SoldierWB{}

Pro lepší a úplnou orientaci v třídách objektů je dobré si stáhnout dekódovaný soubor config.bin k verzi hry 1.30 nebo k verzi 1.45 od A-lone-wolfa nebo k verzi 1.75 ode mě :o)).


Vyhrazené názvy souborů
mission.sqm | Soubor s daty samotné mise
description.ext | Soubor sloužicí k definici vlastních tříd, jako např. vlastní zvuky, hudba, radiové hlášky, zbraně, munice, obrázky, dialogy a jiné zdroje. Více viz. Tutorial 7 , Tutorial 10 , Tutorial 28 a Tutorial 29.
stingtable.csv | Soubor sloužící pro definici řetězcových proměnných (textů).
overview.html | Soubor, ve kterém se vytváří úvodní popis mise.
briefing.html | Soubor, ve kterém jsou uloženy briefing, debriefing a popis úkolů mise.
initIntro.sqs | Soubor skriptu, který hra načítá před spuštěním Intro.
init.sqs | Soubor skriptu, který hra načítá před spuštěním samotné mise.
exit.sqs | Soubor scriptu, který se volá bezrostředně po ukončení mise, ještě před debrífingem. Volací argument je [end #], kde # je číslo konce hry shodné s nastavením spínače TYP -> KONEC č.#
onPlayerKilled.sqs | Soubor skriptu, který hra spustí bezprostředně po zabití hráče.
onFlare.sqs | Soubor skriptu, který hra volá při zažehnutí světlice. Volací argumenty jsou : [[R, G, B], střelec], kde R, G, B je barva světlice v intervalu <0, 1>.
config.cpp / config.bin | Soubor sloužící k definici tříd objektů hry. Zde je přiložen dekódovaný a zazipovaný config.cpp k verzi hry 1.75


AddWeaponCargo
Popis: | Přidá zbraň do vozidla nebo objektu (např. "krabice s municí")
Syntaxe: | NázevObjektu AddWeaponCargo ["TypZbraně",Počet] NázevObjektu je název objektu, do kterýho chceme střelivo přidat. TypZbraně je typ zbraně, kterou chceme přidat. Počet je množství zbraní. Druhy zbraní jsou popsány v tomto tutoriálu.
Vrací hodnotu: | žádnou
Příklad použití: | Krabice1 AddWeaponCargo ["M16",4]
Další: |


Tutorial #29

Tutorial 29- Práce s dialogy
Autor : Ruprt

Co je to vlastně dialog ?

Dialog je všem uživatelům PC dobře znám i přesto, že kolikrát vlastně ani nevědí, že se o dialogové okno právě jedná. Dialogem jsou veškerá okna aplikací sloužící k tomu, aby uživateli podaly nějakou zprávu nebo informaci, nebo aby od uživatele daná aplikace získala nějaká data nebo rozhodnutí. Typickým dialogovým oknem je například okno požadující po uživateli zadání jména a hesla při spouštění operačního systému Windows, nebo okénko zobrazené po provedení změny v souboru např. u aplikace MS Word dotazující se uživatele, zda-li mají být provedené změny uloženy. U OFP je typickým dialogovým oknem celý Editor misí nebo okénko spouštěné pomocí příkazu HintC. Když se to vezme kolem a kolem OFP celé je vlastně založeno na dialogových oknech -> brífingovým zápisníkem počínaje (zkuste si jen tak pro zajímavost jednou napsat do pole PŘI AKTIVACI jakéhokoli spínače vysílačky toto : check = CreateDialog "RscDisplayMainMap", a pak ji spusťte) a zobrazením cinemaborderu při zabití hráče konče (check = CreateDialog "RscDisplayMissionEnd").

K čemu v OFP potřebujeme dialogy ?

Dialog je velmi silný nástroj pomáhající tvůrci misí vytvářet mise mnohem zajímavější, větvené, poskytující hráči možnosti volby, jak se bude hra dále vyvíjet v závislosti na jeho rozhodnutí. Takto je jednoduše možné dát hráči na výběr tím, že v určité fázi hry se mu objeví dialogové okno, které mu nabídne např. takovéto možnosti : 1) bude pokračovat dál, sám a s větším rizikem, 2) Přivolá na pomoc další vojáky, 3) Úkol ležící před ním vynechá a bude pokračovat dál aniž by daný úkol splnil (a mise by dál nemohla pokračovat), nebo 4) Misi prostě ukončí, přičemž každá z těchto voleb bude nějak bodově ohodnocena (toto se jeví aplikovatelné především u kampaní) a podle dosaženého počtu bodů se bude kampaň dále vyvíjet.

V neposlední řadě může být dialogové okno velmi silným pomocníkem tvůrce při samotném vývoji a testování mise. Kdokoli si již alespoň jednou zkusil misi vytvořit, bude se mnou souhlasit, že by práce byla mnohem jednodušší, kdyby při při testovacím běhu mise věděl, na jakých souřadnicích se např. určitá jednotka nachází, jak daleko je nejbližší nepřítel, jakou zbraň právě používá raketometčík, který má odpálit BVPéčko (obvykle má zrovna v ruce jenom klacek) a kde se (ksakru) zrovna nachází podpůrná skupina. Tak tohle všechno lze jednoduše zjistit pomocí jednoho předem definovaného dialogového debug okna, které si spustíte např. nabídkou v akčním menu nebo prostě vysílačkou.

Popis logiky definice tříd dialogů - description.ext

Základem jakéhokoli dialogového okna je definice jeho tříd (class), které OFP vyhledává v souborech v pořadí :

1) description.ext - v adresáři mise

2) description.ext - v adresáři kampaně

3) resource.bin - v vdresáři \Res\Bin nebo\Bin hry OFP

Tyto třídy jsou vlastně stavební kameny jednotlivých prvků (objektů) dialogu jako jsou např. tlačítka, rámečky, texty, obrázky, comboboxy apod. (pozn. skládají se z vlastností, metod a funkcí - ale to není důležité vědět. Pokud však máte nějaké zkušenosti s některými programovacími jazyky jako jsou např. VisulaBasic, C++, Visual FoxPro, budete mít práci s pochopením tříd velmi usnadněnou).

Příklad vytvoření dialogu

Pro základní pochopení tvorby dialogu zde popíšu postup vytvoření a spuštění velmi oblíbeného okna začátečníků ve všech programovacích jazycích "Hello, World!", které doplním o combobox a funkci získání a zobrazení souřadnic jednotlivých vojáků ve skupině hráče. Misi provedeme ve dvojjazyčném zpracování.

Misi si umístíme na ostrov Desert Island (nejrychleji se načítá). Kamkoli (na pevninu :o)) si umístíme skupinu vojáků Západu a hráče uděláme velitelem. Poté si misi uložíme jako HelloWorld.

V adresáři HelloWorld, který nám hra sama vytvořila, najdeme pouze soubor mission.sqm. V tomto adresáři vytvoříme soubor description.ext (upozornění: pokaždé, když upravíte soubor desription.ext nebo stringtable.csv, je nutné misi znovu načíst aby se změny projevily) do kterého vepíšeme následující kód:

#define FontMAINCZ | "SteelfishB64CE" | - definice typu písma
#define FontNOTES | "AudreysHandI48" | - definice typu písma
#define FontS | "tahomaB24" | - definice typu písma
#define FontM | "tahomaB36" | - definice typu písma
// Control types |  |
#define CT_STATIC | 0 | statický typ (text, pozadí, obrázek apod.)
#define CT_BUTTON | 1 | Tlačítka
#define CT_COMBO | 4 | ComboBoxy
// Static styles |  |
#define ST_LEFT | 0 | zarovnání textu doleva
#define ST_RIGHT | 1 | zarovnání textu doprava
#define ST_CENTER | 2 | zarovnání textu na střed
#define ST_UP | 3 | zarovnání textu nahoru
#define ST_DOWN | 4 | zarovnání textu dolu
#define ST_VCENTER | 5 | zarovnání textu vertikálně - otočí text o 90° po směru hodinových ručiček
#define ST_SINGLE | 0 | do pole lze zadat pouze 1 řádek textu - nelze použít \n pro přechod na další řádek
#define ST_MULTI | 16 | do pole lze zapsat více řádek textu - lze použít \n pro přechod na další řádek
#define ST_TITLE | 32 | titulkový rámeček
#define ST_PICTURE | 48 | obrázek
#define ST_3D_BORDER | 80 | rámeček je vyplněn a má 3D okraj
#define ST_NO_BORDER | 96 | rámeček bez okraje
#define ST_HUD_BACKGROUND | 128 | typ podkladu - je průsvitný
#define ST_WITH_RECT | 160 | rámeček bude mít viditelný okraj
#define ST_SHADOW | 256 | písmo bude mít stín
#define ST_NO_RECT | 512 | rámeček nebude mít viditelný okraj

(toto není tak moc důležité neboť se tím pouze přiřadily lépe zapamatovatelné názvy typům a stylům objektů - důležitá jsou čísla a ta jsou již předem nadefinována. Jinými slovy kód by fungoval i bez výše uvedeného, ale musely by se používat pouze čísla a ta se hůře pamatují)

Nyní si nadefinujeme základní třídy objektů dialogu (base control classes). Opět to není nutné, ale práce se tím podstatně zjednodušuje, neboť bez základních tříd by se musely všechny objekty definovat zvlášť, což zabírá moc času a mnohem víc řádek kódu. Takto vždy každý objekt odvodíme od již definované základní třídy. Takže :

class RscBackground
{
type=CT_STATIC
idc=-1
style=ST_3D_BORDER
x=0.150000;
y=0.150000;
w=0.700000;
h=0.700000;
text="";
colorBackground[]={1,1,1,1};
colorText[]={0,0,0,0};
font="tahomaB24";
sizeEx=0
};

class RscTitle
{
type=CT_STATIC
idc=-1
style=ST_TITLE + ST_CENTER;
x=0.150000;
y=0.164000;
w=0.700000;
h=0.060000;
text="";
colorBackground[]={1,1,0,1};
colorText[]={1,1,1,1};
font="tahomaB36";
sizeEx="1.0714 * 0.03";
};

class RscGroupBox
{
type=CT_STATIC
idc=-1
style=ST_NO_BORDER
text="";
colorBackground[]={0,0,0,0};
colorText[]={0,0,0,0};
font="tahomaB24";
sizeEx=0.020000;
};

class RscText
{
type=CT_STATIC
idc=-1
style=ST_LEFT + ST_MULTI + ST_NO_RECT;

lineSpacing=1.000000;
h=0.040000;
colorBackground[]={0,0,0,0};
colorText[]={0.080000,0.080000,0.120000,0.750000};
font="tahomaB24";
sizeEx=0.020000;
};

class RscPicture
{
type=CT_STATIC
idc=-1
style=ST_PICTURE
colorBackground[]={0,0,0,0};
colorText[]={1,1,1,1};
font="tahomaB24";
sizeEx=0
};

class RscButton
{
type=CT_BUTTON
style=ST_CENTER
w=0.110000;
h=0.050000;
colorText[]={0.080000,0.080000,0.120000,1};
font="tahomaB24";
sizeEx=0.020000;
default=0
soundPush[]={"ui\ui_ok",0.200000,1};
soundClick[]={"",0.200000,1};
soundEscape[]={"ui\ui_cc",0.200000,1};
};

class RscCombo
{
type=CT_COMBO
style=ST_LEFT
h=0.040000;
wholeHeight=0.250000;
colorSelect[]={0.350000,0.380000,0.360000,1};
colorText[]={0.080000,0.080000,0.120000,0.750000};
colorBackground[]={0.350000,0.380000,0.360000,0.750000};
font="tahomaB24";
sizeEx=0.020000;
};

Vysvětlivky :

idc - index třídy objektu (vlastně takový číselný název), zde většinou -1, neboť se jedná o base class

style - chování objektu (zarovnání apod.)

colorBackground - barva pozadí RGBA (1 = 255 = FF (HEX) a 0 = 0 = 00(HEX)) - A je průsvitnost

colorText - barva písma RGBA (1 = 255 = FF (HEX) a 0 = 0 = 00(HEX)) - A je průsvitnost

colorSelect - barva podkladu myší vybrané položky ComboBoxu - RGBA

font - typ písma (lze použít i ony definice např. FontMAINCZ, ale tady je lepší používat název písma)

lineSpacing - velikost mezery mezi řádky při stylu ST_MULTI
sizeEx - velikost písma

size - velikost písma

default - standardní/hlavní tlačítko (když se stiskne ENTER stiskne se tlačítko s default=1)

soundPush/Escape/Click - zvuk, který se přehraje při stisku tlačítka OK/Cancel/ostatní

x - vzdálenost levého horního rohu objektu od levého okraje obrazovky, 0-úplně vlevo, 1-úplně vpravo

y - vzdálenost levého horního rohu objektu od horního okraje obrazovky, 0-úplně nahoře, 1-úplně dole

w - šířka objektu

h - výška objektu

wholeHeight - výška rozbaleného ComboBoxu

No a teď když máme definovány základní třídy objektů, můžeme se vrhnout na samotnou tvorbu dialogového okna :

      class RscHelloWorld
{
idd=1000
movingEnable=1
class Controls
{

// ----------------------------------------
// --------- Dialog Appearence ------------
// ----------------------------------------

class Background: RscBackground  //vytvoří základní rámeček celého
      dialogu
{
x=0.250000;
y=0.250000;
w=0.500000;
h=0.500000;
};
class SubBackground: RscGroupBox  // vytvoří druhý rámeček uvnitř
      základníh, čímž se zvýrazní
{
x=0.270000;
y=0.270000;
w=0.460000;
h=0.460000;
};

// ----------------------------------------
// -------------- TextBoxes ---------------
// ----------------------------------------

class Title: RscTitle  //Rámeček titulku dialogu s nadpisem "Hello,
      World !"
{
idc=1001
x=0.350000;
y=0.270000;
w=0.300000;
h=0.060000;
text="$STR_DLG_Title";
};

class TextBox1: RscTitle  //Rámeček pro výpis textů
{
idc=1002
x=0.290000;
y=0.350000;
w=0.420000;
h=0.180000;
text="";
sizeEx="0.022";
};
class TextBox2: RscText  //Textové pole pro výpis textů uvnitř
      1.rámečku
{
idc=1003
x=0.300000;
y=0.360000;
w=0.400000;
h=0.160000;
colorBackground[]={0,0,0,0};
colorText[]={1,1,0,1};
text="$STR_TextBox2_1";
sizeEx="0.024";
};

// ----------------------------------------
// -------------- Buttons -----------------
// ----------------------------------------

class GetData: RscButton  // Tlačítko "Získej údaje"
{
idc=2001;
x=0.580000;
y=0.550000;
text=$STR_BTN_GetData;
action="Player
      Exec ""onClickGetData.sqs""";
};

class ButtonCancel: RscButton  //Tlačítko "Cancel"
{
idc=2002
x=0.385000;
y=0.640000;
w=0.130000;
h=0.050000;
text="$STR_BTN_CANCEL";
action="CloseDialog
      1000; sd = Nil";
};
// ----------------------------------------
// -------------- ComboBoxes --------------
// ----------------------------------------

class CBSoldiers: RscCombo  //Vytvoří ComboBox
{
idc=3001
style = ST_TITLE + ST_CENTER;
x=0.315000;
y=0.565000;
w=0.250000;
h=0.025000;
colorSelect[]={1,1,1,1};
colorText[]={0,0,0,0.750000};
rowHeight=0.025000;
};

// ----------------------------------------
// --------------- Pictures ---------------
// ----------------------------------------

class RuprtLogo: RscPicture  //Umístí do dialogu obrazek
{
idc=4001
text="ruprtslogo.jpg";
x=0.581900;
y=0.610000;
w=0.107500;
h=0.115000;
colorText[]={1,1,1,1};
};
};
};

A toť vše.

Údaj Action u tlačítek je vlastně metoda, která se spustí při stisku daného tlačítka a provede veškeré příkazy uvedené v uvozovkách za rovnítkem. Příkazů může být několik, musí však být odděleny středníkem. Nastavení této metody lze za běhu programu změnit příkazem ButtonSetAction.

Teď je nutné si vytvořit soubor stringtable.csv, aby mohly být získávány texty pro všechny objekty dialogu a do tohoto souboru zapsat následující :

Language, Czech, English, Comment

STR_DLG_Title, "Hello, World !", "Hello, World !",

STR_TextBox2_1, "\nVyberte z ComboBoxu níže vojáka, jehož\n\nsouřadnice se vám zobrazí v tomto rámečku.", "\nChoose a soldier from ComboBox bellow\n\nto display his coordinates.",
STR_TextBox2_2, "Voják ""%1"" je na souřadnicích :\nOsa X = %2\nOsa Y = %3\nOsa Z = %4\núhel = %5°\nnázev jednotky = %6", "Soldier ""%1"" is on coordinates :\nX axis = %2\nY axis = %3\nZ axis = %4\nangle = %5°\nname of unit = %6",

STR_BTN_GetData, Získej údaje, Get Data,
STR_BTN_CANCEL, Ukončit, Cancel,

STR_CB_Txt_0, Vyberte vojáka, Choose a soldier,
STR_AddAction_0, Spustit dialog, Start dialog,

STR_Hint, "Nyní máte otevřené Akční menu.\nStiskem první položky\n""Spustit dialog""\notevřete dialog ""Hello, World !""", "The Action menu is opened now.\nPress first item to open\n""Hello, World !"" dialog.",
STR_Error, "Nevybral jste žádného vojáka !!!", "You havn't selected any soldier !!!",

Teď již máme hotovo vše abychom mohli dialog spustit příkazem check = CreateDialog "RscHelloWorld". Ale....... Tento dialog se nám sice otevře, ale nebude zcela funkční, neboť je ještě zapotřebí vytvořit pár jednoduchých scriptů, pomocí kterých budeme chování dialogu ovládat.

První script přidá položku do Akčního menu, kterou se aktivuje dialog a napoví hráči co že to má vlastně udělat. Je to všem velmi dobře známý init.sqs, který obsahuje pouze :

player AddAction [Localize"STR_AddAction_0", "activatedialog.sqs"]
~0.5
Hint Localize"STR_Hint"
Exit

Druhý script je o něco složitější neboť má za úkol aktivovat dialog a iniciovat jeho impicitní nastavení. Je to script activatedialog.sqs, který obsahuje tento kód :

_check = CreateDialog "RscHelloWorld"

; ******* Zde lze vytvořit chybovou rutinu pro případ, že by se dialog neotevřel *****
;? _check: GoTo "OK"
;TitleText["Něco je špatně dialog nelze otevřít.\nZkuste restartovat misi, nebo tak něco", "Plain"]
;ForceEnd
;Exit
;#OK
;******************************************************************

; ------------- Nastaví hodnoty položek ComboBoxu s IDC 3001 ----------------------
_countgrp = Count (Units Group Player)
_x = 0
lbAdd [3001, Localize"STR_CB_Txt_0"]
#Loop1
_x = _x + 1
_index3001 = _index3001 + [lbAdd [3001, Name (Units Group Player Select _x)]]
? _x < (_countgrp - 1): GoTo "Loop1"

; ------------ Nastaví implicitní položku ComboBoxu ---------------------------
lbSetCurSel [3001, 0]

Exit

No a na závěr vytvoříme poslední, bohužel taky nejsložitější script, který má za úkol zjistit hráčem požadovaná data a vypsat je do textového pole dialogu. Tento script si pojmenujeme třeba onClickGetData.sqs, a to proto, že se spustí při kliknutí na tlačítko "Získej data". Soubor obsahuje následující kód :

; ------- Získat hodnoty z vybrané položky CombnoBoxu -------
_cbindex = lbCurSel 3001

; ******************** Chybová rutina ***************************
; ***** v případě, že hráč nevybere žádnou položku Combo boxu *****
? _cbindex == 0: Hint Localize"STR_Error"; Exit
; ******************************************************************

; ---------- Získat údaje o pozici vybraného vojáka ---------
_soldiername = lbText [3001, _cbindex]
_soldierpos = GetPos (Units Group Player Select _cbindex)
_soldierposx = _soldierpos Select 0
_soldierposy = _soldierpos Select 1
_soldierposz = _soldierpos Select 2
Goto "GetAngle"
#Return
_unitname = Units Group Player Select _cbindex

; ------------- Vypsat získané údaje do TextBoxu ------------
ctrlSetText [1003, Format[Localize"STR_TextBox2_2", _soldiername, _soldierposx, _soldierposy, _soldierposz, _angle, _unitname]]

Exit

; --------- Subprocedura pro získání úhlu mezi vojákem a hráčem -----------
; --------- Např. pro použití v příkazu SetDir, příkaz DoWatch ------------
; --------- totiž ne vždy spolehlivě pracuje ------------------------------
#GetAngle
_playerpos = GetPos player
_playerposx = _playerpos Select 0
_playerposy = _playerpos Select 1
_distancex = _soldierposx - _playerposx
_distancey = _soldierposy - _playerposy
_absgoniometry = Abs(_distancex) + Abs(_distancey)

_asinderived = _distancex / _absgoniometry
_acosderived = _distancey / _absgoniometry

? _asinderived >= 0 AND _acosderived >= 0: _angle = Asin(_asinderived)
? _asinderived >= 0 AND _acosderived < 0: _angle = 180 - Asin(_asinderived)
? _asinderived < 0 AND _acosderived < 0: _angle = 180 + Abs(Asin(_asinderived))
? _asinderived < 0 AND _acosderived >= 0: _angle = 360 - Abs(Asin(_asinderived))

Goto "Return"

No a teď je to již opravdu vše. Pokud jste postupovali přesně podle tohoto návodu, měl by se Vám dialog "Hello, World !" bezproblémů otevřít a správně pracovat. Pro jistotu jsem však přiložil vše co je výše uvedeno do této nápovědy a tak si můžete již tuto hotovou :o) dialogovou :o) misi otevřít přímo zde a poté uložit a rozbalit soubor helloworld.intro.zip do adresáře \Mission nebo Users\uživatel\Missions.


Ježurův tutoriál o dialozích

TUTORIÁL O PRÁCI S DIALOGY V OFP

Dialogy jsou VELICE užitečným nástrojem v editaci misí a jejich pochopení vám rozšíří možnosti ve tvorbě misí stejně (ne-li víc) jako další nové příkazy od verze 1.75. To mě motivovalo k tomu, abych napsal tento tutoriál. Je to vlastně doplněná forma ruprtova tutoriálu, který můžete najít v jeho OFP EditorHelpu.
Tato stránka je udělaná pro rozlišení 1024*768, takže vám doporučuji na toto rozlišení přepnout (jde to v pohodě i na 15" monioru.)
Nenavštívené odkazy jsou psány modře, tučně, a podtrženě, právě navštívené červeně a tučně a již navštívené bíle, tučně, a podtrženě. Zdrojový kód bude psán tmavomodře neproporcionálním fontem Courier. Názvy souborů nebo jiné důležité věci budou podtrženy, popřípadě zvýrazněny.
Nebudu se tady sáhodlouze rozepisovat o nějakých autorských právech - klidně si cokoli jakkoli změňte, když vám to pomůže. Jenom by mě docela nakrklo, kdyby někdo nahradil moje jméno svým a tohle prodával. Ale to se doufám stejně nestane (koneckonců, kdo by si to koupil, že :).)
Ať už mi budete chtít sdělit cokoliv, pište mi na mail jezuro@post.cz.
Tak se pohodlně usaďte, lekce začíná...

FAQ (Frequently Asked Questions) - Často kladené otázky

Co je to sakra ten dialog?
1) Rozhovor dvou osob
2) Typ rozhraní v programech
-hádejte, o které možnosti se budeme bavit...
Možná vás to překvapí, ale CELÝ interface (tedy uživatelské rozhraní) Operace Flashpoint jsou dialogy. Dialogem může být takřka cokoliv - od nenápadnou černou čárku po tabulku pro vkládání jednotek v editoru. Ano, celý editor misí je také "jenom" soustava různých dialogových oken!

Nějaký okna - na co mi to bude?
Tuhle otázku jsem sám sobě taky položil. A sám si taky dal odpověď - bohužel tu klasickou (na ho*no, abych byl slušný). To mě na nějakou dobu od této tématiky odradilo, ale když se mi dostal do rukou OFP EdiorHelp a ukázková mise k tématu dialogů, uvědomil jsem si, že tohle nemůžu jen tak přejít.
Pomocí dialogů můžete v OFP udělat v podstatě jakékoli okno, od černého čtverečku v pravém dolním rohu monitoru po velící panel koordinovaného útoku několika skupin spojený s rozkazy jednotlivým vojákům. Možností je nepřeberné množství a já vám v tomto tutoriálu ukážu základy, na nichž můžete vybudovat sebesložitější dialog.

Tak jo - co k tomu budu potřebovat?
Pro základní dialogy stačí jenom klasický soubor Description.ext. Dále můžete přidat obrázky a samozřejmě skritpy, soubory Stringtable.csv nebo ty s příponou .sqf. Soubor Description.ext může být umístěn buď ve složce s misí (tam ho program hledá nejdřív) nebo v hlavní složce kampaně (když ho v misi nenajde, hledá tam.) A když není ani tady, podívá se do souboru Resource.bin ve složce OFP\Res\Bin, popřípadě OFP\BIN.

Je těžký se to naučit?
Nic není těžké, jenom zdlouhavé. A pokud pochopíte základy, nebude to ani zdlouhavé ;)

Popis dialogového okna

Než se pustíme do samotného kódu a definic, musíte vědět, jak se různým částem dialogu říká. Tady je jedno dialogové okno, na kterém si jednotlivé části ukážeme:

1 - Rámeček : "Oblemování" dialogového okna.
2 - Pozadí okna : Textura vypňující prostor okna.
3 - Titulek okna : Tabulka pro nadpis okna.
4 - Docela obyčejný text : Prostě text...
5 - Tlačítko : Co k tomu říct?
6 - EditBox : Kolonka, kam může uživatel vpisovat údaje.
7 - Slider (vertikální) : Posuvník neboli jezdec, tento svislý.
8 - Slider (horizontální) : Posuvník neboli jezdec, vodorovný.
9 - ComboBox : Rolovací nabídka pro výběr údajů.
10 - Docela nepovedený obrázek :) : Opravdu nepovedený...

Ukázka definice

Aby jsme to měli pěkně pohromadě, napišu sem hned zdrojový kód k dialogu na obrázku. Hned potom si ho podrobně projdeme.
Tento text je zapsán v souboru Description.ext:

// FONTY

#define FontS		"tahomaB24"
#define FontM 		"tahomaB36"
#define FontHTML 		"courierNewB64"
#define FontHTMLBold 	"courierNewB64"
#define FontMAP 		"courierNewB64"
#define FontMAIN 		"SteelfishB64"
#define FontMAINCZ 		"SteelfishB64CE"
#define FontTITLE 		"SteelfishB128"
#define FontTITLEHalf 	"SteelfishB64"
#define FontBOOK 		"garamond64"
#define FontNOTES 		"AudreysHandI48"

// TYPY OBJEKTŮ

#define CT_STATIC 		0
#define CT_BUTTON		1
#define CT_EDIT		2
#define CT_SLIDER		3
#define CT_COMBO		4

// STYLY OBJEKTŮ - ZAROVNÁNÍ

#define ST_LEFT		0
#define ST_RIGHT		1
#define ST_CENTER		2
#define ST_UP		3
#define ST_DOWN 		4
#define ST_VCENTER 		5

// STYLY OBJEKTŮ - VZHLED

#define ST_SINGLE		0
#define ST_MULTI		16
#define ST_TITLE		32
#define ST_PICTURE		48
#define ST_3D_BORDER	80
#define ST_NO_BORDER	96
#define ST_HUD_BACKGROUND	128
#define ST_WITH_RECT	160
#define ST_SHADOW		256
#define ST_NO_RECT		512

// PŘEDDEFINOVANÉ ČÁSTI DIALOGŮ

// OTEXTUROVANÉ POZADÍ S MALÝM RÁMEČKEM

class RscBackground
{
    type = CT_STATIC
    IDC = -1
    style = ST_3D_BORDER
    x=0.150000;
    y=0.150000;
    w=0.700000;
    h=0.700000;
    text="";
    ColorBackground[]={1,1,1,1};
    ColorText[]={0,0,0,0};
    font="tahomaB24";
    SizeEx = 0
};

// NADPIS OKNA DIALOGU

class RscTitle
{
    type = CT_STATIC
    IDC = -1
    style = ST_TITLE + ST_CENTER;
    x = 0.150000;
    y = 0.164000;
    w = 0.700000;
    h = 0.060000;
    text = "";
    ColorBackground[] = {1,1,0,1};
    ColorText[] = {1,1,1,1};
    font = "tahomaB36";
    SizeEx = "1.0714 * 0.03";
};

// MÍSTO PRO TEXT

class RscGroupBox
{
    type = CT_STATIC
    IDC = -1
    style = ST_NO_BORDER
    text = "";
    ColorBackground[] = {0,0,0,0};
    ColorText[] = {0,0,0,0};
    font = "tahomaB24";
    SizeEx = 0.020000;
};

// HORIZONTÁLNÍ JEZDEC

class RscSliderH
{
    type = CT_SLIDER
    style = ST_RIGHT
    h = 0.028000;
    color[] = {0.080000,0.080000,0.120000,0.750000};
};

// VERTIKÁLNÍ JEZDEC

class RscSliderV
{
    type = CT_SLIDER
    style = ST_LEFT
    w = 0.021000;
    color[] = {0.080000,0.080000,0.120000,0.750000};
};

// TEXT ;)

class RscText
{
    type = CT_STATIC
    IDC = -1
    style = ST_LEFT + ST_MULTI + ST_NO_RECT;
    LineSpacing = 1.000000;
    h = 0.040000;
    ColorBackground[] = {0,0,0,0};
    ColorText[] = {0.080000,0.080000,0.120000,0.750000};
    font = "tahomaB24";
    SizeEx = 0.020000;
};

// OBRÁZEK

class RscPicture
{
    type = CT_STATIC
    IDC = -1
    style = ST_PICTURE
    ColorBackground[] = {0,0,0,0};
    ColorText[] = {1,1,1,1};
    font = "tahomaB24";
    SizeEx = 0
};

// TLAČÍTKO

class RscButton
{
    type = CT_BUTTON
    style = ST_CENTER
    w = 0.110000;
    h = 0.050000;
    ColorText[] = {0.080000,0.080000,0.120000,1};
    font = "tahomaB24";
    SizeEx = 0.020000;
    default = 0
    SoundPush[] = {"ui\ui_ok",0.200000,1};
    SoundClick[] = {"",0.200000,1};
    SoundEscape[] = {"ui\ui_cc",0.200000,1};
};

// COMBOBOX - ROLOVACÍ NABÍDKA

class RscCombo
{
    type = CT_COMBO
    style = ST_LEFT
    h = 0.040000;
    WholeHeight = 0.250000;
    colorSelect[] = {0.350000,0.380000,0.360000,1};
    ColorText[] = {0.080000,0.080000,0.120000,0.750000};
    ColorBackground[] = {0.350000,0.380000,0.360000,0.750000};
    font = "tahomaB24";
    SizeEx = 0.020000;
};

// PROSTOR, DO KTERÉHO MŮŽE UŽIVATEL PSÁT

class RscEdit
{
    type = CT_EDIT
    style = ST_LEFT
    h = 0.032000;
    ColorBackground[] = {0,0,0,0};
    ColorText[] = {0.080000,0.080000,0.120000,0.750000};
    ColorSelection[] = {1,1,1,0.250000};
    font = "tahomaB24";
    SizeEx = 0.020000;
    AutoComplete = "";
};

// TADY ZAČÍNÁ DEFINICE SAMOTNÉHO DIALOGOVÉHO OKNA

class RscTest
{
    IDD = 1000;
    MovingEnable = 1;

    class Controls
    {
        class Background : RscBackground
        {
            x = 0.250000;
            y = 0.250000;
            w = 0.500000;
            h = 0.500000;
        };

        class SubBackground : RscGroupBox
        {
            x = 0.270000;
            y = 0.270000;
            w = 0.460000;
            h = 0.460000;
        };

        class Title : RscTitle
        {
            IDC = 1001
            x = 0.350000;
            y = 0.270000;
            w = 0.300000;
            h = 0.060000;
            text = "Nadpis";
        };

        class Kolonka : RscEdit
        {
            IDC = 1002
            x = 0.430000;
            y = 0.400000;
            w = 0.250000;
            text = "";
        };

        class Cudlik : RscButton
        {
            IDC = 1003
            x = 0.300000;
            y = 0.400000;
            w = 0.10000;
            h = 0.035000;
            text = "Tlačítko";
            default = 1;
            action = "CloseDialog 1000";
        };

        class TextTabulka: RscGroupBox
        {
            x = 0.320000;
            y = 0.450000;
            w = 0.360000;
            h = 0.055000;
        };

        class Napis: RscText
        {
            IDC = 1004
            x = 0.320000;
            y = 0.450000;
            w = 0.360000;
            h = 0.100000;
            text = "Toto je ukázkové dialogové okno.";
            sizeEx = "0.022";
        };

        class JezdecH : RscSliderH
        {
            IDC = 1005
            x = 0.32;
            y = 0.55;
            w = 0.36;
            h = 0.03;
        };

        class JezdecV : RscSliderV
        {
            IDC = 1006
            x = 0.695;
            y = 0.35;
            w = 0.02;
            h = 0.36;
        };

        class Kombo : RscCombo
        {
            IDC = 1007
            style = ST_TITLE + ST_CENTER;
            x = 0.320000;
            y = 0.620000;
            w = 0.250000;
            h = 0.025000;
            colorSelect[] = {1,1,1,1};
            colorText[] = {0,0,0,0.750000};
            rowHeight = 0.025000;
        };

        class Obrazek : RscPicture
        {
            IDC = 1008
            text = "Obrazek.jpg";
            x = 0.580000;
            y = 0.610000;
            w = 0.107500;
            h = 0.115000;
            colorText[] = {1,1,1,1};
        };
    };
};
Tady si můžete stáhnout ukázkouvou misi - je v ní nadefinován dialog z obrázku výše. Misi zkopírujte do složky Flashpoint\Users\Jméno\missions.

Značky

Určitě nebude od věci si vysvětlit, co jednotlivé "značky" v definici dialogu znamenají ;)

Typy objektů - určuje, jak se bude objekt chovat.
CT_STATIC : Do této kategorie patří objekty, se kterými uživatel nemuže nic dělat - prostě tam jen jsou. Spadají sem například obrázky, titulní rámečky, pozadí okna, texty a další neinteraktivní objekty. CT_BUTTON : Tlačítka. Když je zmáčknete, ozve se ťuknutí a provede nějaká akce. O tom později.
CT_EDIT : Kolonka na text, do které může uživatel sám něco vepsat a potom to třeba zkopírovat. Tohoto typu je třeba v editoru misí kolonka "Při aktivaci" ve spínačích.
CT_SLIDER : Jezdec. Když uživatel ťukne na šipku a drží ji, může s ní jezdit po stupnici. Jezec je třeba "Pravděpodobnost výskytu" při vkládání jednotek v editoru.
CT_COMBO : Vysunovací nabídka, "roletka". Při kliknutí na rámeček se nabídka rozbalí a vy si můžete vybrat z různých položek v ní. Při dalším kliknutí se nabídka zavře a v rámečku zůstane vámi vybraná položka. Použito třeba při výběru hudby ve spínačích.

Styly objektů - zarovnání - určuje, jak bude objekt zarovnán.
ST_LEFT : Běžné zarovnání - vlevo.
ST_RIGHT : Zarovnání vpravo.
ST_CENTER : Zarovnání doprostřed.
ST_UP : Text začíná na horní straně vyhrazeného prostoru.
ST_DOWN : Text začíná na dolní straně vyznačeného prostoru.
ST_VCENTER : Otočí text o 90° - bude psán ve sloupečku od shora dolů.

Styly objektů - vzhled - určuje, jak bude objekt vypadat.
ST_SINGLE : Text, který je takto vypsán, může být napsán jen na jeden řádek.
ST_MULTI : Text, který je takto vypsán, může být napsán na více řádků.
ST_TITLE : Rámeček pro nadpis dialogového okna.
ST_PICTURE : Obrázek.
ST_3D_BORDER : "Oblemování" - 3D okraj dialogového okna.
ST_NO_BORDER : Bez texturové výplně.
ST_HUD_BACKGROUND : Poloprůhledné pozadí.
ST_WITH_RECT : Okolo objektu (např. textu) bude vykreslen rámeček.
ST_SHADOW : Objekt má stín.
ST_NO_RECT : Objekt (např. text) není ohraničen rámečkem.

Parametry - upřesňují podrobné vlastnosti dialogů.
IDD : Identifikační číslo dialogu. Každý dialog musí mít svoje vlastní IDD - na toto číslo se odkazují různé příkazy. Za IDD si můžete dát libovolné číslo, doporučuji ale začít zažitou tisícovkou.
MovingEnable : Nevím, co to dělá - při změně čísla nezaznamenáte změnu. Tak tam nechte tu jedničku...
IDC : V podstatě to samé jako IDD, jen je to identifikátor jednotlivých objektů.
type : Viz Typy objektů.
style : Viz Styly objektů - zarovnání a vzhled.
x : Vzdálenost levého horního rohu objektu od levé strany monitoru.
y : Vzdálenost horní strany objektu od horní strany monitoru.
w : Šířka objektu.
h : Výška objektu.
Pro tyto parametry (x, y, w, h) platí relativní velikost/vzdálenost vůči monitoru. Když tedy chcete, aby byl objekt široký přes půlku monitoru, nastavíte w = 0.5;. Když chcete, aby objekt začínal ve čtvrtině obrazovky shora, nastavíte y = 0.25;.
Pro lepší pochopení přidám vysvětlující obrázek:

Myslím, že v tomhle už máte jasno. Tak jdeme dál...

text : Text, který bude vepsán v objektu (u RscText to bude samozřejmě ten text :)), např. popis tlačítka. U RscPicture je to název obrázku.
font : Font písma použitý pro text. Zde je přehled těchto fontů:

SizeEx : Relativní velikost písma vůči monitoru - například pro písmo o výšce dvacetiny obrazovky bude SizeEx = 0.05;.
size : Absolutní velikost písma - "size = 1;" znamená defaultní (základní) velikost fontu, "size = 1.5;" je o 50% větší než základní atd.
ColorBackground[] : Barva pozadí ve formátu RGB + I (Red, Green, Blue, Intensity) - červená, zelená, modrá, intenzita. Když chcete udělat poloprůhledné pozadí, zadáte za intenzitu 0.5. Defaultní intenzita je 1 - neprůhledná.
ColorText[] : To samé, jako ColorBackground[], ale vztahuje se na barvu písma.
color[] : Prostě barva objektu, formát stejný jako u předchozích dvou.
LineSpacing : Řádkování. "LineSpacing = 1;" je standardní řádkování, "LineSpacing = 1.5;" udělá mezeru mezi řádky o 50% vyšší atd.
default : Používá se u tlačítek. Když je hodnota zadána na 1, je tlačítko označeno už při spuštění dialogu a po stisku klávesy Enter se sepne. Pří hodnotě 0 musíte na tlačítko ťuknout myší.
SoundPush[] : Zvuk, který tlačítko vydá, když na něj ťuknete. První parametr je název zvuku a cesta k němu, druhý je hlasitost (1.0 znamená běžnou hlasitost, ale používá se 0.2) a třetí udává rychlost, jakou je zvuk přehráván (standartně 1.0).
SoundClick[] : U tohoto si nejsem úplně jist. Jak můžete vidět v příkladu, při této události se žádný zvuk nepřehraje.
SoundEscape[] : Tak tady si taky nejsem jist :(. Ten zvuk se občas přehraje - můžete ho slyšet, ale nevím přesně kdy.
WholeHeight : Maximální výška rozbaleného ComboBoxu. Pokud se do této výšky všechny položky nevejdou, bude na pravé straně jezdec, kterým můžete výběr posouvat.
ColorSelect[] : Barva písma vybrané položky ComboBoxu.
AutoComplete : Sem můžete dosadit "Scripting" - Potom se bude nad vepisovaným textem objevovat nabídka editačních příkazů. Jinak můžete nechat prázdné.
action : Příkaz, který se vykoná po stisknutí tlačítka.
RowHeight : Při měnění hodnot jsem nezaznamenal změnu. Tak to nechte, jak to je... :).

Popis definice

Jak vidíte, definice dialogu je v podstatě úplně něco jiného, než s čím jsme se mohli doposud setkat. Některé obecné zásady jsou ale stejné. Tak si je tady uvedeme nejdřív.

Psaní :
U kódů v Operaci Flashpoint je úplně jedno, jestli budete psát všechna písmena malá, VELKÁ, nebo třeba rOzHáZeNá. Jak ale vidíte, ne všechny styly psaní jsou přehledné. Těm, co mají nějaké zkušenosti s programovacími jazyky (obzvláště C nebo C++), bude asi nejvíc vyhovovat psaní příkazů stylem "první písmeno prvního slova malé, první písmena ostatních slov velká (např. colorBackground[]). Většina (nebo alespoň mnoho) příkazů v OFP je totiž tvořeno složením více slov. Já píšu stylem "první písmena všech slov velká, pokud je příkaz pouze jednoslovný, na začátku malé (aby se mi to nepletlo s názvy proměnných nebo objektů, např. ColorBackground[])". Jak jsem ale řekl, je to jenom na vás...
Asi jste si všimli i toho, že se jinak píšou i poznámky. V souboru Description.ext se k tomuto účelu používají dvě lomítka ("//"). Poznámku můžete vložit i za konec kódu v řádku.
Jako vždy, i zde platí, že název třídy nebo jakékoli jiné uživatelem pojmenované části dialogu nesmí obsahovat mezery ani diakritiku.

Formátování textu :
Stejně jako u velikosti písmen, i u formátování textu je vše jenom na vás. Mezi jednotlivými příkazy si můžete vložit kolik mezer chcete. Co ale určitě doporučuji, je používat tabulátor k rozdělení vnořených tříd. Když se vám třeba stane, že někde zapomenete ukončovací středník, bude pro vás daleko jednodušší najít kde. Doporučuji použít další tabuláto vždy, když otevřete nějakou další třídu levou složenou závorkou ("{"). Tady se můžete podívat na rozdíl mezi formátovaným a neformátovaným kódem:
// FORMÁTOVANÝ TEXT

class RscTest
{
    IDD = 1000;
    MovingEnable = 1;

    class Controls
    {
        class Background : RscBackground
        {
            x = 0.250000;
            y = 0.250000;
            w = 0.500000;
            h = 0.500000;
        };

        class SubBackground : RscGroupBox
        {
            x = 0.270000;
            y = 0.270000;
            w = 0.460000;
            h = 0.460000;
        };
    };
};

// NEFORMÁTOVANÝ TEXT

class RscTest
{
IDD=1000;
MovingEnable=1;
class Controls
{
class Background:RscBackground
{
x=0.250000;
y=0.250000;
w=0.500000;
h=0.500000;
};
class SubBackground : RscGroupBox
{
x=0.270000;
y=0.270000;
w=0.460000;
h=0.460000;
};
};
};
Tohle byl jenom krátky vyňatek, běžný kód bývá asi 20x delší :)

Konečně samotný zdroj :
Na začátku zdrojového kódu je definice jednotlivých typů písma. Tato definice je v tom případě úplně zbytečná - jak jste si všimli, používám přesný název fontů. Dále jsou definovány typy a styly objektů - tady už vlastní pojmenování smysl rozhodně má, protože se třeba ST_PICTURE asi pamatuje lépe než číslo 48. Nejsou zde uvedeny všechny, ale jen ty, které se běžně používají.
Co to vlastně definice je? V tomto případě je to přiřazení vlastního názvu předem jinak definovaného typu nebo stylu. Vlastně takové "přejmenování".

Potom následuje předdefinování, "nachystání" jednotlivých tříd. Každý objekt v dialogu musí mít definované všechny svoje atributy neboli vlastnosti. Toto předdefinování vás ušetří toho, abyste museli při každém začlenění nějakého objektu do dialogu vždycky definovat všechny jeho vlastnosti. Takhle si můžete předem připravit ty hodnoty, které budete měnit jen velmi zřídka nebo vůbec.

A konečně posední část přípravy dialogu - samotné umísťování objektů. Není k tomu zrovna moc co říct, prostě si představíte, jak velké by mělo okno nebo nějaký objekt být, podle toho ho umístíte na obrazovku a přidáváte další objekty. Nejlepší bude, když si pořádně přečtete vzorový kód výše.

Závěr

Tak a je tu konec. Doufám, že vám tenhle tutoriál aspoň trochu pomohl a vaše hranice v editaci misí se zase posunuly o kus dál. Ještě jsem chtěl přidat výčet a popis skriptiovacích příkazů týkajících se dialogů, ale ty má Ruprt všechny dobře vysvětlené v jeho OFPEditorHelpu, který stejně všichni máme. Jestli něčemu nerozumíte, neváhejte a mailujte jako o život.

Ježuro

Stáhnout tento tutoriál: DOWNLOAD


Jak se dělá, že......... ?

Jak se dělá, že ........... ? | Příkaz editoru
Osoba provede klik. | voj1 PlayMove "FXStandDip"
Osoba zasalutuje. | voj1 PlayMove "EffectStandSalute"
Osoba mluví. | voj1 PlayMove "EffectStandTalk"
Osoba ukazuje u stolu. | voj1 PlayMove "FXStandShowTable"
Osoba sedí na židli. | voj1 PlayMove "OnChair"
Osoba má ženský postoj. | voj1 PlayMove "FXAngel"
Osoba sedí jako ve škole. | voj1 PlayMove "FXStandUnivTable"
Osoba vstane od stolu. | voj1 PlayMove "FXStandFromTable"

Kompletní seznam parametrů příkazů PlayMove a SwitchMove


Tutorial #4
Autor : MAA
Manipulácia so zbraňami
Dnes začneme pridávaním zbraní jednotkám a do objektov. Najskôr si vytvoríme nášho pokusného vojaka:

STRANA [SIDE]: VÝCHOD [EAST]
TRIDA [CLASS]: MEN
OVLADANI [CONTROL]: HRÁČ [PLAYER]
HODNOST [RANK]: VOJÍN [PRIVATE]
JEDNOTKA [UNIT]: VOJÁK [SOLDIER]
NAZEV [NAME]: aP

Na všetky úkony (nielen pri prácach so zbraňami) budeme využívať políčko INICIALIZACE.

Náš vojak ma pri sebe AK-74. Teraz mu pridáme ďalšiu zbraň, napríklad RPG. Do políčka INICIALIZACE napíšeme:

this AddWeapon "RPGLauncher"

Týmto doplníme vojakovi protitankový RPG. Teraz mu ešte musíme pridať nejaké náboje. Pridáme ďalší príkaz:

this AddMagazine "RPGLauncher"

POZOR jednotlivé príkazy je treba oddelovať bodkočiarkou " ; " (česky středník)

Takže celý príkaz bude vizerať takto:

this AddWeapon "RPGLauncher"; this AddMagazine "RPGLauncher"

Keby sme chceli pridať viacej nábojov môžeme zopakovať pridanie opakovaným použitím AddMagazine. Nezabudnite ho oddeliť bodkočiarkou.

Teraz sa pokúsime tomuto ruskému vojakovi vymeniť AK-74 za M-16. Najskôr mu však musíme AK-čko odstráníť z inventára. Na to použijeme ďalší príkaz:

this RemoveWeapon "AK74"

Ďalším príkazom mu odoberieme aj zásobníky k AK:

this RemoveMagazines "AK74"

Keby sme chceli odobrať iba jeden zásobník tak použijeme:

this RemoveMagazine "AK74"

Na odobratie vśetkých zbraní aj zásobníkov naraz treba zadať:

RemoveAllWeapons this

Keď sme mu už odobrali zbrane, tak mu teraz môžeme pridať sľubovanú M-16:

this AddWeapon "M16"

Teraz mu k nej pridáme ešte aspoň jeden zásobník (nezabudnite na bodkoćiarku!):

this AddMagazine "M16"

Celý príkaz na odobranie AK aj so zásobníkmi a pridanie M16 s jedným zásobníkom bude vizerať následovne:

this RemoveWeapon "AK74"; this RemoveMagazines "AK74"; this AddWeapon "M16"; this AddMagazine "M16"

alebo s použitím RemoveAllWeapons:

RemoveAllWeapons this; this AddWeapon "M16"; this AddMagazine "M16"

Na ďalšom príklade si ukážeme, jako pridávať zbrane do objektov ako sú napríklad: KRABICE S MUNICI [AMMO CRATES] alebo do muničných vozidiel. Pri manipulácii s týmito objektami nám odpadne nutnosť niektoré príkazy opakovať. To si ukážene na nasledujúcom príklade:

Vytvoríme si objekt s následujúcimi parametrami kúsok pri našom vojakovi:

STRANA [SIDE]: PRÁZDNÝ [EMPTY]
TRÍDA [CLASS]: AMMO
JEDNOTKA [UNIT]: KRABICE S MUNICI II (VÝCHODNÍ) [AMMO CRATES II EAST]

Príkazom do políčka INICIALIZACE si pridáme 2 kusy odstreľovačky Dragunov a k nej 6 zásobníkov. Na to použijeme príkaz:

this AddWeaponCargo ["SVDDragunov",2]; this AddMagazineCargo ["SVDDragunov ",6]

Ako ste si určite všimli sú tu určité rozdiely oproti príkazu na pridanie zbrane vojakovi. Rozdiel je použitie hranatých zátvoriek [] na definovanie takzvaného poľa. Laicky povedané, je to súhrn niekoľkých parametrov. V tomto poli je prvý parameter typ a druhý parameter je počet. Typ musí byť zase v úvodzovkách " ".

Na odstaránenie všetkých zbraní z krabíc (a vozidiel) použijeme:

ClearWeaponCargo this

A na odstránenie všetkých zásobníkov:

ClearMagazineCargo this

Dodatek: Keď chcete pridať zbraň AI, musite najskôr pridať zásobník a až potom zbraň. Inak bude zbraň prázdna a AI ju nevie nabiť. Bolo to overené na civiloch. (thx Urbeam) To isté platí aj pre hráča. Keď chcete mať pridávanú zbraň od začiatku nabitú.

Myslím si, že to by bolo k tématu práce so zbraňami asi všetko. Pod týmto článkom nájdete vymenované všetky druhy zbrani, munície a výbavy, ktoré môžete v OFP použiť.

Jednotlivé názvy zbraní, munície k nim a vybavy nájdete v tejto časti:

Ruské zbrane [Soviet Weapons] - Náboje [Ammo]

AK74SU - AK74
AK74 - AK74
AK74GrenadeLauncher - GrenadeLauncher
AK47CZ ( AK-47 v.58 ) - AK47
AK47 - AK47
AK47GrenadeLauncher - GrenadeLauncher
PK - PK
SVDDragunov - SVDDragunov
RPGLauncher - RPGLauncher
AT4Launcher - AT4Launcher
9K32Launcher (9K32 Strela AA Launcher) - 9K32Launcher

NATO zbrane [NATO Weapons] - Ammo

HK (H&K MP5SD) - HK
M4 (XM-177E2 or Car-15) - M4
M16 - M16
M16GrenadeLauncher (M16 with M203) - GrenadeLauncher
M60 - M60
M21 - M21
LAWLauncher - LAWLauncher
CarlGustavLauncher - CarlGustavLauncher
AALauncher (FIM92A Stinger AA Launcher) - AALauncher

Výbava [Equipment] - Ammo

Binocular
NVGoggles
Flare - Flare
FlareRed - FlareRed
FlareGreen - FlareGreen
FlareYellow - FlareYellow
SmokeShell - SmokeShell
SmokeShellRed - SmokeShellRed
SmokeShellGreen - SmokeShellGreen
HandGrenade - HandGrenade
Pipebomb (Satchel Charges) - Pipebomb
Timebomb - Timebomb
Mine - Mine

Addony [Addons] - Ammo

Kozlice - KozliceBall, KozliceShell


Změna jména osoby.

Jak změnit osobě jméno tak, aby se zobrazovalo v briefingu

Autor : Ruprt

Pro nastavení jména osoby použijeme třídu CfgIdentities definovanou souborem description.ext v kombinaci s přikazem SetIdentity, a to následovně :

class CfgIdentities
{
class Bryan
{
Name = "Bryan Caulder";
face = "Face5";
glasses = "SUNGLASSES";
speaker = "Adam";
pitch = 0.90;
};
};

jakmile budete mít tuto třídu v souboru description.ext zadefinovanou (připomínám, že tento soubor musí být uložen ve stejném adresáři jako je soubor mise "mission.sqm"), pak konkrétní osobě tuto identitu přiřadíte tím, že v editoru do pole INICIALIZACE vojáka, kterému chcete identitu změnit napíšete :

THIS SetIdentity "Brayn"

Takto můžete nastavit identitu kterémukoli z vojáků, partyzánů či civilistů.

Vysvětlivky :

class - main class (ta první) musí mít název CfgIdentities

class - subclass (ta druhá) je jakýkoli text, který si vymyslíte. Musí to však být jeden nepřerušený řetězec ( jedno slovo) a protože je to vlastně identifikátor třídy, na který se odkazujete parametrem příkazu SetIdentity, doporučuji zvolit text krátky a lehce zapamatovatelný (např. křestní jméno)

Name - Vámi vybrané jméno vojáka. Může to však být jakýkoli text, který si vymyslíte.

Face - jeden z výrobcem předdefinovaných obličejů ( jsou použitelné Face1 - Face53).

Speaker - jeden z výrobcem předdefinovaných hlasů

použitelné hlasy jsou :

Adam

Dan

George

Fref

John

Johan

Marc

Patric

Paul

Peter

Rich

Rob

Ted

Tom

Pitch - Výška hlasu (lze použít číslo od 0 do 1)


Tutorial #13
Autor : Leon

Jak zapálit oheň
Vytvořit plápolající oheň není problém. Stačí si někam na mapu vložit oheň (najdete ho mezi objekty) a do jeho inicializačního pole zadat

this InFlame TRUE

Tím oheň začne hořet. Pokud ho chcete rozhořet při nějaké události, musíte tento oheň nějak pojmenovat (např. Taborak) a následně do triggeru, waypointu nebo skriptu zadat

Taborak InFlame TRUE

V případě, že ho chcete naopak uhasit (třeba při nepřátelském útoku na noční základnu by ho měli obránci uhasit a tím ztížit útok), stačí změnit na

Taborak InFlame FALSE

Jde opravdu o jednoduchou věc a zvládnout by ji měl každý z vás.

Jak nastavit vlajku
Také nastavení vlajky není žádný problém. Opět si musíte na mapu postavit vlajku, kterou najdete mezi objekty. Ono ve skutečnosti ale nejde o vlajku, ale pouze o stožár. Proto je nutné ještě přidat vlajku samotnou. V původní verzi hry byly pouze dvě možnosti - vlajka USA a SSSR - a nastavovaly se inicializačními příkazy

this SetFlagTexture "rus_vlajka.pac"
this SetFlagTexture "usa_vlajka.pac"

Od verze hry 1.10 je možno přidávat i vlajku vlastní, která musí být ve formátu jpg a její rozměry (respektive toho obrázku v jpg) musí být mocniny čísla 2 (2,4,6,8,16,32,64,128,256 atd). Pak stačí vzhled vlajky nastavit obdobným příkazem

this SetFlagTexture "Jméno_vlajky.jpg"

kde v uvozovkách je název onoho obrázku. Nezapomínejte, že v tomto případě MUSÍ být obrázek v adresáři s editovanou misí, jinak vám to nebude fungovat.

Jak vidíte, ani tohle není nic těžkého. Navíc lze ze stránky http://games.tiscali.cz/flashpoint/download.asp stahnoutl balíček se všemi možnými vlajkami. Najdete v něm nejen vlajky snad všech států, ale i všelijakých organizací apod.

Jak postavit vojáka na věž
Na závěr jsem si nechal nápad pro trochu zkušenější tvůrce misí. Možná jste si chtěli ve své misi vytvořit vojáka, který bude stát na strážní věži (viewtover, v editoru jsou dva typy tuším, pro jejich instalaci přímo z editoru je třeba mít přidaný addon od Gunslingera nebo Kegetyse, ale mise pak jde hrát i bez těchto addonů). Vytvořili jste si věž a na stejné místo postavili vojáka. Jenže ejhle, on stojí pod věží. Nyní vám ukážu, jak pomocí jednoduchého scriptu zajistíte, že bude na věži skutečně stát. Obecně jde ale tento script použít i na mnohem více věcí, kdy chcete postavit něco na něco.

Vytvoříme si nový soubor, který pojmenujeme třeba PostavNaVez.sqs a uložíme ho do adresáře s editovanou misí. Jméno mise je ale libovolné, pouze musí mít příponu sqs jako script(základy práce se scripty jsme vám přinesli v tomto tutoriálu ). Do souboru pak napíšeme následující zdroják.

;na zacatku
          si nacteme tri veci - jmeno veze, jmeno vojaka a jeho vysku nad objektem
_Place = _this select 0
_guard = _this select 1
_newz = _this select 2

;ted zjistime x a y souradnice veze
_newpos = GetPos _Place
_newx = _newpos select 0
_newy = _newpos select 1

;nyní nastavime pozici strazneho na vez
_guard SetPos [_newx, _newy, _newz]

exit

Tím máme celý zdroják hotový. Pak již jen stačí v inicializačním okénku vojáka zadat potřebné parametry pro volání scriptu a vypadat by to mělo nějak takto.

[nazev_veze, nazev_vojaka, vyska_nad_vezi] exec "PostavNaVez.sqs"

Tím odešlete skriptu tři základní parametry. Název vojáka a věže je myslím jasný, zadává se v editačním okně každé jednotky. Výška nad věží pak určuje, jak vysoko nad věži se voják ocitne. Pro naprostou většinu věcí (tedy i pro věž) by měla fungovat 0. V některých kombinacích objektů se ale může stát, že vám bude propadat. Pak tedy zadejte vyšší číslo a voják na objekt z vyšší výšky dopadne. Ale jak říkám, nulová hodnota by měla většinou fungovat.

Výhoda scriptu je ta, že ho stačí mít jednou i přesto, že kolem tábora postavíte více věží s vojákama. Pouze v jejich inicializačním okně se mění parametry název věže a název vojáka.


Přidání WayPointu

Přidání WayPointu v průběhu hry

Autor : Ruprt

Především Vás musím upozornit na to, že tento postup nevytvoří standardní nový waypoint, nýbrž pouze způsobí to, že daná jednotka nebo skupina se bude chovat jako kdyby nový waypoit vytvořen byl.

Máte-li vytvořenou trasu pro skupinu vojáků (např. "skalfa") pomocí např. 4 waypointů a v průběhu hry potřebujete v závislosti na jejím průběhu nebo na rozhodnutí hráče, změnit trasu pohybu dané skupiny použijte následující postup.

V okamžiku, kdy by se měla skupina odklonit od původní trasy (např. mezi wp 2 a wp 3) stanovené svými předdefinovanými waypointy použijte příkaz :

skalfa Move [osa_x, osa_y] - pro určení souřadnic doporučuji používat příkaz GetPos, GetWPPos nebo GetMarkerPos

čímž docílíte změny směru pohybu předmětné skupiny "skalfa" na dané souřadnice, přičemž se skupina chová jako kdyby ji byl do cesty vložen nový waypoint typu "PŘESUN". Jakmile skupina těchto souřadnic dosáhne, začne se pohybovat opět k waypointu, kam se pohybovala před použitím příkazu Move (v daném případě wp 3). Tento příkaz je nejlepší aktivovat spínačem.

Pozn.:

Hráč takto nově vytvořený waypoint neuvidí, pouze na něj bude upozorněn radiovou hláškou ("All, move to ....(souřadnice)" a textovou radiovou hláškou "Skupina, přesun na ....... (souřadnice)" nebo "Skupina, pohyb na ....... (souřadnice)".), přičemž původní waypoint je stále aktivní s nezměněnou pozicí.


Voják ležící na korbě náklaďáku

Autor : Leon

V našich diskusích padl (mimojiné) dotaz, jak udělat, aby voják ležel na korbě náklaďáku a tímto způsobem patrně projel do nepřátelské základny. Následující výňatek ze scriptu tedy použijte jako základ.

vojak SetUnitPos "DOWN"
vojak DisableAI "MOVE"

#jed
_TruckPos = getpos truck
_cmx = (_TruckPos select 0)
_cmy = (_TruckPos select 1)
_cmz = (_TruckPos select 2) + 3.3
vojak SetPos [_cmx, _cmy, _cmz]
vojak SetDir GetDir truck
~0.01
goto "jed"

Upozorňuji, že pokud chcete docílit, aby voják projel přes nějakou nepřátelskou bránu, je nutné také zaonačit, aby na něj nikdo skutečně nestřílel (patrně přes SetCaptive). To už je ale zase o něčem jiném. Pokud si chcete prohlédnout, jak jízda na korbě vypadá v reálu, můžete si ukázkovou misi stáhnout z http://games.tiscali.cz/flashpoint/mise/Ural.eden.zip.


Kamera za vozidlem

Autor : Leon

Hodně z vás se mi už ptalo, jak lze docílit kamery, která bude sledovat jednotku během přesunu z určitého místa - jinak řečeno bude ji následovat. Následující smyčka by vám měla naznačit, jak na to. Jde o úplně základní verzi, která se dá hodně vylepšit. Pro názornost to ale jistě stačí. Pro vysvětlení - hawk je vrtulník, který jsem si tak pojmenoval. Pokud tedy dáte místo hawk jméno své jednotky, musí to fungovat.

#let
_CameraPos = getpos hawk
_cmx = (_CameraPos select 0) - 10
_cmy = (_CameraPos select 1) - 5
_cmz = (_CameraPos select 2) + 10
_cam = "camera" CamCreate [_cmx,_cmy,_cmz]
_cam CameraEffect ["Internal","back"]
_cam CamSetTarget hawk
_cam CamSetFov 0.7
_cam CamCommit 0
~0.01
goto "let"

Celá smyčka jde výrazně zjednodušit tím, že kameru a její efekt si definujete již před smyčkou a příkaz CamCreate nahradí CamSetPos. Čísla na konci 3 až 5 řádku pak definují polohu kamery vůči sledované jednotce. Jak jsem již říkal - jde o základní smyčku, která by měla být součástí nějakého scriptu. Vylepšení už nechám na vás (vylepšovat to lze do nekonečna).

Pozn.: Ruprt
Stejného efektu jako výše popisuje Leon lze dosáhnout použitím příkazu CamSetRelPos, který posune kameru na pozici zadaných souřadnic, které určují relativní polohu kamery od aktuálního cíle kamery. Když jsem tento postup zkoušel pohyb kamery byl poněkud plynulejší, než při použití Leonova postupu.

Příklad:

Nejdříve si musíme vytvořit kameru standardním postupem

_CameraPos = getpos hawk
_cmx = _CameraPos select 0
_cmy = _CameraPos select 1
_cmz = _CameraPos select 2
_cam = "camera" CamCreate [_cmx,_cmy,_cmz]
_cam CameraEffect ["Internal","back"]
_cam CamSetTarget hawk
_cam CamSetFov 0.7
_cam CamCommit 0

a potom chceme-li, aby kamera s vrtulníkem letěla po předem určenou dobu použijeme toto:

_counter = 0
#Circle
_cam CamSetRelPos [- 1, -30, 5] - kamera letí 30m za, 1m vlevo za a 5m nad vrtulníkem
_cam CamCommit 0
_counter = _counter + 1
~.01
? _counter < 1000 : Goto "Circle"
Exit

(Vzhledem k tomu, že časová prodleva pro posun kamery je 1setina sekundy (~0.01) lze lehce nastavit dobu, po kterou má kamera vrtulník následovat.(10-ti sekundového letu pak dosáhneme tím, že smyčka #Circle bude probíhat dokud proměnná _counter nedosáhne hodnoty 1000))

a nebo chceme-li, aby kamera letěla s vrtulníkem dokud vrtulník nedoletí např. k nějakému spínači použijeme toto:

(nejdříve samozřejmě musíme v editoru vytvořit spínač, který bude aktivován přítomností vrtulníku "hawk" do jehož pole PŘI INICIALIZACI napíšeme "camend = True")

#Circle
_cam CamSetRelPos [- 1, -30, 5] - kamera letí 30m za, 1m vlevo za a 5m nad vrtulníkem
_cam CamCommit 0
~.01
? camend == False : Goto "Circle"
Exit


Přistání vrtulníku

Autor : Leon

Dnes tu mám pro vás jeden jednoduchý tip, jak usnadnit přistání vrtulníku, který má trasu zadanou waypointy. Při přesunu vrtulníku se obvykle nastavuje rychlost na běžnou nebo plnou, což ale způsobuje problémy při samotném přistávání. Rychlost je tak velká, že chvíli trvá, než se vrtulník stabilizuje pro samotný přistávací manévr. Řešení je jednoduché - stačí vložit těsně před waypoint s přistávacím manévrem další obyčejný waypoint na přesun, kde bude nastavena rychlost třeba na běžnou. Mezi tímto waypointem a přistávacím waypointem pak bude rychlost pomalá. Výsledek je ten, že už na předcházejícím waypointu začne vrtulník brzdit a tím se výrazně urychlí přistávací manévr. Pokud chcete mít jistotu, že vrtulník přistane tam kde chcete, vkládejte na ono místo H (helipad), ať už viditelný nebo neviditelný.


Použitjí příkazu "ForEach"

Autor : Leon

Nepříliš často používaný, leč někdy dosti užitečný je příkaz ForEach. Když nahlédneme do oficiálního popisu příkazu, najdeme tam jeho syntaxi

"_x setdammage 1" forEach units group player

Už z ní je patrné, k čemu je tento příkaz dobrý - jednoduchý příkaz, který je mezi uvozovkami, se vykoná pro každého vojáka v definované skupině. Možná namítnete, že u mnoha příkazů stačí dát povel jen veliteli skupiny a vojáci pod ním to po něm vykonají. Bohužel (či bohudík) to není pravidlem, takže někdy se vám tento příkaz bude určitě hodit (co třeba u příkazů switchmove/playmove?). Ještě pozor na příkazy, ve kterých se používají uvozovky (SetCombatMode, SetBehaviour, SetSpeedMode apod.). Tam nastává ten problém, že uvnitř uvozovek jsou další uvozovky (např. "_x setspeedmode "FULL""), s čímž si hra neporadí. Obejít to lze tak, že si do nějaké proměnné nadefinujete onen řetězec a ten pak zadáte do příkazu forEach. Vypadalo by to pak asi nějak takhle:

_naplno = "FULL"
"_x setspeedmode _naplno" forEach units group player

Thanx Khasim za tip.


Použitjí příkazu "ForEach" podruhé

Autor : Dasty

O příkazu ForEach už jsem tady jednou psal, ale proč si o něm neříci něco dalšího. Následující text je od Dastyho, který se jako jeden z mála (bohužel) rozhodl také něčím přispět do obsahu. Ještě upozorňuji, že podobný script, jako je na konci, byl použit v naší kampani při pronásledování hráče v misi zastřelení generála.

Příkaz forEach je pro většinu znám především v této podobě:
"_x setDammage 1" forEach units group1

kde je použit pro jednotky skupiny "group1".
Další využití, které vám chci ukázat je:

_pole1=[ivan1, ivan2, ivan3, civil1, civil2, civil3]
"_x setBehaviour ""COMBAT""" forEach _pole1

Jde především o to, že takto můžeme vytvořit pole jednotek (opět je max. počet 12) a něco jim přikázat. Většině asi není třeba dodávat jaké to má výhody, nicméně ty nejdůležitější jsou: Jednotky, které jsou v nějaké skupině, jsou poněkud nezvladatelné ohledně jejich pozic. Zde můžete jednotky postavit do řady a všem pak takto přikázat např. salutovat, či provést nějaký jiný úkon. Jednotky mohou být naopak rozházeny po celém ostrově. Další výhodou je, že vůbec nezáleží na tom, k jaké straně jednotky patří. Všiměte si také, že nemusíte chování "COMBAT" načítat do nějaké proměnné např. _bojov="COMBAT", ale můžete použít dvoje uvozovky.

Na závěr ještě jedna malá ukázka:

_pole1=[ivan1, ivan2, ivan3, civil1, civil2, civil3]
#sleduj
"_x doMove [(getpos player select 0)-15, (getpos player select 1)-15]" forEach _pole1
~5
? not (alive player) : goto "end"
goto "sleduj"
#end
exit

Jakmile tento script vyvoláte, začnou jednotky v _poli1 sledovat hráče a to tak dlouho, dokud ho nezabijí. Happy scripting :-)


Pád vrtulníku

Autor : Leon

Na internetu jsem našel jeden jednoduchý, leč zajímavý script, jehož autorem je Fox2. Jde o simulaci poškození statoru vrtulníku a jeho pád ve spirále.

_chopper = _this select 0
_chopperdir = GetDir _chopper
_chopper SetDammage .999999

#loop
_chopperdir = _chopperdir + 5
_chopper SetDir _chopperdir
~.01
? (GetPos _chopper select 2) < .5 : exit

Goto "loop"

Zhruba si popíšeme, co script dělá. Nejprve si načte název vrtulníku z parametru volání scriptu. Pak si zjistí, jak je vrtulník natočen a nastaví poškození na takovou hodnotu, při které je vrtulník zničen, ale neexploduje. Ve smyčce se pak přičítá ke směru vrtulník úhel, o který se bude točit za dobu 0.1 sekundy. Takhle bude padat ve spirále tak dlouho, dokud nebude 2 metry nad zemí, pak se script ukončí.


Použití příkazu "ShowCinemaBorder"

Autor : Leon

Příkaz ShowCinemaBorder není z těch, bez kterých by se vaše mise neobešly, ale určitě nebude škodit, když budete vědět, co dělá. Určitě jste si již všimli, že u inter a cutscén vůbec je obraz ohraničen nahoře a dole černými proužky podobně jako širokoúhlé filmy. To je právě způsobeno efektem ShowCinemaBorder. Pokud se ho chcete zbavit, stačí zadat

ShowCinemaBorder false

pokud ho naopak chcete vyvolat, pak

ShowCinemaBorder true

V jednom případě byste ho ale měli použít určitě. Jde o moment, kdy v intrech používáte pohled přes dalekohled. V tom případě černé proužky překážejí, proto by se měli zrušit. V momentě, kdy rušíte pohled přes dalekohled, zase černé proužky nahoďte, aby bylo poznat, že jde o videoscénu.


Použití radia

Autor : MAA

Na privolanie posíl rádiovým spínačom môžeme použiť dva spôsoby:

1. Najjednoduchšie je vytvoriť si spínač (trigger) typu RADIO-Alpha (alebo s iným názvom, podľa potreby) a zosynchronizovať ho (cez F5) s bodom trasy (waypointom) jednotiek, ktoré majú reagovať.

2. Druhý spôsob je použitie premennej v políčku PODMÍNKA waypointu a aktiváciou políčkom PŘI AKTIVACI rádio-spínača (NázovPremennej=TRUE). Používanie premenných sme rozoberali v tomto tutoriále.

Na spustenie scriptu napíšeme do políčka PŘI AKTIVACI príkaz na spustenie scriptu [] Exec "NázovScriptu.sqs" .


Chyby při práci s kamerou

Autor : Leon

I přesto, že jsem v tomto tutoriálu ukazoval kompletní script na cutscénu, všiml jsem si ze zdrojových kódů vašich misí, že často děláte několik chyb. Přesněji řečeno nemusí jít vyloženě o chyby, ale o zbytečné řádky v kódu. Takovým klasickým případem je sled příkazů na vytvoření kamery

_cam = "camera" CamCreate [_cx, _cy, _cz]
_cam CameraEffect ["Internal", "Back"]

Tyto příkazy nejsou špatně, ale je zcela zbytečné je zadávat pokaždé, když přesouváte kameru. Vlastně zcela stačí si na začátku jednu kameru vytvořit, tu pak všelijak přesouvat a nakonec scriptu ji zničit příkazem

_cam CameraEffect ["Terminate", "Back"]

Během scriptu tedy stačí kameru přesouvat příkazem

_cam CamSetPos [_cx, _cy, _cz]

(nebo CamSetRelPos) aniž musíte psát ony dva příkazy na začátku. Další poměrně častou chybou je, že si na začátku scriptu pojmenujete kameru třeba _cam1, ale na závěr dáváte automaticky zničit kameru _cam. O dalších chybách si povíme zítra.


Jak donutit vojáka přebít

Autor : Leon + Ruprt

Námět na dnešní editační okénko je opět z našich diskusí. Ruprt tam vznesl dotaz, jak je možno donutit nějakého vojáka přebít zbraň. Podle neoficiální dokumentace od Lustypooh by měl fungovat příkaz

hrac action ["MAGAZINE"]

Už na první pohled vypadá příkaz podivně a ke všemu opravdu nefunguje. Protože jsem si říkal, že by nebylo na škodu přijít celé věci na kloub, šel jsem s problémem přímo do BI. Odpovědí mi bylo, že tento příkaz je opravdu nesmysl, ale že donutit někoho přebít opravdu jde. Bohužel mně nebyli schopni říci z hlavy jak. Pokud to někdo z vás ví, dejte nám prosím vědět.

Dále Ruprt

Když jsem se na Leona obrátil s tímto dotazem, jednalo se mi o situaci, kdy v mé misi po ukončeni předělové scény musí hráč po nočním odpočinku v kasárnách opět do akce, jenže z předchozí části mise již měl vystřílenou munici. A protože by bylo nelogické kdyby hráč odjel (v průběhu oné předělové scény ) do akce s prázdnými zásobníky ( když předtím strávil noc v kasárnách ) a dobíjel si manuálně až na místě z nějakých beden s municí, musel jsem zjistit jak na to. Jak již Leon píše výše, uspokojivé řešení se bohužel nepodařilo najít. To co popíšu dále je vlastně jen taková náhražka toho co hra už umí, ale bohužel nikdo ( a v to počítaje i tvůrce hry ) si už nedokáže vzpomenout na to jak.

Jde o to, že pro dobití musí být vytvořen malý script, který bude použit vždy, když bude potřebovat aby si voják dobil zbraň.

1) Vytvořte si skript s názvem "reload.sqs".

2) Tento skript se volá příkazem [kdo, "co", kolik] Exec "reload.sqs" kde :

kdo - je voják který si má zbraň dobít (např hrac)

co - je typ munice, kterou si má daný voják dobít ( pozor musí být uvozovkách )

kolik - je počet zásobníků, kolik jich má voják doplnit

3) Samotný script "reload.sqs" pak vypadá takto :

? _this select 2 == 0 : Exit

_smycka = 0

_this select 0 RemoveMagazines _this select 1
_this select 0 RemoveWeapon _this select 1

#Dobij

_this select 0 AddMagazine _this select 1

_smycka = _smycka + 1

~0.1

? _smycka < _this select 2 : GoTo "Dobij"

_this select 0 AddWeapon _this select 1
_this select 0 SelectWeapon _this select 1

Exit

A pokud by jste ještě chtěli ( napříkald v cutscéně ) zobrazit pohyb jak si voják dobijí, napište těsně před poslední příkaz scriptu ( Exit ) toto :

_this select 0 PlayMove "CombatReloadMagazine" - dobití ruční zbraně ve stoje

_this select 0 PlayMove "CrouchReloadMagazine" - dobití ruční zbraně v pokleku

_this select 0 PlayMove "LyingReloadMagazine" - dobití ruční zbraně v leže

_this select 0 PlayMove "WeaponReloadAT" - dobít raketometu

_this select 0 PlayMove "CombatReloadMGun" - dobití kulometu ve stoje

apod. (viz. zde )


Využití příkazu "SetFuel"

Autor : Leon

Příkazem SetFuel se nastavuje množství paliva ve vozidlech, což asi mnozí z vás tuší, ale nevím, jak moc to někdo z vás používá. Přitom je to příkaz, který se dá poměrně zajímavě využít. Jeho použití je

NázevJednotky SetFuel Hodnota

kde Hodnota se pohybuje od 0 (žádný benzín) do 1 (plná nádrž). Počáteční hodnoty paliva se dají u každého vozidla nastavit v editačním okně. Když tedy chcete zakázat pohybu vozidla, ale přitom umožnit přístup do něj, je ideální nastavit SetFuel na 0. Třeba u tanku to způsobí, že z něj lze střílet, ale už ne s ním jezdit. Dá se tak simulovat přeba poškození pásů apod.

Další možností využití je v rámci odstartování nějaké akce. Třeba odstartování vrtulníku (který má zadaný waypoint na přesun) se může spustit tím, že mu nastavíte palivo z 0 na 1 - dříve neodstartuje. Možná vám připadá, že je to běžnější dělat jinak, ale takhle to je hodně jednoduché a spolehlivé.

Klasickým případem je pak to, když je třeba dotankovat vozidlo pomocí cisternových vozů. Tady se právě mění množství paliva pomocí SetFuel. Tímto jsem chtěl nastínit použití tohoto příkazu, který je především velmi spolehlivý. Doufám, že příklady dalšího využití vás již napadnou sami.


Jak zastřelit zajatce

Autor : Leon

Na diskusních fórech jsme probírali problém, jak nejlépe zastřelit zajatce nebo obecně toho, koho chceme zastřelit. Nakonec z toho vyšel následující script, který můžete volat přímo ze hry s parametry, které určují jména jednotek popravčího a popraveného.

_popravci = _this select 0
_popravenej = _this select 1

;Místo @ před strilejznova má být samozřejmě znak křížek (ja na klávesnici u čísla 3),
;ale tento znak nelze do news systému zapsat;((
@strilejznova
_popravci dofire _popravenej
~1
? (Alive _popravenej) : goto "strilejznova"

exit

Ta smyčka je tam proto, že není vyloučeno, že by se popravčímu nepodařilo popraveného zastřelit na první pokus. Takže do něj bude střílet do té doby, dokud bude žít.


Posunutí času v misi

Autor : Leon

Někdy se vám v misi určitě přihodilo, že jste se chtěli posunout například ze dne do noci nebo naopak. Na první pohled je to nemožné, ve Flashpointu ale existuje příkaz, který posune čas v misi o požadovanou hodnotu. Ten příkaz zní

Skiptime hodnota

kde hodnota určuje, o kolik hodin se čas posune dopředu. Hodnota 3 tedy znamená 3 hodiny, 0.5 půl hodiny atd. Teď mě napadlo, zda jdou nastavit i záporná číslo. Patrně ano, ale nikdy jsem to nezkoušel, protože to není ani logické. Po časovém posunu jsou ale veškeré jednotky ve stavu a poloze jako předtím, takže chce používat tento příklad pouze v momentech, kdy se nic neděje. Jinak to vypadá podivně.


Zalomení textu na nový řádek

Autor : Leon

Velmi často se vám během mise či intra objevuje na obrazovce text, který vás má o něčem informovat. Někdy je ovšem tak dlouhý, že by bylo vhodné ho někde zalomit, jinak řečeno přejít na další řádku. To se udělá tak, že se napíše \n do textu, takže vše po tomto speciálním znaku již bude na dalším řádku. Ve scriptu to bude vypadat asi takto:

titletext ["Tohle je první řádek,\n tohle už druhý","PLAIN DOWN",5]

Stejný efekt má tento speciální znak i v případě, že píšete text do pole efektů přímo v editoru.


Automatické ukládání hry

Autor : Leon

Ot: Chci se optat, zda někdo neví, jak udělat, aby se hra v určitém bodě sama uložila. Abych ji nemusel po úmrtí hrát celou od znova.

Od: Jistě víte, že Flashpoint umožňuje uložit hru během mise jen jednou. To má své nesporné klady, ovšem v některých složitějších a delších misí by měl autor mise myslet i na to, že hrát stále dokola kus mise a pak v ní být zabit, je otřesné. Proto je dobré v momentu, kdy se chystá náročnější akce, pozici uložit přímo z mise. K tomu slouží jednoduchý příkaz

SaveGame

který je ideální umístit do některého spínače. Po případném neúspěchu v misi pak můžete pokračovat od této uložené pozice.


Souřadnice x, y, z

Autor : Leon

Ot: Potřeboval bych poradit jak získat souřadnice x, y, z - furt to nechápu sice to jde přes příkaz, ale já to nechápu.

Od: Získat souřadnice není nic těžkého. Prostě si někam na mapu umístíš nějaký objekt a pomocí příkazu GetPos z něj získáš souřadnice. Třeba v tom posledním tutoriálu jsem uváděl příklad:

_CameraPos = GetPos man
_cmx = (_CameraPos select 0)
_cmy = (_CameraPos select 1)
_cmz = (_CameraPos select 2) + 3
_cam = "camera" CamCreate [_cmx,_cmy,_cmz]

_CameraPos není příkaz, to je proměnná, do které ty hodnoty načítám. GetPos je příkaz na zjištění těch souřadnic a man je parametr, jinak je to voják, kterého jsem si jako man pojmenoval. Tím prvním řádkem jsem tedy do proměnné _CameraPos získal souřadnice, resp. pole tří souřadnic. Nyní je nutno načíst si je do samostatných proměnných, které jsem si pojmenoval _cmx, _cmy a _cmz. Tím příkazem Select si postupně načítás ty tři parametry z proměnné _CameraPos. Nezapomeň, že první hodnota je přes Select 0! Tím do těchto proměnných získáš jednotlivé souřadnice a můžeš si s nimi dělat co chceš. Jak si viděl, já jsem si k Z souřadnici (tedy do výšky) přičetl 3 metry, takže jsem tím kameru dostal nad něj. Teď je třeba hodnoty nějak využít. Klasický případ je ten s kamerou. Klidně ale můžeš na nějakou takto získanou pozici něco umístit přes příkaz SetPos, např:

vojak SetPos [_cmx,_cmy,_cmz]

vojak je samozřejmě název nějaké jednotky. Další možností je nastavit rovnou pozici vojaka takto:

vojak SetPos GetPos man

Tím si nemusíš načítat souřadnice do proměnných, protože si příkazy GetPos a SetPos souřadnice předají.


Kamera okolo objektu

Autor : Leon

V některém minulém editačním okénku jsem vám slíbil script na kameru, která se točí kolem nějaké jednotky. Tady je tedy slíbený zdroják, opět v základní verzi, úpravy jsou jen na vás.

_objekt = _this select 0
_uhel = 0

#letim
_CameraPos = GetPos _objekt
_cmx = (_CameraPos select 0) + (cos _uhel * 30)
_cmy = (_CameraPos select 1) + (sin _uhel * 30)
_cmz = (_CameraPos select 2) + 10
_cam CamSetPos [_cmx,_cmy,_cmz]
_cam CamSetTarget _objekt
_cam CamCommit 0
~0.01
_uhel = _uhel + 1
goto "letim"

Jak vidíte, jde o script, který potřebuje zadat jediný parametr, a to cíl, který bude obíhat. Samozřejmě si můžete script upravit tak, aby se zadávali i jednotlivé souřadnicové vzdálenosti a další hovadinky. Celý fígl scriptu spočívá v proměnné vzdálenosti od objektu, která je způsobená použitím goniometrických funkcí sinus a cosinus. Pokročilejší tvůrci scriptů by se jinak ve zdrojáku měli bezpečně vyznat, takže i poznají, že je třeba si na konec přidat vlastní podmínku pro ukončení točení kamery (před touto částí scriptu je také nutno kameru vytvořit!), zničení kamery a exit. To byste už ale všechno měli z našich tutoriálů znát.


Jak ztlumit zvuk a hudbu

Autor : Leon

V diskusích padl dotaz, jak lze ztlumit hudbu a zvuk. Sice si myslím, že už jsem tu o tom psal (myslím, že v tutoriálu o intrech), ale tam to asi málokdo bude hledat. Nebude proto na škodu si to rozebrat znovu a podrobně. K nastavení hlasitosti hudby slouží příkaz FadeMusic v syntaxi třeba

1 FadeMusic 0.2

První číslo určuje, za jak dlouho se (postupně) hlasitost zvýší (sníží) na úroveň, jakou udává druhé číslo. V tomto případě se tedy hlasitost hudby sníží během vteřiny na hodnotu 0.2, což znamená, že se ztiší - základní hodnota je 0.5. Podobně je to i u příkazu FadeSound na ztišení zvuku, syntaxe pak může vypadat třeba takto

0 FadeSound 2

Po tomto příkazu se nám hodnota hlasitosti zvuku okamžitě dvojnásobně zvýší, protože hodnota zvuku má základní hodnotu 1. To je asi jediný rozdíl od hudby.


Kolik je tam nepřátel ?

Autor : Leon

V diskusích se objevil dotaz, jak lze zjistit, kolik nepřátel se nachází na určitém území. Tento na první pohled nelehký úkol lze vyřešit velmi jednoduše. V první řadě si vytvořte spínač, který vám vymezí požadované území. Pojmenujeme ho například uzemi. Pak si vybereme stranu (volba ve spínači přítomen), pro kterou to chceme zjistit. V našem případě to bude západ, tedy WEST. Do proměnné _pocet pak zjistíme stav počet západních jednotek v daném území příkazem

_pocet = WEST CountSide list uzemi

CountSide se od příkazu Count liší tím, že počítá jen jednotky dané strany. Pak ještě existuje příkaz CountEnemy, který je něco mezi - počítá nepřítele, kam mohou spadat třeba i partyzáni. Pokud chcete spočítat jednotky jiné strany, zvolte si něco z následjících možností - EAST, WEST, CIV, GUER, LOGIC. Příkaz lze použít třeba v misích, kde máte vyčistit území, jako určitou nápovědu pro hráče.


Jak dodělat vozidlo.

Autor : Leon

Občas se stává, že máte vyčistit nějaké území od všech jednotek nepřítele. Obvyklý postup je ten, že si uděláte spínač, který sepne, když jsou nepřítomny jednotky nepřítele. Háček ale je v tom, když má nepřítel na tom území obrněné jednotky. Vy je zneškodníte, ale nezničíte. V tom případě se pak taková jednotka stále počítá jako nezničená, i když není akceschopná a posádka je buď mrtvá, nebo ji opustila. Jak tedy na to. Stačí to obejít jednoduchým scriptem, který bude zjišťovat, zda se jednotka může pohybovat nebo střílet. V záporném případě vybuchne. Stačí si tedy vytvořit spínač, do kolonky podmínka napsat

not(canmove tank1) or not(canfire tank1)

do kolonky při aktivaci pak

tank1 setdammage 1

Tenhle případ samozřejmě platí jen pro jednotku nazvanou tank1, pro další musíte názvy měnit. V praxi se pak stane to, že jakmile se jenotka nemůže pohybovat nebo nemůže střílet, vybuchne.


Funkce Random a další náhody

Funkce Random

a další náhody

Autor : Leon

Velice zajímavé možnosti pro scriptování skýtá funkce Random, která funguje podobně jako ve všech programovacích jazycích - generuje náhodné číslo. Logicky je ale třeba definovat určité meze, ze kterých se bude náhodné číslo vybírat. V OFP to funguje tak, že se náhodně generuje celé číslo od 0 do X, kde číslo X je vámi zadané. Tak třeba funkce

Random 4

vybere náhodně jedno z čísel 0,1,2,3,4. Využití příkazu Random je možné prakticky kdekoliv a u čehokoliv. Hodně se používá v dělostřeleckých scriptech, kde zaručuje náhodný rozptyl výbuchů. Ovšem krásně se dá použít pro obdobu programovacího příkazu case. Příkazem

_cislo=Random 3

si nahodne nadefinujete ve scriptu číslo a pak můžete testovat, čemu se rovná a podle toho větvit script. Podmínka pak vypadá asi nějak takto:

? _cislo==0 : goto "akce1"
? _cislo==1 : goto "akce2"

atd. Zkrátka funkce Random nabízí zajímavé možnosti a je jen na vaší fantazii, v jakém případě ji použijete. V každém případě ale výrazně oživuje misi, protože zavádí novou dimenzi - náhodu.

Náhoda však jde v misích zavést i jinými způsoby než příkazem Random, a to přímo v editoru. Tak třeba v editačním okně každé jednotky máte položku pravděpodobnost přítomnosti. Málokdo z vás mění její hodnotu, přitom právě tato položka může výrazně promluvit do zajímavosti mise. Někam umístíte hlídku a dáte ji pravděpodobnost přítomnosti řekněme 50%. Na začátku mise se pak na základě pravděpodobnosti rozhodne, zda tam ta hlídka bude nebo ne - 50% šance že ano, 50% že ne. Pokud to uděláte u více hlídek, nemůže si pak být eventuální hráč nikdy jistý, co a kde může v misi čekat, protože pokaždé mohou být hlídky jinde. Dokonce se může stát, že tam budou najednou všechny, ale také žádná. Když to navíc skloubíte s poloměrem umístění u waypointů, nebudou hlídky chodit ani po stejné trase. Poloměr umístění waypointu znamená, že se (opět náhodně) vybere místo v zadaném okruhu, kde bude waypoint umístěn. Spojením těcht dvou možností tak získáte zajímavé a předem neodhadnutelné věci.

Ovšem pozor na to, komu nastavujete pravděpodobnost přítomnosti nebo zmíněný poloměr. Rozhodně se toho vyvarujte u těch osob, u kterých nějakým způsobem záleží na průběhu a ukončení mise. Také poloměr u waypointu je nevhodný dávat třeba u vystoupení z člunu apod. Na to už byste ale měli přijít sami...


Příkaz SetViewDistance

Autor : Leon

Tenhle příkaz z vás asi používá málokdo. Přitom je to příkaz, kterým se dá ovlivnit několik věcí. Jak již název napovídá, nastavuje viditelnou vzdálenost ve hře. Syntaxi má

SetViewDistance vzdálenost

tedy například

SetViewDistance 1200

značí, že je vidět na vzdálenost 1200 metrů. Konkrétní vliv v misi to má takový, že můžete sami ovlivnit, co je například v intrech vidět a co už ne. Především ale můžete ovlivnit to, jak se mise "trhá". Pokud máte v misi mnoho jednotek na malém prostoru, stačí výrazně snížit viditelnost a uvidíte, jak se to najednou začne hýbat. Naopak v leteckých misí je lepší větší viditelnost. Stejně tak si můžete nastavovat různou viditelnost pro intra, cutscény a samotné hraní. Opravdu se tím dá mise slušně rozhýbat.


Radio až po sepnutí spínače

Autor : Leon

Pokud jste při editaci někdy používali rádiové hlášky, určitě jste narazili na problém, jak nějakou hlášku aktivovat až při sepnutí něčeho. Když do mise vložíte spínač s aktivací rádio (Alpha atd) a do pole podmínka něco napíšete, bude akce vyvolaná rádiem aktivní až při splnění té podmínky. Uvedený postup má ale jednu nevýhodu, totiž že již od počátku mise zobrazuje rádiovou hlášku v nabídce. To se dá poměrně jednoduše obejít tak, že do pole text rádiové hlášky napíšete null (jen takhle, bez uvozovek). Rádiová hláška je pak nulová a není vidět. Logicky jí ale někdy musíme zviditelnit, což uděláme pomocí příkazu SetRadioMsg v nějakém spínači, nebo mu dáme stejnou podmínku, co bude u vedena i u radiového spínače. Tak například příkazem

1 SetRadioMsg "Zavolej posily"

nastavíme uvedený text pro radio Aplha (pro další jsou 2,3,4 atd.). Doufám, že jste to pochopili, ostatně zkuste si to sami.


Příkaz OrderGetIn

Autor : Leon

O příkazu OrderGetIn mnoho z vás ani neví, natož aby ho někdo používal. Ruprt dokonce do svého OFP Editor Help připsal, že mu to vůbec nefunguje a ať mu někdo poradí, co s tím. Nejen pro něj tu mám tedy takový popis, co ten příkaz dělá.

Jak název napovídá, jedná se o příkaz k nástupu (do vozidla). Zkrátka nějaké jednotce řeknete, že má do vozidla nastoupit. Ovšem pozor! Ještě před tímto příkazem musíte té jednotce, které chcete dát rozkaz k nástupu, přiřadit nějakou pozici ve vozidle. To se dělá příkazy assignasněco (assignasdriver, assignascommander, assignasgunner, assignascargo). Nejprve tedy jednotce přiřadíte pozici ve vozidle a pak jí dáte příkaz k nástupu. Ukážeme si to na příkladu. Máme vozidlo pojmenované jeep a vojáka MySoldier. Nejprve mu zadáme

MySoldier assignascargo jeep

a pak mu řekneme, že má nastoupit

[MySoldier] OrderGetIn true

Voják tedy nastoupí do jeepu jako "náklad" (dozadu). Možná se ptáte, k čemu že je to dobré, když existuje waypoint GetIn (Nastup). Jenže zdaleka ne vše ve hře se může dělat waypointy, navíc sami asi dobře víte, jak to zlobí například při nakládání vojáků do vrtulníků. Já sám jsem to použil v jedné misi, kdy je třeba evakuovat obklíčené vojáky, a funguje to podstatně lépe, než zmíněný waypoint. V neposlední řadě takto můžete přímo určit, kam se jednotky ve vozidle posadí - normálně začínají například od pozice řidiče a vyhazovat ho pak (když chcete sami řídit) je zdržující.


Problémy s náložema

Autor : Leon

Tentokrát bych chtěl upozornit na některé problémy, které spočívají v detekování nálože u hráče. Klasické příkazy jako HasWeapon nebo SomeAmmo totiž pro nálože (PipeBomb) nefungují. Jak tedy otestovat, zda má hráč u sebe nálože či ne? Rovnou říkám, že to nejde.

Já jsem doma dlouho zkoušel akci (přes AddAction), kdy hráč nastaví nálož do auta a ta se aktivuje při určité rychlosti vozidla. Logicky jsem chtěl testovat, zda v momentě, kdy je hráč v autě a má nálož nastražit, ji vůbec má u sebe. Nelze.

Další věc je, že když chci hráči ve scriptu odebrat ručně jednu nálož, musím to dělat komplikovaně. Příkaz

player removemagazine "Pipebomb"

totiž z menu odebere veškeré známky toho, že by hráč měl další nálože. Prostě to vypadá, že mu všechny zmizí. Metodou pokus-omyl jsem přišel na to, že když za ten první příkaz přidáte

player addweapon "Pipebomb"
player removeweapon "Pipebomb"

tak to najednou zobrazí správný počet náloží. To remove je tam proto, že to jinak zobrazuje v menu 2x. V definici náloží prostě není vše v pořádku, na což jsem vás chtěl tímto upozornit. Pokud se mýlím nebo o tom také něco víte, napište mi.


Cheaty v kampani

Autor : Leon

Při tvorbě kampaně jsem narazil na jeden zajímavý problém - jak úspěšně ukončit misi, když se ji hráči nedaří dokončit klasickým způsobem. Řešení, které jsem nakonec realizoval, je následující. Někde na mapě je skryt spínač, který může aktivovat pouze hráč. Zároveň existuje radiospínač, který má text null - není vidět - a má synchronizaci s prvním spínačem. První spínač má dále nastaveno SetRadioMsg na "Ukonči misi", druhý má pak nastaveno Konec č.6. Zkušenějším tvůrcům misí už asi došlo, jak to funguje. Pokud hráč dojde na určité území (v mém případě je to obvykle celý sektor), aktivuje se (a zároveň zobrazí) rádiová hláška. Po jejím vyvolání se aktivuje konec (č.6) mise, který je nastaven jako úspěch a následuje přechod do další mise v kampani.

Možná bude někdo namítat, že by stačilo dát hned do prvního spínače konec. To by ovšem způsobilo konec mise, aniž by hráč sám chtěl. Vyvoláním rádia je jasné, že to sám chce. Na závěr ještě upozorňuji, že cheatovací spínač je obvykle umístěn v prostoru, kam obvykle hráč v misi nechodí. Po nějaké době od vydání kampaně pak vydáme seznam sektorů, ve kterých se cheatovací spínače v každé misi nachází. Pravděpodobně je budeme zveřejňovat i dříve na vaše mailové žádosti, pokud budete mít v nějakých misích problémy. A mise skutečně nebudou jednoduché.


Optimalizace mise - Díl #1

Autor : Leon

Původně jsem měl v úmyslu napsat na toto téma celý tutoriál (možná to nakonec stejně udělám), protože málokdo bere při tvorbě mise v úvahu její optimalizaci. Na tu se dá pohlížet z několika hledisek, které si všechny probereme (snad) v tutoriálu později. Jedním z nejdůležitějších faktorů je počet jednotek v misi. Když někdy vidím, kolik tam úplně zbytečně dáváte i zcela zbytečných objektů, nestačím se divit. Obecně by mělo platit, že raději méně jednotek o vyšší kvalitě, než naopak. Je zcela o ničem, když dáte do vesnice 50 nepřátelských vojáků a hráč má s několika vojáky vesnici dobýt. Je to nuda, trhá se to - tohle zkrátka nezaujme, spíš naopak. Vždy berte na vědomí, že to chtějí hrát hráči i na slabších počítačích, než máte vy. Proto je vždy lepší (v tomto případě) jít cestou posil. Ve vesnici postačí 15 vojáků, ale při klesnutí jejich počtu řekněme pod 7 se v nějaké vesnici naloží na nákladák skupina dalších 10 vojáků a přijede na pomoc. Vypadá to reálněji a je v tom moment překvapení.

Dost často také přeháníte počet statických objektů. Když chcete vytvořit nějaký tábor, stačí na to třeba 2 stany, oheň, vlajka, nějaký sud a paleta, jedno dvě vozidla. Proč to celé hned obehnávat dráty či ploty? Pokud to není vyloženě nutné z hlediska mise, vykašlete se na podobné úlety v počtu objektů a raději přemýšlejte, jak misi oživit z hlediska děje, úkolů atd. V tom totiž spočívá dobrá mise, ne v tom, že na mapu naplácáte co nejvíce jednotek. Příště budeme v tématu optimalizace pokračovat.


Styly písma v briefingu

Autor : Leon

Není příliš známo, že můžete také libovolně měnit styly písma v briefingu (i overview). OFP vám nabízí předdefinované styly <h1>,<h2>,<h3>,<h4>,<h5> a <h6>. Když je chcete použít, musíte styl také ukončit párovou značkou podobně jako v HTML, tedy </h1>,</h2> atd. V neposlední řadě je třeba styl umístit mezi párovou značku odstavec <p> </p>. A jak který styl vypadá?

<h1> - velký nadpis
<h2> - malý nadpis
<h3> - normální text
<h4> - drobnější text
<h5> - styl kniha
<h6> - ruční písmo

Nejlépe to ale uvidíte, když si to sami zkusíte.

Pozn.: Ruprt
Když jsem si prohlížel různé zdrojové kódy misí zjistil jsem, že mnoho tvůrců se snaží text v briefingu vylepšit barvami za použítí parametrů html tagů typu Font color, Bgcolor apod. což bohužel v OFP nefunguje. Jedinou možností jak obarvit písmo v briefingu je použít párový tag <b> (který normálně slouží ke ztučnění písma) jehož výsledkem je potom text, který je modrý. Dále pak použijete-li hypertextový odkaz v overview je zobrazen čistě bíle s tím, že když na něj najedete myší zrůžoví.


Příkaz LockWP

Autor : Leon

Příkaz LockWP slouží přesně k tomu, podle čeho má název - uzamknutí/odemknutí waypointu. Jeho syntaxe je například

player LockWP true

Při true se waypoint uzamyká, při false odemyká. Příkaz funguje jak na jednotlivé jednotky, tak na celou skupinu.

K čemu je ale samotný příkaz dobrý. Při jeho použití se vám nepřepne waypoint, dokud ho zase neodemknete. Má to podobný účinek, jako když dáte na waypoint nějakou podmínku. Jenže v tom případě se vám pak zobrazuje na waypointu Wait for others - Čekej na ostatní. V případě, že se waypoint uzamknete, tam stále uvidíte to, co jste do waypointu zadali. Odemykání waypointu by se pak mělo vztahovat na nějakou podmínku.


Nové pohyby v Resistance

Autor : Dasty

Jako malý doplněk tu máme nové pohyby, tedy parametry k příkazům playmove a switchmove, které přináší Resistance. Dík patří Dastymu.

'FXInKneel' - sedne si na bobek
'FromKneel' - zvedne se z bobku
'FXHandsOnTable' - dá ruce na stůl
'FXDismay' - lekne se a otočí
'TakeFlag' - sehne se a něco sebere
'FXShow3' - ukazuje na něco
'FXToHand' - překříží ruce
'FXFromHand' - z překřížených rukou

'FXShow1' - vysvětluje něco, hýbe při tom rukou a pak ukazuje doprava
'FXShow2' - lehce pohybuje tělem a rukama
'FXShow4' - natočí trup doprava, naznačí rukou směr
'crouch' - poklekne a zacílí
'CivilDead' - padne mrtev
'FXCivilHandMouth' - dá ruku k ústům
'FXCivilLookBack' - ohlédne se
'FXCivilFoldOnesArms' - překříží ruce a ohlédne se
'FXSitRightHandDown' - sedí, pravá ruka spuštěná dolů
'FXSitLeftHandDown' - sedí, levá ruka spuštěná dolů
'FXToKneel' - zvolna sedne na bobek


Jiný font textu

Autor : M.P.

Dalším, kdo zareagoval na naší výzvu k vaší spoluúčasti na tvorbě těchto stránek, byl M.P. Zde je jeho příspěvek do editačního okénka.

Pokud Vás zajímá, jak byly napsány v Resistance Viktorovy myšlenky, vězte, že je to jednoduché. Jde o to, že byly napsány malým písmem. To lze udělat tak, že si v description zadefinujete zvuk a přidáte tam jenom titlefont a titlesize. V Resistance to je konkrétně takto (samozřejme je to zkrácené):

class CfgSounds
{
sounds[] ={zvuk1};
class zvuk1
{
name = "zvuk1";
sound[] = {"zvuk.ogg", db+5, 0.9};
TitleFonte="TahomaB24";
TitleSize="0.25";
titles[] = "text1";
};
};

Použití: vojak say "zvuk1"


Description pro Dragunova

Autor : Romek

Pokud jste hráli Resistance, jistě jste si všimli, že je tam konečně ve videosekvencích použit pohled přes optiku Dragunova. Lze toho docílit podobně jako pohledu přes dalekohled (místo Binocular je Dragunov), ale je to třeba externě definovat v desctiption ext. Jak by to mělo vypadat, na to se můžete podívat z tohoto výňatku description.ext (thnx Romek)

            // OPTIKA DRAGUNOVA
#define CT_OBJECT 80

class RscObject
{
type = CT_OBJECT;
scale = 1.0;
direction[] = {0, 0, 1};
up[] = {0, 1, 0};
};
class RscTitles
{

titles[] =
{
Dragunov,
};

class Dragunov
{
idd=-1; // ID ... always -1
movingEnable = false; // always false
duration=100; // time of the effect (in seconds)
name = "binocular";

objects[]= {binocular};

class binocular : RscObject
{
model= "\O\Guns\opt_snip_noflash.p3d";
idc=-1;
position[] = {0,0,0.063};
direction[] = {sin 0, sin 180 *
            cos 0, cos 180 * cos 0};
up[] = {0, cos 180, -sin 180};
};
};
};


Minové pole

Autor : Brt

Brt pro vás sepsal několik zajímavých scriptů, které postupně uveřejníme. Zde je první, který simuluje minové pole.

;[group(napr.thislist),side(povolena)] exec "minpole.sqs"
;pole jednotek
_units= _this select 0
;povolena strana
_side = _this select 1
;pocet jednotek v poli
_i=count _units

#loop
;vybrana jednotka
_unit = _units select _i-1
;kontrola strany vybrane jednotky
?((side _unit == _side) or (side _unit == civilian)):goto "afteractions"
;vybuch na pozici nepratelske jednotky pro silnejsi explozi lze pouzit
; misto "grenade" - "shellXX" nebo "heatXX" kde XX muze byt jedno z : 73,105,120,125
_bum = "grenade" CamCreate [(getpos _unit select 0),(getpos _unit select 1),(getpos _unit select 2)+0.2]
#afteractions
_i=_i-1
?_i>0:goto "loop"
exit


Ochrana respawnu v MP misích

Opatření proti hráčům MP misí, kteří střílejí na nepřátele v místě jejich respawnu.

Autor : Ruprt

Harrier mně položil dotaz, zda-li je možné udělat ochranu v MP misi proti hráčům, kteří střílejí do protihráčů na místě jejich respawnu. Představoval si to tak, že v případě, že hráč zastřelí protihráče na respawnu, tak by mu byli odebrány všechny zbrane, 5 minut by byl jako mrtvý a pak by se 'probral' na svém respawnu.
Vzhledem k tomu, že počet a prodleva respawnu se nastavuje pro všechny hráče MP mise stejně a ještě k tomu v description.ext, nelze takové řešení úplně přesně provést, protože description.ext v průběhu hry prostě změnit nelze.

Vymyslel jsem ale jiné řešení. Pro hry udělané ve verzi 1.90 je již k dispozici EvenHandler (Obsluha událostí). Pro starší verze mám však také řešení.

1) MP mise pro verzi 1.90 - Příklad
Mise bude mít 4 hráče WEST a 4 hráče EAST. Na místě respawnu hráčů WEST umístíme jakýkoli objekt (doporučuji Logický člen), který pojmenujeme 'respawnWest'. Na místě respawnu hráčů EAST umístíme opět objekt - Logický člen a pojmenujeme ho 'respawnEast'.
Ve vzdálenosti od 'respawnWest'(ve směru dozadu od herní oblasti), kterou by voják beze zbraně uběhl asi tak za 5 minut umístíme další logický člen, který pojmenujem třeba 'badBoyPointWest'. To samé uděláme pro stranu EAST s tím rozdílem, že ten druhý logický člen pojmenujem 'badBoyPointEast'. No a teď už ke scriptu.
V závislosti na tom, zda-li chcete provinilce potrestat pouze za to, že protihráče trefil, ale ještě nezabil, nebo ho chcete potresta jenom když protihrače nedovoleně zabije, zvolíte EventHandler.
a) pouze strefa - protihrac na respawnu je pouze zraněn :
do init.sqs zapiste nasledujici kód
hracEast1 addEventHandler ['Hit',{_this exec 'badboywest.sqs'}]
hracEast2 addEventHandler ['Hit',{_this exec 'badboywest.sqs'}]
hracEast3 addEventHandler ['Hit',{_this exec 'badboywest.sqs'}]
hracEast4 addEventHandler ['Hit',{_this exec 'badboywest.sqs'}]

hracWest1 addEventHandler ['Hit',{_this exec 'badboyeast.sqs'}]
hracWest2 addEventHandler ['Hit',{_this exec 'badboyeast.sqs'}]
hracWest3 addEventHandler ['Hit',{_this exec 'badboyeast.sqs'}]
hracWest4 addEventHandler ['Hit',{_this exec 'badboyeast.sqs'}]
(pozn. pokud jsou hraci jedne strany ve stejne skupine muzete samozrejme pouzit prikaz ForEach :
'_x addEventHandler [''Hit'',{_this exec ''respointwest.sqs''}]' ForEach Units Group hracEast1
'_x addEventHandler [''Hit'',{_this exec ''respointeast.sqs''}]' ForEach Units Group hracWest1 )

Poté si vytvoříte ony dva scripty badboywest.sqs a badboyeast.sqs kde bude náledující kód ;
soubor badboywest.sqs :
_mrtvola = _this Select 0
_kdozabil = _this Select 1

? (_mrtvola Distance respawnEast) < 20: _kdozabil SetPos GetPos badBoyPointWest; RemoveAllWeapons _kdozabil; _mrtvola SetDamage 0
Exit

no a soubor badboyeast.sqs pak bude obsahovat tento kód :
_mrtvola = _this Select 0
_kdozabil = _this Select 1

? (_mrtvola Distance respawnWest) < 20: _kdozabil SetPos GetPos badBoyPointEast; RemoveAllWeapons _kdozabil; _mrtvola SetDamage 0
Exit

A to je vše. Hráč, který se proviní tím, že zraní protihráče ve vzdálenosti do 20 metrů od jeho respawnu, pak bude přemístěn na pozici objektu BadBoyPointStrana a bude muset beze zbraně běžet 5 minut na místo svého respawnu, kde si vezme z beden s municí novou zbraň a munici a příště už si rozmyslí, zbaběle střílet do nepřátel na respawnu. Navíc postižený hráč bude 'opraven' příkazem ' _mrtvola SetDamage 0'.

b) V případě, že chcete hráče potrestat jenom za zabití protihráče na respawnu, použijte v init.sqs EventHandler 'Killed' namísto 'Hit' a ze souborů badboystrana.sqs odeberete za RemoveAllWeapons _kdozabil toto : '; _mrtvola SetDamage 0'.

2) MP mise pro verzi nižší než 1.90 - Příklad
Zde lze použít pouze trest za zabití protihráče nikoli za pouhé zranění. Takže ... objekty umístíte stejně jako u předchozího příkladu a stejně je také pojmenujete.
Soubor init.sqs nemusí obsahovat nic. Musíte však vytvořit soubor onPlayerKilled.sqs, který bude obsahovat následující kód :
_mrtvola = _this Select 0
_kdozabil = _this Select 1

? (_mrtvola Distance respawnWest) < 20 AND (Side _mrtvola) == West: Goto 'ResPointEast'
? (_mrtvola Distance respawnEast) < 20 AND (Side _mrtvola) == East: Goto 'ResPointWest'

#ResPointWest
_kdozabil SetPos GetPos badBoyPointWest
RemoveAllWeapons _kdozabil
Exit

#ResPointEast
_kdozabil SetPos GetPos badBoyPointEast
RemoveAllWeapons _kdozabil
Exit

A toť vše. Mějte na paměti, že každý script lze v OFP spustit ve více instancích a EvenHandlery 'Hit' a 'Killed' a soubor onPlayerKilled.sqs jsou vykonávány pouze lokálně a nehrozí tedy kolize kódu scriptu ani v případě, že by byli zabiti třeba všichni hráči najednou. Je to prostě bezpečné a pro provinilce dostatečně zpruzující.


Klečící voják

Jak donutit vojáka, aby zůstal klečet

Autor : Didymos

Mnohé z Vás trápí problém, jak donutit vojaka kleknout a hlavně, aby v tom kleku vydržel. Takže kdo netušíte jak, je to naprosto jednoduché. Buď do scriptu nebo přímo do inicializace zadejte tuto kouzelnou formulaci:
jménovojáka setBehaviour 'COMBAT'
jménovojáka switchMove 'Crouch'
jménovojáka setUnitPos 'UP'

A je po problému. :o)


Telefonující osoba

Utržené sluchátko aneb Telefonující osoba

Autor : Ruprt + Ježuro

Již mnohokrát jsem dostal dotaz jak dát vojákovi do ruky telefonní sluchátko. Postup je velmi jednoduchý.
Třída Telefon (Phone) je odvozen od třídy Dalekohled (Binocular), je proto nutné nejdřív vojákovi tento telefon přiřadit a teprve poté mu můžete dát povel k telefonování. Takto :

vojak AddWeapon 'Phone'
vojak SwitchMove 'FXStandToTelHand'

Do verze 1.46 to sluchatko umi zvednout jenom civil 2, protoze to byl udelanej model jenom pro CWC kampan - civil 2 byl James Gastovski. Od verze 1.75 uz to umi kazda jednotka.

Ruprt

Poznámka - Ježuro

To co je výše popsáno je OK, ale jak udělat, aby hráč zvedl sluchátko? Postup je následující:

Někam na mapu si umístíte telefon (je v seznamu třídy EMPTY - OBJECTS, nazveme si ho třeba Tel1) a jakýkoli jiný objekt ze stejného seznamu (třeba vlajku - název Tel2). Uložíte misi a pak si v jejím souboru Mission.sqm najdete onen druhý objekt(Tel2) a přepíšete jeho název (jestli jste zvolili vlajku, tak to bude
FlagCarrier) na PhoneBase. Tím jste z vlajky udělali telefon bez sluchátka. Další postup je nasnadě: Telefon (i se sluchátkem) umístíte na stůl. Nejvhodnější je to dělat přes příkaz SetPos. Pozici můžete zjistit kamerou, viz. Článek o novém způsobu práce s kamerou. Teď je důležité vhodně umístit člověka, aby ruku natáhl přímo k telefonu. Trochu si s tím vyhrajte. Soustava pohybů na zvednutí sluchátka je tato: Jednotka SwitchMove 'FXStandToTel' Jednotka PlayMove 'FXStandToTelHand' Pro správné fungování pohybů bude možná nutno nastavit chování jednotky na 'Careless'. Jo a nezapomeňte jí přidat to sluchátko : Jednotka AddWeapon 'Phone'. Celá část skriptu potom bude vypadat
takhle:

Jednotka SwitchMove 'FXStandToTel'
Jednotka PlayMove 'FXStandToTelHand'
~0.5
_tel1pos = (GetPos Tel1)
_tel2pos = (GetPos Tel2)
Tel1 SetPos _tel2pos
Tel2 SetPos _tel1pos

----------------------
No a to je vše.

Ježuro


Cheaty

Autor : Didymos + Ježuro

Pro starší hráče OFP to nebude zřejmě novinka, ale proč si to nepřipomenout. Jde o cheaty, které se dají používat během hry a to následující:

Funkce*Kde*Cheat
------*---*-----
Uložit hru*Ve hře*savegame

Konec mise*Ve hře*endmission

Odemkne všechny mise*Hlavní menu*campaign

Vygeneruje mapu ve vektorovém formátu*Ve hře*topography

Nesmrtelnost*Ve hře*iwillbetheone

Co musíte udělat pro aktivaci těchto cheatů? Stačí zmáčknout levý shift a klávesu Minus na numerické klávesnici a pak napsat příslušný cheat. Zkoušel jsem pouze savegame, endmission a campaign. Topography a iwillbetheone mi nefungovalo nebo jsem to dělal špatně. To není ale podstatné, protože si myslím, že nejvíce se dá využít 'savegame'.

Poznámka - Ježuro

V tématu cheatů je uveden i jeden velmi zajímavý : Topography. K tomu, aby vám fungoval správně, musíte během nějaké mise zmáčknout LShift + KPad- (levý Shift a mínus na NumPadu). To je jasný. Problém je v tom, že cheaty jsou citlivé na jazykové nastavení klávesnice. Takže musíte vlastně napsat 'topographz'. Až to napíšete, zapněte mapu. Po chvilce chřoustání se vám uloží na disk se hrou (tedy standartně C:) mapa ostrova ve formátu... (to si nejsem jistej, ale asi .emf). Problém nastává, když ho pak v nějakým programu otvíráte. Třeba Nogova zabírá přes 30MB...


Hořící pohybující se objekt

Hořící vrtulník nebo jakýkoli pohybující se objekt

Autor : Didymos

Jde v podstatě o velmi jednoduchou věc. Dáte do smyčky hořící objekt podle toho, jak psal M.P. v sekci Tipy a triky Ruprtovy poradny (http://www.koflex.cz/ruprt/) : Hrátky s ohněm.

_bum = ah

_mytime = _time
#ohen
[[(GetPos _bum select 0), (GetPos _bum select 1), (GetPos _bum select 2)+1], [0,0,1], 1, 0.1, '' ] exec 'firesource.sqs'
~0.01
? _time < (_mytime + 10): GoTo 'ohen'

a pouze tam změníte některé hodnoty. Konkrétně, dobu hoření a intenzitu plamene. Že musíte mít v adresáři s vaší misí skripty: fire.sqs, firesource.sqs, smoke.sqs, spark.sqs tu snad psát nemusím, na to se podívejte ve zmiňovaných hrátkách s ohněm nebo jsou samozřejmě v i v ukázkové misi.
Jednička na konci řádku je číslo udávající dobu hoření. Toto číslo musíte mít malé, protože by se vám plamen držel na místě, kde už pohybující objekt nebude a číslo za, v našem případě 0.1 ukazuje intenzitu plamene, což , jak už vás jistě napadlo vám umožní to, aby se z objektu buď jen kouřilo nebo aby přímo hořel. Toto samotné vám pro samotný efekt hoření pohybujícího se objektu stačí, ale protože v životě není nic jednoduché, tak i tady bude nějaké to ale. V tomto případě bude největší „ale“ u toho, že tento plamen nemá zničující účinky. Když si stáhnete ukázkovou misi, tak jsem se tam pokusil vytvořit něco jako poruchu vrtulníku s následným únikem paliva a hořením. Hned na začátek, ještě před tím, než se tu pokusím vysvětlit můj záměr chci podotknout, že nejsem žádný scriptař a že jsem přesvědčený, že by to šlo udělat mnohem jednodušeji a elegantněji a budu rád, když se nad tím nějaká chytrá hlava zamyslí a budu ještě raději, když mi pak ukáže, jak to udělat lépe. Teď už k samotnému skriptu.
Nejprve je třeba podotknout, že jsem celou situaci simuloval tak, že dojde k nezvratnému zničení vrtulníku. Hráč nebo AI, mají dvě možnosti, buď vyskočit, což by nebylo příliš reálné nebo se pokusit s poškozeným strojem přistát. Jak jsem naznačil, protože hoření nemá zničující účinek, vytvořil jsem ještě jeden podružný script, který zajistí plynulé ničení vrtulníku a zároveň s poškozením ubývá i paliva. Protože, jak jsem již řekl, dochází k jeho úniku. To vypadá takto:

#poskozen
_bum setdamage (damage _bum + 0.001)
_bum setfuel (fuel _bum - 0.001)
~0.1
? (GetPos _bum select 2) < 0.5 : goto 'konec'

Goto 'poskozen'

#konec

Exit

Tím máme zajištěno, že hráč jako pilot bude muset chtě nechtě přistát, jestli chce celou krizovou situaci přežít. Toto postupné ničení se zastaví až ve chvíli, kdy už bude stroj téměř na zemi, přesně pak 0,5 m nad Zemí. To už se ale aktivuje jiný skript, díky němuž dojde po určité době k výbuchu vrtulníku. Tím bychom měli mít jistotu, že bude stroj chtě, nechtě zničen, teď už stačí k celé situaci přidat ohýnek. :o) A protože jsem chtěl, aby to vypadalo co možná nejlépe, tak jsem intenzitu plamene postupně zvedal, což v praxi znamená, že se z vrtulníku nejprve kouří, poté se tam objeví malý plamínek, pak větší, pak dojde k poškození zadního motoru a vrtulník je tak téměř neovladatelný a jediná možnost zůstává přistát nebo pak tedy ještě vyskočit, čímž se ale nezastaví již spuštěný script, což bude asi největší slabina celého kódu. Jak je ve scriptu patrné, tak jsem toto postupné hoření řešil časem, tedy ukončením po určité době, přidáním intenzity plamene a opět nastavením času a to až do doby, kdy dojde k poškození zadního motoru.

_chopperdir = GetDir ah

#loop
[[(GetPos ah select 0), (GetPos ah select 1), (GetPos ah select 2)+1], [0,0,1], 0.5, 4, '' ] exec 'firesource.sqs'
_chopperdir = _chopperdir + 5
ah SetDir _chopperdir
~0.01
? (GetPos ah select 2) < 20 : goto 'konec'
Goto 'loop'

#konec

Další v pořadí spuštěný script totiž zastaví hoření až když bude výška objektu nad Zemí 0,5 m. Další hoření bude ukončeno až absolutním zničením celého vrtulníku. Potom by šel zřejmě přidat ještě nějaký ten plamínek, ale po výbuchu se i tak z celého vrtulníku ještě kouří.
Tak to by byl velký popis k malému scriptu. :o) Pro zpestření celé situace jsem tam script zopakoval ještě jednou a to na hořícím pilotovi, který se snaží utéci z hořícího vrtulníku, který co nevidět vybouchne. Bohužel i jeho zranění jsou předem odsouzená. :o( Celým skriptem jsem chtěl pouze naznačit možnosti, co vymyslíte vy, na to se budu těšit.

Didymos


Vytvoření a pohyb racka

Autor : Ali

Pro vytvoření racka je důležité znát tyto příkazy:

'seagull' camCreate [x,y,z]
camCommand 'landed'
camSetPos [x,y,z]

V následujících větách si vysvětlíme co jednotlivé příkazy znamenají.
Pro lepší práci s 'racky', je lepší si je pojmenovat. My si ho pojmenujeme např. '_racek'.

1. _racek = 'seagull' camCreate [x,y,z]
-tento příkaz slouží pro vytvoření racka na souřadnicích x,y,z
-jestli to nechcete zadávat přes souřadnice, jde to udělat i jinak
-dáte si na mapu nějaký objekt (nejlépe asi neviditelný), pojmenujeme si ho třeba 'obj', a pak dáme
-_racek = 'seagull' camCreate [(GetPos obj select 0) + 0, (GetPos obj select 1) + 0, (GetPos obj select 2) + 0]

2. _racek camCommand 'landed'
-tento příkaz slouží jenom k jedné věci, donutí racka, aby seděl na zemi

3. _racek camSetPos [x,y,z]
-a tento poslední příkaz slouží k tomu aby se racek přemístil na souřadnice x,y,z

Konečný script by měl vypadat takhle:

;racek se vytvoří na objektu 'obj' a bude sedět na zemi 5s
_racek = 'seagull' camCreate [(GetPos obj select 0) + 0, (GetPos obj select 1) + 0, (GetPos obj select 2) + 0]
_racek camCommand 'landed'
~5

;racek se přesune na pozici hráče, a bude 10m nad hráčem
_racek camSetPos [(GetPos player select 0) + 0, (GetPos player select 1) + 0, (GetPos player select 2) + 10]
~5

;konec sqs
exit


Ukázka pohybů velitele družstva

Autor : Didymos

Pro zpestření vašich misí a především video-sekvencí jsem vytáhl pohyby velitele družstva z configu 1.90. Vše si můžete prohlédnout v ukázkové misi. Jedná se o tyto pohyby:
1.) CommandForward - Vpřed
2.) CommandEngageAtWill - Útok
3.) CommandFormation - Zpátky do formace
4.) CommandHoldFire - Nestřílet
5.) CommandStop - Stop

Didymos


Animace v pozadí hlavní nabídky

Autor : J.Dohnal

Známe to jistě všichni, z internetu si stáhneme ostrov (například Skye), po jeho prozkoumání se rozhodneme, že by se na tomto ostrově mohla odehrávat naše kampaň.Začneme editovat mise, a vždy, když editor opustíme je v pozadí hlavní nabídky stále spuštěna mise, na které jsme před chvilkou pracovali místo animace.

Postup při odstranění tohoto problému je velice jednoduchý, ale budeme potřebovat dva prográmky:
1.Depbo -je k rozpakování pbo souborů
2.Stuffpbo -slouží pro převod do pbo formátu

Oba programy jsou volně stažitelný na http://games.tiscali.cz/flashpoint/download

Krok 1: Prográmkem Depbo rozpakujte soubor anims.pbo v adrasáři ...Operace flashpoint\res\DTA nikoli ...Operace flashpoint\DTA protože by to v Resistance nefungovalo, a poté ho hoďte do koše!

Krok 2: Na ostrově Skye si vytvořte libovolné intro např.:Hromady ruských pěšáků za vddušné podpory útočí na město pod správou USA. Město po těžkých bojích získají a vyvěšují svou vlajku.Náhle jsou však na obzoru zpozorovány hordy M60 a M1A1, kteří si následně berou své město zpět.

Krok 3: Výsledek uložte jako "intro"

Krok 4: Ze složky ...Operace flashpoint\Users\<vaše jméno>\missions zkopírujte vaši animaci (intro.Skye) do složky ...operace flashoint\res\DTA\Anims (složka Anims nám vznikla po rozpakování Anims.pbo).

Krok 5: složku anims v adresáři ...operace flashoint\res\DTA převeďte do formátu pbo prográmkem Stuffpbo!

Hotovo, a už žádné protivné blbosti v pozadí hlavní nabídky operace flashpoint!


Tutorial #1
Autor : Leon

Tímto prvním tutoriálem začínám seriál článků na téma editace a

tvorba nových misí pro hru Operace Flashpoint. Samotná hra nabízí

sice dostatek zábavy, ale jednou si budete chtít zahrát další mise,

které lze najít na internetu, a někdy určitě dospějete i do stádia,

kdy zatoužíte po vlastní misi. K tomu vám stačí editor, který je

součástí hry, ale jeho dokonalé zvládnutí není otázkou dní, ale

minimálně týdnů. Přesto lze i po několika hodinách strávených u

editoru a s pomocí návodů a tutoriálů (třeba i s tímto) vytvořit

velmi slušnou misi. Doufám, že tento i následující tutoriály vám

pomohou.

Na začátku musím upozornit, že tutoriál je napsán bez podpory

Bohemia Interactive i Codemasters, a tak nijak neručím za informace

uvedené dále. Stejně tak nenesu zodpovědnost za eventuální problémy

a škody, které vám mohou v souvislosti s tímto článkem vzniknout. Na

druhou stranu vás musím uklidnit - nic by se stát nemělo.

Tutoriál je psán pro českou verzi hry, ale příkazy jsou ekvivalentní

k verzi anglické.

Základy práce s editorem

Tím mám za sebou nezbytný úvod a můžeme přistoupit k prvnímu

tutoriálu, který je určen pro začátečníky a středně pokročilé a

seznámí vás se základními pracemi v editoru. Ten se spouští z

prostředí hry a hned vám nabídne, jaký ze 4 ostrovů chcete pro misi

nahrát. To je důležité pro editaci nové mise, méně pokud si pak v

editoru načtete rozdělanou misi. Po načtení mapy jste již v

prostředí editoru a můžete si prohlédnout jeho nastavení. První

důležité nastavení je úplně vpravo nahoře, kde se přepínají módy

editoru "jednoduchý" a "pokročilý". Doporučuji okamžité přepnutí pro

pokročilé, protože jen v něm se dají dělat slušné věci. Hned pod ním

je okno, ve kterém se nastavují obecné věci pro misi - název, krátký

popis, datum, čas, typ počasí, předpověď počasí a čí jsou partyzáni

spojenci. Tyto položky můžete nastavit klidně až po naeditování celé

mise. Pod tímto oknem jsou položky Načíst, Spojit, Uložit a Smazat,

které samozřejmě slouží pro tyto operace s misemi. Pod nimi je ještě

položka, kde si vyberete, co edituje - misi, intro a dva typy outra.

Zpočátku si vystačíte se základní volbou - mise.

Pro samotnou editaci je ale důležitějších 6 položek v horní části

editoru - Jednotky, Skupiny, Spínače (Triggers), Body Trasy

(Waypoints), Synchronizace a Značky. V další části si uvedeme

základní informace pro jejich použití.

Ještě předtím ale několik obecných informací. V editoru lze používat

stejné klávesové zkratky pro kopírování (ctrl-c), vložení (ctrl-v) a

vyjmutí (ctrl-x), jako je znáte i z ostatních programů Windows.

Vložení nové věci se děje dvojitým kliknutím na daném místo, editace

stávající věci dvojitým kliknutím na ní. Velmi mnoho voleb využívá

zvýraznění (highlighting) dané věci, které dosáhnete jedním

kliknutím na jednotku na mapě. Opět je možno zvýraznit více věcí

najednou - držením ctrl a klikáním na jednotky. Pokud chcete

jednotku smazat, stačí na ní najet myší (musí se vám objevit její

název) a zmačknout klávesu delete. Pokud budete držet klávesu shift

a hýbat s jednotkou, dosáhnete její rotace. Za samozřejmost pak

považuji to, že se jednotky dají myší posouvat po mapě. To je asi

tak všechno k základnímu ovládání editoru, které byste měli

zvládnout bez větších problémů.

Jednotky (F1)

Tato položka slouží pro vytvoření nové jednotky nebo editaci již

vytvořené. Po vložení se vám otevře okno, kde je docela dost voleb.

Jako první je volba Strana, kde si volíte mezi Západem, Východem,

Partyzány, Civilisty, Imaginární jednotkou a Prázdnou. Pokud ještě

nemáte nastavenou postavu hráče, máte na výběr pouze první 4

položky. Volba Strany je velmi důležitá, protože později ji (asi

jako jedinou) již nemůžete změnit. Pod ní je volba Třída a Vpravo od

ní svázaná položka Typ jednotky. Tyto položky není třeba popisovat,

sami si zkuste, co všechno tam je. Vpravo nahoře zvolíte hodnost

jednotky, která je důležitá především pro pozici ve skupinách (více

si o tom povíme později). Speciální volby Stáří informace a vlastni

vás zatím nemusí zajímat, jsou velmi speciální a moc se nepoužívají.

Ovládání určuje, zda jde za postavu hrát - jako hráč, hratelná je

pro multiplayer mise, nehratelná jsou AI postavy. Zamčeno určuje,

zda je ta která jednotka přístupná. Klasickým případem jsou vozidla,

která při volbě zamčeno nelze řídit nebo do nich nastoupit. Důležité

je také zadávat název jednotky (bez mezerníku!), protože slouží k

identifikaci jednotky, zvláště v příkazech, skriptech apod.

Následuje měřítko dovednosti postavy, která například určuje, jak

tuhý nepřítel proti vám stojí a dá se zde skvěle vyladit obtížnost

mise. Za ním je pole Inicializace, kde není co volit a pouze tam

můžete něco napsat. Co vše tam lze zadat, si povíme v dalších

dílech, ale již teď vám prozradím některé užitečné volby. Když

budete ladit misi, jistě se vám bude hodit, že je vaše postava

nesmrtelná. K tomu stačí napsat do inicializačního pole příkaz

this allowDammage FALSE

Příkazů lze v tomto poli zadat více, jen je třeba je oddělit

středníkem. Můžete tam tak i přidat, jak se bude jednotka v případě

bezpečí chovat. Tak třeba příkaz

this setbehaviour "SAFE"

nastaví chování jednotky, jako kdyby byly v bezpečí (a zbraň mají na

zádech). Všechny stupně chování jsou "CARELESS", "SAFE", "AWARE",

"COMBAT" a "STEALTH". Sami si opět zkuste, jak to vypadá v praxi, my

se tím budeme více zabývat v pozdějších dílech tutoriálů.

Pod inicializačním polem jsou tři položky - zdraví, palivo a munice,

kde nastavíte počáteční hodnotu pro tu kterou jednotku. Příklad -

nastavíte u vojáka poloviční zdraví a do hry vstoupí již zraněn, u

vozidla zadáte žádné palivo a bez dotankování se nerozjede apod.

Azimut pak určuje, kterým směrem je jednotka natočena.

Pravděpodobnost výskytu zase určuje, v kolika procentech hraní mise

se tam ta která jednotka objeví. S tím souvisí položka poloměr

umístění, který určuje, v jakém kruhu se může jednotka náhodně

objevit. Zbyla nám už jen podmínka aktivace, kterou také nechte

zatím beze změny.

Skupiny (F2)

Skupiny jsou pro samotnou editaci i hraní velmi důležité. Pokud

chcete vložit celou skupinu, můžete takto přímo, přičemž k nastavení

slouží jen několik málo oken podobným těch z jednotek. Skupiny se

však automaticky tvoří i při jednotlivém vkládání jednotek. Spojení

skupiny poznáte podle toho, že je mezi jednotkami světle modrá čára,

která vede k jednotce s nejvyšší hodností. V případě, že mají

všechny jednotky stejnou hodnost, hra si náhodně vybere někoho jako

vedoucího, čemuž se ale pokud možno vyhýbejte. Raději volte alespoň

jednoho vojáka ve skupině s vyšší hodností. Pokud je pak tento

velitel zabit, automaticky přebírá velení nad skupinou voják s

druhou nejvyšší hodností atd.

Dvě jednotky spojíte do skupiny tak, že (musíte mít aktivní položku

Skupiny!) kliknete na jednu a tažením myši jí spojíte s druhou. Ze

skupiny ji zase lze vyřadit tak, že tažení myší provedete do volného

prostoru na mapě.

Nesmíte zapomínat, že ve skupině mohou být jednotky jen ze stejné

strany.

Tvorba skupin je důležitá především proto, že mají společné

waypointy (česky přeloženo krkolomně jako body trasy, budu používat

poměrně zaběhlý anglický název). Všechny waypointy nastavené pro

vedoucího tak vykonají i ostatní ve skupině.

Waypointy (F4)

Tím jsme se dostali k waypointům, pomocí nichž lze nastavit mnoho

zásadních věcí a jejich vyladěním (spolu se spínači) dostává mise ty

správné grády. Používají se ke všemu, co se dá shrnout pod pojem

"přesun" a jemu podobné věci. Waypoint vytvoříte tak, že zvolíte

volbu Body trasy (F4), kliknete jednou na jednotku, které chcete

waypointy zadat (tím se zvýrazní), a pak dvakrát kliknete na místo,

kde chcete waypointy zadat. Hned musím upozornit, že to nemusí být

na prázdném místě na mapě! Waypoint lze spojit i s některými

jednotkami. Pokud například dáte waypointy jako nástup do vozidla,

dáte waypoint přímo na vozidlo a on se s ním jaksi

"sesynchronizuje".

Po vložení waypointu se vám opět otevře editační okno a hned první

položka je mimořádně důležitá. Určuje totiž typ waypointu, z nichž

si můžete vybrat tyto:

PŘESUN - jednotka se přesune na waypoint

ZNIČIT - příkaz zničit to, co je na místě waypointu

NASTOUPIT - nastoupení do vozidla, na kterém je umístěn waypoint

NAJÍT A ZNIČIT - jednotka se přesune na místo waypointu a pak začne

hledat a napadat nepřítele

PŘIPOJIT SE - jednotka se spojí s jednotkou na waypointu

SPOJIT SE - to samé jako předtím, jen se přesunutá jednotka stává

velitelem skupiny

VYSTOUPIT - po přesunu vozidla na dané místo z něho vystoupí všichni

vojáci

ZACYKLENÍ - velmi důležitý waypoint, který si speciálně vysvětlíme

níže

NALOŽENÍ - vozidlo čeká, dokud není naloženo

VYLOŽENÍ - vozidlo čeká, dokud není vyloženo

VYLOŽENÍ NÁKLADU - podobné jako předtím, přesný rozdíl nevím

DRŽET POZICI - jednotka drží zadaný waypoint za každou cenu

HLÍDKOVAT - jednotka na daném waypointu hlídkuje

CHRÁNIT - jednotka se snaží chránit zadaný waypoint za každou cenu

MLUVIT

SKRIPTOVANÝ

PŘIPRAVIT PODPORU

Jak vidíte, typů waypointů je opravdu hodně, ale jednoznačně

nejpoužívanější je typ PŘESUN. Také jsem vám slíbil uvést příklad na

typ ZACYKLENÍ. Toho lze výborně využít, pokud definujete některé

hlídce trasu jejího pohybu a chcete, aby ji chodili neustále dokola.

To uděláte tak, že zvolíte jednotku, nadefinujete trasu pohybu (typ

PŘESUN) a jako poslední waypoint zvolíte ZACYKLENÍ, který umístíte

přímo na počáteční polohu hlídky. Tím se celá trasa zacyklí a hlídka

ji bude obcházet stále dokola.

Další volba je pořadí waypointů. To je výhodné zvláště pokud chcete

zařadit waypoint mezi již zadané, kdy si prostě vyberete jeho pořadí

(pozor, začíná se od nuly!).

Třetím polem je popis waypointu, který je důležitý zvláště pro

waypointy samotného hráče, protože to, co sem napíšete, se mu

zobrazuje ve hře jako jeho popis (pokud to o něco níže nezakážete).

S dalšími položkami režim, rychlost, formace a chování můžete

experimentovat, ale také nemusíte, ostatně co to které nastavení

dělá určitě pochopíte. Poloměr umístění pak opět určuje, v jakém

prostoru se daný waypoint náhodně objeví. Odpočet můžete zatím také

ignorovat a položky Podmínka a Při aktivaci si spolu s efekty (a

mnoha dalšími věcmi) probereme až příště, protože už úzce souvisí se

spínači.

Tak tím bych pro dnešek uzavřel první ze série tutoriálů k Operaci

Flashpoint. Doufám, že některé z vás zaujal a již s pomocí toho, co

jsem zde popsal, si vytvoříte (nebo začnete tvořit) vlastní misi.

Všechno popsané v tomto tutoriálu musíte dostat do malíčku, pokud se

chcete pustit do opravdu pořádných misí, ke kterým se také

dostaneme. A pokud budete mít nějaký problém nebo připomínku,

směřujte je do diskuse, kde se vám je (nebo někdo jiný) pokusím

zodpovědět. Zatím vám přeji zdar při experimentech v editaci.


Tutorial #2
Autor : Leon

Před týdnem jsem vám v prvním tutoriálu popsal základní práce v editoru misí, ale skončil jsem u waypointů. Tento tutoriál tedy berte jako dokončení popisu základních položek a voleb v editoru. Příští tutoriály pak již budou zaměřeny vyloženě prakticky, ale pro jejich lepší pochopení je třeba znát teoretické základy.

Spínače (F3)
Spínače (anglicky Triggers) slouží (zhruba řečeno) ke všemu ostatnímu, co nejde udělat waypointy. Jejich použití a možnosti jsou velmi rozsáhlé, protože záleží jen na vás, co ten který spínač sepne. V neposlední řadě se právě pomocí spínačů ukončuje mise.
Spínač vložíte dvojitým kliknutím někde na mapu, po kterém se vám otevře editační okno. První položka určuje rozměry samotného spínače. Na to dávejte velký pozor, protože pokud se stane, že jednotka mine spínač (z různých důvodů), tak ho nesepne, což může mít fatální důsledky pro celou vaši misi. Obecně je proto lepší dělat o něco větší (třeba úzké a dlouhé) plochy spínačů. Vybrat si můžete mezi elipsou a obdélníkem, přičemž je celkem jedno, co si zvolíte. Důležité jsou ale právě ony rozměry, které zadáváte přes osy A a B, a jeho natočení (azimut).
Další položky určují, kdo a jak spínač aktivuje. Důležité je také, zda spínač sepne opakovaně (kdykoliv se něco stane) nebo jen jednou. Většinou si vystačíte s jedním sepnutím. Pak jsou tam dvě položky odpočet a trvání, přičemž zvolit si můžete jen jednu, což je občas škoda (musíte to pak řešit dalším spínačem). Rozdíl mezi nimi je ten, že zatímco odpočet určuje, za jak dlouho se něco stane poté, co byl spínač aktivován, trvání určuje, jak dlouho je spínač aktivní.
Typ mise je důležitý hlavně proto, že se v něm nacházejí položky Konec č. x, které vám ukončí celou misi. Podrobně se o tom budeme bavit až v praktických tutoriálech, kde to i lépe pochopíte. Položky název a text slouží jen k vaší lepší orientaci po mapě, důležité jsou ale další položky. Pokud se nemýlím, tak podmínka u spínače musí být vždy nastavena na this, položky při aktivaci a při deaktivaci určují, co se stane, když je spínač sepnut (a vypnut). Sem můžete zadávat stejné příkazy jako u waypointů a i toto bude lepší vysvětlit v praktických tutoriálech.
Úplně vlevo dole pak najdete velmi důležitou položku efekty. Ta sice není příliš důležitá z hlediska samotné mise, ale právě pomocí efektů ji můžete pěkně vyšperkovat. Zde si totiž můžete zvolit, co se stane, když je spínač sepnut. Volby jsou celkem jasné a pochopitelné - přehrát zvuk, hlas, hudbu, vypsat na obrazovku text, mnoho kamerových efektů apod. Sami si vyzkoušejte, co má jaký efekt.

 Synchronizace (F5)
Synchronizace slouží ke spojení spínačů a waypointů, které se pak vykonají v jeden čas (jsou sesynchronizovány). Je to věc velmi důležitá, ale také je pravda, že ji vůbec nemusíte používat. Přesněji řečeno, nemusíte ji používat takto, ale pomocí zadávání proměnných. Vše radši uvedu na příkladu. Chcete sjednotit útok dvou jednotek na vesnici z opačných stran. Na jednu stranu dáte spínač, ten spojíte (tažením myši, uvidíte tmavě modrou čáru) s waypointem druhé jednotky. Tím dosáhnete toho, že druhá jednotka bude pokračovat přes waypoint až poté, co ta první sepne spínač. Ještě vám ukážu příklad, jak to jde udělat přes příkazy. Na spínač dáte při aktivaci třeba

utoc=true

a na waypoint druhé jednotky jako podmínku

utoc

čímž dosáhnete úplně stejné synchronizace. Raději používám tuto druhou metodu, protože mi připadá přehlednější, zvláště v komplikovaných misích, kdy je problém vyznat se v tom, co dělá ta která čára na mapě.

Značky (F6)
Značky slouží jen a pouze k označení toho, co pak vidíte při samotné misi na mapě a při briefingu. Pomocí nich tak označíte vaši počáteční polohu, jednotlivé cíle mise, polohy nepřátel, kde mise končí apod. Většinou je pro toto dobré používat předdefinované obrázky, jejichž smysl určitě pochopíte. Do pole text napište to, co bude grafickou značku doplňovat jako text. Doporučuji zadávat i název značky, čehož využijete především při tvorbě briefingu, který se tvoří jako html dokument. Pokud v něm pak chcete spojit zmínku v textu s ukázáním na místo na mapě, zadáte do zdrojového souboru briefingu něco jako <a href="marker:nazev_znacky">. Jak se tvoří briefing.html a overview.html si podrobněji povíme v některém z dalších tutoriálů.

Tím máme za sebou základní popis samotného editoru a můžeme v dalších tutoriálech přistoupit k názornému popisu tvorby jednotlivých misí. Přeji hodně úspěchů při tvorbě misí.


Tutorial 3

Autor : MAA

Cieľom tohoto tutoriálu je naučiť vás základné práce v internom EDITORE MISIÍ [MISSION EDITORE] v Operation Flashpoint a vytvorit si vlastnú jednodúchú misiu. Nasledujúce postupy som sa naučil sám skúšaním (mám čo-to programátorských skúseností z iných oblastí) a niečo som sa priučil čítaním tutoriálov na zahraničných fanstránkach. Preto tieto postupy nemusia byť práve najideálnejšie, ale sú mnou vyskúšané a overené. Pre lepšie pochopenie si môžete popisovanú misiu stiahnut. Nájdite si adresár, kde máte nainštalovaný Operation Flashpoint a nakopírujte si ju do do podadresára \USERS\vaše meno\MISSIONS\... .

Pozn. editora (Leon): Tutoriál je psaný ve slovenštině, což je rodný jazyk autora tohoto tutorialu, proto se občas může stát, že některý výraz ze hry zcela přesně neodpovídá české verzi. Nemělo by to však být často a na kvalitě tutoriálu to nic neubírá.

Editor
Po spustení editora z hlavného menu Operation Flashpoint, nás vyzve k vyberu ostrova, na ktorom budeme vytvárať misiu. Zvolíme si EVERON. Je to môj najobľúbenejší ostrov. Velmi mi pripomína naše zemepisné podmienky. Po tom ako sa načítajú data, sa dostaneme priamo do editora. Skladá sa z troch hlavných častí. Na pravej strane sa nachádza hlavné menu editora, v hornej časti je lišta s funkčným menu. Najväčšiu časť zaberá mapa ostrova. Je rozdelená do sektorov ako šachovnica. Stĺpce sú značene písmenami a riadky číslami.
V hornej časti hlavného menu je nastavenie zložitosti editora: JEDNODUCHÝ / POKROČILÝ [NOVICE / ADVANCED]. Zvolíme si POKROČILÝ, aby sme sa dostali k všetkým nastaveniam. Nižšie pod týmto nastavením sa nachádza display s ikonou oblačika a s časom. Klikneme na display. Zobrazí sa nám nastavenie času, počasia a názvu misie. Všade necháme defaultné (prednastavené) hodnoty. Zadáme iba názov misie:

test1

Po tomto základnom oboznámení sa z editorom, začneme so samotným vytváraním misie. Cieľom misie bude v úlohe radového ruského vojaka podniknúť útok na americkú hliadku v Montignacu. Potom si do misie pridáme zopár vylepšení ako je príchod nepriateľských posíl po aktivácii senzoru, využitie dvoch druhov synchronizácie na prelet vrtulníka a príchod M113 a nakoniec nastupovanie, vystupovanie a používanie dopravných prostriedkov.

Krok 1 - pridanie jednotky
Stlačením F1 sa prepneme do vkladania a editovania jednotiek (vojakov, áut, ...). Na mape sa presunieme do sektoru Ea,44 (kúsok vpravo od Montignacu). Dvojklikom na prazdnej ploche pridáme prvú jednotku. Objaví sa nám okno, v ktorom navolíme nasledujúce hodnoty:

STRANA [SIDE]: VÝCHOD [EAST]
TRIDA [CLASS]: MEN
OVLADANI [CONTROL]: HRÁČ [PLAYER]
HODNOST [RANK]: VOJÍN [PRIVATE]
JEDNOTKA [UNIT]: VOJÁK [SOLDIER]
NAZEV [NAME]: Hrac
AZIMUT: 180

Teraz rovnakým spôsobom pridáme vedľa ďalších dvoch vojakov. Všetkým dáme TRIDA: MEN a AZIMUT nastavíme na 180. Zadáme hodnoty:

STRANA [SIDE]: VÝCHOD [EAST]
OVLADANI [CONTROL]: NEMUŽE HRÁT HRÁČ [NOT PLAYABLE]
HODNOST [RANK]: ČETAŘ [SERGEANT]
JEDNOTKA [UNIT]: DUSTOJNÍK [OFFICER]
NAZEV [NAME]: EAST1
SCHOPNOST [SKILL]: 50%

a druhý:

STRANA [SIDE]: VÝCHOD [EAST]
OVLADANI [CONTROL]: NEMUŽE HRÁT HRÁČ [NOT PLAYABLE]
HODNOST [RANK]: SVOBODNÍK [CORPORAL]
JEDNOTKA [UNIT]: KULOMETČÍK [MACHINE GUNNER]
NAZEV [NAME]: EAST2
SCHOPNOST [SKILL]: 50%

Takže teraz máme troch vojakov v našom teame. Všimnite si, že od veliteľa vedú bledo modre čiary k jednotlivým vojakom. To znamená, že sú v jednej formácii a ich veliteľ je EAST1. Hodnotou SCHOPNOST nastavíme presnosť a reakcie vojaka. Doporučujem hodnoty od 25 po 75 (podľa HODNOSTI), pri vysokom nastavení sa už z vojaka stáva Superman a je to už väčšinou nehrateľné…

Krok 2 - nastavení waypointů
Waypointami si vyznačujeme kadiaľ sa bude náš team pohybovať a aké činnosti bude v určitých miestach prevádzať.

Jednoduchým kliknutím na vojaka EAST1 ho označime a stlačime F4. Urobíme dvojklik v sektore Dj,45 a zobrazí sa nám okno editácie waypointu, v ktorom zadáme nasledovné:

TYP: PŘESUN [MOVE]
FORMACE [FORMATION]: WEDGE
CHOVÁNÍ [BEHAVIOUR]: OPATRNÉ [AWARE]
nastavíme UKÁZAT V KADET MODU [SHOW IN CADET MODE]

Týmto dosiahneme, že sa nám náš team presunie k tomuto miestu v navolenej formácii a chovaní.
Keby sme chceli mať niektoré vlastnosti jednotky (napr. CHOVÁNÍ) nastavené už pri jej vytvorení, môžeme to urobiť pri editácii jednotky zadaním parametru v jej položke INICIALIZACE. Napríklad ak chceme mať CHOVÁNÍ: OPATRNÉ, tak zadáme:

this SetBehaviour "AWARE"

Toto si preberieme v niektorom z ďalších tutoriálov. Len som vám chcel ukázať, že niektoré veci sa dajú robiť viacerými spôsobmi.

Ďalší waypoint umiestnime na križovatku v Montignaci. Navolíme:

TYP: NAJDI A ZNIC [SEARCH AND DESTROY]
CHOVÁNÍ [BEHAVIOUR]: BOJOVÉ [COMBAT]
nastavíme UKÁZAT V KADET MODU [SHOW IN CADET MODE]

Nastavenie UKÁZAT V KADET MODU nám zabezpečí, že pri nastavení obtiažnosti na KADET vidíme waypointy a ich názvy počas hrania priamo na HUDe. Pri zadaní TYP: NAJDI A ZNIC nám náš team, po tom ako dosiahne waypoint, začne v jeho okruhu vyhľadávať nepriaťeľa a zničí ho.

Ešte poznámka k CHOVÁNÍ. Pri voľbe COMBAT sú vojaci veľmi opatrný a často sa plazia, čo niekedy pri presunoch vadí. Preto v niektorých prípadoch radšej používajte nastavenie AWARE, vtedy vojaci zaľahnú iba v ohrození.

Hru si uložíme pomocou ULOŽIT [SAVE] na hlavnom paneli. Zobrazí sa nám menu, kde navolíme JMÉNO [NAME]: test1 , ULOŽIT JAKO [SAVE AS]: SOUKROMÁ MISE [USER MISSION].

Teraz si môžeme vyskušať ako sa bude naša jednotka pohybovať. Stlačime ZKUSIT [PREVIEW] na hlavnom paneli a riadime sa povelmi veliteľa. Keď sa dostaneme na posledný waypoint, tak misiu ukončíme stlačením ESC a voľbou ZRUŠIT [ABORT].

Takáto skúška je podľa mňa dobrá, lebo predídeme možným problémom v neskorších fázach.

(Pozor, v móde ZKUSIT nemusí fungovať korektne zobrazovanie waypointov na obrazovke!)

Keďže nám všetko beží v poriadku pristúpime k pridaniu nepriateľa.

Krok 3 - Pridanie nepriateľa
Presunieme sa na sever Montignacu (Di,45). Stlačíme F1 a pridáme dvoch vojakov (hliadku) s následujúcimi hodnotami:

STRANA [SIDE]: ZÁPAD [WEST]
OVLADANI [CONTROL]: NEMUŽE HRÁT HRÁČ [NOT PLAYABLE]
HODNOST [RANK]: ČETAŘ [SERGEANT]
JEDNOTKA [UNIT]: DUSTOJNÍK [OFFICER]
NAZEV [NAME]: WEST1
SCHOPNOST [SKILL]: 50%
AZIMUT: 135

STRANA [SIDE]: ZÁPAD [WEST]
OVLADANI [CONTROL]: NEMUŽE HRÁT HRÁČ [NOT PLAYABLE]
HODNOST [RANK]: VOJÍN [PRIVATE]
JEDNOTKA [UNIT]: KULOMETČÍK [MACHINE GUNNER]
NAZEV [NAME]: WEST2
SCHOPNOST [SKILL]: 50%
AZIMUT: 135

Krok 4 - waypointy pre nepriateľa
Teraz si nastavíme waypointy pre nepriateľa. Prvý waypoint dáme kúsok po ceste na juh a nastavíme:

TYP: PŘESUN [MOVE]
REŽIM [COMBAT MODE]: STŘÍLET, FORMACE VOLNÁ [OPEN FIRE, ENGAGE AT WILL]
RYCHLOST [SPEED]: OMEZENÁ [LIMITED]
FORMACE [FORMATION]: WEDGE
CHOVÁNÍ [BEHAVIOUR]: BEZ RIZIKA [SAFE]

Nastavením CHOVÁNÍ na BEZ RIZIKA sa hliadka bude pohybovat so zbraňou na chrbáte, ale pripravenou k použitiu. Ďaľší waypoint dáme kúsok južne za križovatku:

TYP: PŘESUN [MOVE]
všetky hodnoty necháme na: BEZE ZMĚNY [NO CHANGE].

Keďže chceme, aby sa hliadka pohybovala stále dookola, ďaľší waypoint dáme tesne vedľa prvého a hodnotu TYP nastavíme na ZACYKLENÍ [CYCLE] a TIMEOUT na MIN:5, MAX:15, MID:10 .
Zadaním TIMEOUT nám hliadka prejde znova na prvý waypoint až po vypršaní nastaveného času.

Krok 5 - Spínače pro konec mise
Teraz máme fungujúcu nepriateľskú hliadku. Už nám chýba len nejaký koniec. Na to nám poslúži SENZOR [TRIGGER]. Kurzorom sa presunieme do stredu Montignacu a stlačíme F3. V zobrazenom okne triggeru nastavíme:

POLOOSY [AXIS] a,b: 100
AKTIVACE [ACTIVATION]: ZÁPAD [WEST]
nastavíme položku NEPŘÍTOMEN [NOT PRESENT]
TYP: KONEC č.1 [END#1]
TEXT: END
JMÉNO [NAME]: END

To znamená, že ak nebude existovať žiadna jednotka vo vyznačenom okruhu, tak sa misia ukončí. Aby sme si to trocha oživili, tak si v nastaveniach spinača END kliknite na EFEKTY [EFFECT] a nastavte položky:

KAMERA [CAMERA]: - EFEKT [EFFECT]: OKOLO&ZOOM POMALU [AROUND & ZOOM SLOW]
- POZICE [POSITION]: ZEZADU [BACK]
TITULKY [TITLES]: - TYP: TEXT
- TEXT: Neriatel bol zlikvidovaný
- EFEKT [EFFECT]: UPROSTRED [PLAIN]

Uložíme si misiu a dáme ZKUSIT [PREVIEW]. Keď všetko v poriadku funguje, tak nám stačí už iba vytvoriť BRIEFING a OVERVIEW (týmto sa bude zaoberať iný tutorial) a misia je hotová. Stačí ju iba uložiť cez ULOŽIT JAKO [SAVE AS]: PUBLIKUJ JAKO VEŘEJNOU MISI [EXPORT TO SINGLE MISSIONS].

Doplňky k misi
Doteraz sme používali iba najjednoduchšie funkcie editora, ale aby mali z tohoto tutorialu niečo aj mierne pokročilí, tak si skúsime pridať a použiť niektoré z ďalších funkcií.

Najdôležitejšie je asi používanie synchronizácie. Možeme použiť dva základné druhy:

1. pomocou synchronizačnej čiary priamo v editore cez F5
2. pomocou premenných

1. PRÍCHOD M113 DO MONTIGNACU

Takže si do našej vytvorenej misie pridáme nepriateľský M113, ktorý príde hliadke na pomoc do Montignacu keď nás hliadka spozoruje.

Pomocou F1 si v sektore (Df,44) na ceste vytvoríme M113:

STRANA [SIDE]: ZÁPAD [WEST]
TRÍDA [CLASS]: ARMORED
OVLADANI [CONTROL]: NEMUŽE HRÁT HRÁČ [NOT PLAYABLE]
HODNOST [RANK]: VOJÍN [PRIVATE]
JEDNOTKA [UNIT]: M113
NAZEV [NAME]: M113
SCHOPNOST [SKILL]: 25%
AZIMUT: 120

Vytvoríme mu waypoint F4 pár metrov pred neho na ceste:

TYP: PŘESUN [MOVE]
RYCHLOST [SPEED]: OMEZENÁ [LIMITED]
CHOVÁNÍ [BEHAVIOUR]: BEZ RIZIKA [SAFE]

Poznámka k nastaveniu CHOVÁNÍ. Keď použijeme nastavenie BEZ RIZIKA alebo OPATRNÉ, tak sa nám bude jednotka pohybovať pekne po ceste až k miestu, odkiaľ je najbližšie k waypointu, ak je tento mimo cesty. Ak by sme zadali BOJOVÉ, tak bude jednotka križovať po ceste a vyhýbať sa možným nástrahám (a narážať do predmetov), čo nemusí byť veľmi príjemné. Vizerá to, akoby mal vodič 2 promile alkoholu v krvi.
Dajte si ešte pozor na nastavenie RYCHLOST [SPEED]. Pri nastavení PLNÁ [FULL] a pri veľmi kľukatej ceste (a pri prechode cez dediny) sa veľmi často stáva, že jednotka vyletuje z cesty a naráža do predmetov v jej okoli.

Teraz si vytvoríme SENZOR, ktorým privoláme M113. Vytvoríme si ho pri senzore END:

POLOOSY [AXIS] a,b: 200
AKTIVACE [ACTIVATION]: VÝCHOD [EAST]
nastavíme položku DETEKOVÁN ZÁPADEM [DETECTED BY WEST]
TYP: PŘEPNI [SWITCH]
TEXT: M113move
JMÉNO [NAME]: M113move

Stlačíme F5, kliknutím na vlajočku si vyznačíme senzor M113move a potiahneme (držať ľavé tlačítko na myške) na prvý waypoint M113. (Vytvorí sa nám modrá čiara zo senzoru na prvý waypoint M113.) Týmto sme zabezpečili, aby sa M113 pohlo na svoj prvý waypoint až po aktivácii senzora, čo v našom prípade znamená, že sa pohne po tom čo nás hliadka odhalí.
Ak chcete mať spätnú väzbu na to či sa dáný senzor aktivoval (môžete to použiť aj pre waypointy), tak si v nastavení EFEKTY vyplňte napríklad:

TITULKY [TITLES]: - TYP: TEXT
- TEXT: Blizia sa nepriatelske posily
- EFEKT [EFFECT]: DOLE [BOTTOM]

Potom si vytvoríme ďaľší waypoint pre M113 kúsok nad kriźovatkou v Montignacu:

TYP: NAJDI A ZNIČ [SEEK AND DESTROY]
REŽIM [COMBAT MODE]: STŘÍLET, FORMACE VOLNÁ [OPEN FIRE, ENGAGE AT WILL]
RYCHLOST [SPEED]: BEŽNÁ [NORMAL]
CHOVÁNÍ [BEHAVIOUR]: OPATRNÉ [AWARE]
POLOMĚR [RADIUS]: 25

Vyplnením poľa POLOMER docielime, že nám M113 nepríde priamo na waypoint ale náhodne v okruhu 25 metrov od neho.

2. PRIDANIE ZBRANE DO OBJEKTU

Aby sme mali proti M113 šancu, musíme si pridať nejakú protitankovú zbraň. Pri križovatke v Montignacu si vytvoríme objekt s hodnotami:

STRANA [SIDE]: PRÁZDNÝ [EMPTY]
TRÍDA [CLASS]: AMMO
JEDNOTKA [UNIT]: KRABICE S MUNICI II (ZÁPADNÍ) [AMMO CRATES II WEST]

Do políčka INICIALIZACE vpíšeme nasledovné:

this AddWeaponCargo ["LAWLauncher",1]; this AddMagazineCargo ["LAWLauncher",3]

Aby sa nám nestalo, že znićíme hliadku a misia sa hneď ukočí bez toho aby prišlo M113, tak do senzoru END vpíšeme do poľa PODMÍNKA namiesto this následujúce:

this and not alive M113

To znamená, že koniec misie nastane, ak v rozsahu senzora END nebude žiadna nepriaťeľska jednotka a M113 bude zničené.

3. PRELET VRTUĽNÍKA NAD BOJISKOM

Ešte si môžeme vyskúšať použitie premenných pri synchronizácii. Vytvoríme si niekde v sektore (Dh,39) vrtulník UH60, ktorý nám preletí počas bojov nad hlavou:

STRANA [SIDE]: ZÁPAD [WEST]
TRÍDA [CLASS]: AIR
HODNOST [RANK]: VOJÍN [PRIVATE]
JEDNOTKA [UNIT]: UH60
NAZEV [NAME]: HELI
SCHOPNOST [SKILL]: 25%
AZIMUT: 180

A dáme mu waypoint zase pár metrov južne:

TYP: PŘESUN [MOVE]
REŽIM [MODE]: STŘÍLET ZAKÁZÁNO [NEVER FIRE]
RYCHLOST [SPEED]: OMEZENÁ [LIMITED]
CHOVÁNÍ [BEHAVIOUR]: BEZ RIZIKA [SAFE]

Do políčka PODMÍNKA zadáme namiesto true:

prelet

Čiže, tento waypoint bude aktívny, až bude hodnota tejto premennej true. Túto premennú môžeme využívať v ďaľších podmienkach či už pri waypointoch alebo senzoroch v celej misii.To si predvedieme ďalej.

Poznámka. Je nutné zadať REŽIM: STŘÍLET ZAKÁZÁNO, inak by vrtuľník pri prelete nad Montignacom spustil na nás paľbu.

Do poľa PŘI AKTIVACI [ON ACTIVATION] senzora M113move pridáme:

prelet=true

Toto znamená, že ak bude senzor aktivovaný (hliadka nás detekuje), tak sa zmení hodnota premennej prelet na true. Aktivuje sa nám tým prvý waypoint vrtuľníka HELI.

Potom vytvoríme pre vrtulník druhý waypoint pomocou F4 v sektore (Ea,60) tak, aby trasa vrtulníka zhruba križovala cez Montignac:

TYP: PŘESUN [MOVE]
RYCHLOST [SPEED]: BEŽNÁ [NORMAL]

Poprípade môžete tento prelet zacyklovať pomocou ďaľšieho waypointu TYP:ZACYKLENÍ blízko pri prvom waypointe vrtulníka.

4. PRÍCHOD POSÍL V DŽÍPE
(Nastupovanie a vystupovanie z dopravných prostriedkov)

Tak a teraz si ešte vyskúšame nastupovanie a vystupovanie z dopravných prostriedkov.

V sektore (Dh,42) na ľavo od cesty si vytvoríme dvoch nepriateľských vojakov:

STRANA [SIDE]: ZÁPAD [WEST]
OVLADANI [CONTROL]: NEMUŽE HRÁT HRÁČ [NOT PLAYABLE]
HODNOST [RANK]: ČETAŘ [SERGEANT]
JEDNOTKA [UNIT]: VOJÁK [SOLDIER]
NAZEV [NAME]: WEST3
SCHOPNOST [SKILL]: 25%
AZIMUT: 90

STRANA [SIDE]: ZÁPAD [WEST]
OVLADANI [CONTROL]: NEMUŽE HRÁT HRÁČ [NOT PLAYABLE]
HODNOST [RANK]: VOJÍN [PRIVATE]
JEDNOTKA [UNIT]: VOJÁK [SOLDIER]
NAZEV [NAME]: WEST4
SCHOPNOST [SKILL]: 25%
AZIMUT: 90

Klikneme na WEST3 a zadáme waypoint kúsok od cesty:

TYP: NÁSTUP [GET IN]
CHOVÁNÍ [BEHAVIOUR]: OPATRNÉ [AWARE]

Na ceste pred nimi si vytvoríme džip:

STRANA [SIDE]: ZÁPAD [WEST]
TRÍDA [CLASS]: CAR
HODNOST [RANK]: VOJÍN [PRIVATE]
JEDNOTKA [UNIT]: DŽÍP [JEEP]
NAZEV [NAME]: JEEP
SCHOPNOST [SKILL]: 25%
AZIMUT: 180

Stlačíme F2 a potiahneme čiaru z džípu do prázdneho priestoru, aby sme ho vyňali z formácie.(Džíp sa automaticky pričlenil k jednotke s vyššou hodnosťou, ktorá bola v dosahu.) Džípu vytvoríme waypoint pár metrov južne na ceste:

TYP: NALOŽ [LOAD]
CHOVÁNÍ [BEHAVIOUR]: BEZ RIZIKA [SAFE]

Chceme, aby džíp prišiel do Montignacu až po tom ako nás nepriateľ spozoruje. Preto vpíšeme do políčka PODMÍNKA namiesto hodnoty true nasledujúce:

prelet

Keď si pamätate, túto premennú sme už raz použili na to, aby nám preletel cez Montignac vrtulník po tom ako nás nepriateľ spozoroval a privolal M113. Spušta sa pri aktivácii senzora M113move.

Oba waypointy (NÁSTUP, NALOŽ) zosynchronizujeme pomocou F5.

Džípu vytvoríme ďalší waypoint na severnom okraji Montignacu:

TYP: VYLOŽ TRANSPORT [UNLOAD TRANSPORT]
CHOVÁNÍ [BEHAVIOUR]: BEZ RIZIKA [SAFE]

Pár metrov južnejšie (čo najbližšie) ďalší:

TYP: VYSTÚP [GET OUT]
CHOVÁNÍ [BEHAVIOUR]: OPATRNÉ [AWARE]

Na tomto mieste nám vystúpi vodič džípu a pridá sa k boju.

Teraz zadáme ďalší waypoint pre WEST3 pri waypointe džípu VYLOŽ TRANSPORT a zosynchronizujeme ich pomocou F5:

TYP: VYSTÚP [GET OUT]
CHOVÁNÍ [BEHAVIOUR]: BOJOVÉ [COMBAT]

Teraz si to zosumarizujeme. Po tom, ako nás nepriateľ spozoruje nástúpia WEST3 a WEST4 do džípu JEEP a prídu do Montignacu. Tam najskôr vystúpia WEST3 a WEST4 a potom vystúpi vodič JEEPu.

Otvoríme si editáciu senzoru END a nahradíme celú podmienku v poli PODMÍNKA nasledujúcim textom:

this and not alive M113; not alive WEST3

Týmto zabezpečíme to, že aj keby boli hliadka aj M113 zničené, tak sa misia ukončí až keď prídu posily WEST3 a WEST4 s JEEPom a tie budú zničené tiež.Do podmienky stačí napísať iba veliteľa, lebo keď posily prídu do dosahu senzora END ,tak pre nich bude platiť hlavná podmienka senzora NEPŘÍTOMEN [NOT PRESENT].

Misiu si uložte a vyskúšajte. Keď ide všetkov poriadku, tak ju exportujte do verejných misií.

Závěr
Uf. Tak to by bolo na začiatok asi všetko. Popredu sa ospravedlňujem ak sú v článku preklepy alebo pravopisné chyby. Písal som ho v sobotu od 23:00 do 03:00 a už mi mozog nepracoval naplno. Dúfam, že vám to niečo priniesie. Ukázal som vám iba základné a najjednoduchšie postupy pri vytváraní vlastnej misie. V editore je ešte veľa toho, čo sa dá použiť, nehovoriac ešte o používaní scriptov (čo je mimochodom veľmi silný prostriedok pri vytváraní misií), ale to už je na ďalší tutorial. Myslím si, že na začiatok už toho bolo akurát dosť.
Želám vám veľa štastia a pevných nervov pri vytváraní misií do tejto vynikajúcej hry (aj keď je v nej dosť "bugov", ktoré dúfam odstránia patche). Keby ste mali nejaké problémy alebo konkrétne otázky na niečo, tak sa ozvite do diskusie alebo poprípade na môj email. Keď budem vedieť pomôcť a budem mať dostatok voľného času (s ním je to dosť zúfalé), tak poradím.

P.S. Pokud máte nějaký problém s tvorbou této mise, můžete si ji již vytvořenou stáhnout na http://games.worldonline.cz/flashpoint/tutorials/ofptutorial3/test1.Eden.rar .


Tutorial #5
Autor : MAA

Manipulácia s vozidlami
V tomto tutoriali sa naučíme používať vojenské a civilné dopravné prostriedky pomocou príkazov na to určených. To využijeme ak chceme konkrétnych vojakov obsadiť na konkrétne pozície vo vozidle.
Hneď na začiatku vás musím upozorniť, že pred použitím každého vozidla si overte jeho kapacitu voľných miest v nákladovom priestore, poprípade či obsahuje pozície strelca atď... Je to dôležité preto, aby sa vám nestali niektoré nepríjemné veci ako mne. Napríklad som dal do BMP nastúpiť do nákladového priestoru 9 vojakov. Vošlo sa ich tam však iba 8. Keďže veliteľ nastupuje väčšinou ako posledný a nezostalo pre neho voľné miesto, tak bežal za BMP až k miestu vyloženia... a z toho vyplývali ďalšie problémy.

To bolo na úvod a teraz pristúpime k samotným príkladom.

Takže najskôr si vytvoríme zopár vojakov niekde blízko cesty:

STRANA [SIDE]: VÝCHOD [EAST]
TRIDA [CLASS]: MEN
OVLADANI [CONTROL]: HRÁČ [PLAYER]
HODNOST [RANK]: VOJÍN [PRIVATE]
JEDNOTKA [UNIT]: VOJÁK [SOLDIER]
NAZEV [NAME]: aP

STRANA [SIDE]: VÝCHOD [EAST]
OVLADANI [CONTROL]: NEMUŽE HRÁT HRÁČ [NOT PLAYABLE]
HODNOST [RANK]: ČETAŘ [SERGEANT]
JEDNOTKA [UNIT]: DUSTOJNÍK [OFFICER]
NAZEV [NAME]: EAST1
SCHOPNOST [SKILL]: 50%

STRANA [SIDE]: VÝCHOD [EAST]
OVLADANI [CONTROL]: NEMUŽE HRÁT HRÁČ [NOT PLAYABLE]
HODNOST [RANK]: SVOBODNÍK [CORPORAL]
JEDNOTKA [UNIT]: KULOMETČÍK [MACHINE GUNNER]
NAZEV [NAME]: EAST2
SCHOPNOST [SKILL]: 50%

Nastupovanie do vozidiel použitím waypointu
Chceme, aby náš team prešiel na waypoint a tam nastúpil do vozidla. To bude napríklad V3S. Vytvoríme si waypoint pre náš team:

TYP: NÁSTUP [GET IN]
CHOVÁNÍ [BEHAVIOUR]: OPATRNÉ [AWARE]

a na ceste pri ňomi si vytvoríme V3S-ku:

STRANA [SIDE]: PRÁZDNÝ [EMPTY]
TRÍDA [CLASS]: CAR
HODNOST [RANK]: VOJÍN [PRIVATE]
JEDNOTKA [UNIT]: PV3S
NAZEV [NAME]: V3S

Do políčka PŘI AKTIVACI waypointu NÁSTUP zadáme:

aP AssignAsDriver V3S

Hráč sa tak stane šoférom vo V3S-ke. Ostatných členov teamu umiestnime ako náklad. V políčku PŘI AKTIVACI potom bude:

aP AssignAsDriver V3S; EAST1 AssignAsCargo V3S; EAST2 AssignAsCargo V3S

POZOR jednotlivé príkazy je treba oddelovať bodkočiarkou " ; "

Nasledujúci príkaz sa používa vtedy, ak chceme aby na určitom mieste alebo za určitých okolností opustila vozidlo iba časť teamu, alebo iba jeden jeho člen. Využijeme to napríklad v políčku Při Aktivaci [On Activation] senzora, v scripte alebo v hociakej inej podmienke. Ak chceme aby vystúpil celý team, tak použijeme jednoducho iba waypoint VYSTUP [GET OUT].

Na vystúpenie hráča aP z vozidla použijeme príkaz:

UnassignVehicle aP

V prípade, že použijeme vyššie uvedený prikaz, vo vozidle sa uvoľní miesto, ktoré môžeme obsadiť iným vojakom vo vozidle. Na tieto účely sa používajú následovné príkazy:

a) - Na presun jednotky do nákladového priestoru vozidla:

jednotka MoveInCargo vozidlo

b) - Na presun jednotky do pozície veliteľa vozidla:

jednotka MoveInCommander vozidlo

c) - Na presun jednotky do pozície strelca vo vozidle:

jednotka MoveInGunner vozidlo

d) - Na presun jednotky do pozície šoféra vo vozidle:

jednotka MoveInDriver vozidlo

Uvedieme si jeden príklad. Hráč vystúpi a na jeho miesto šoféra V3S sa presunie EAST2

UnassignVehicle aP; EAST2 MoveInDriver V3S

Prejdeme k ďaľšiemu príkladu. Vyskúšame si umiestnenie nášho teamu do tanku T80:
Na ceste umiestnime:

STRANA [SIDE]: PRÁZDNÝ [EMPTY]
TRÍDA [CLASS]: ARMORED
HODNOST [RANK]: VOJÍN [PRIVATE]
JEDNOTKA [UNIT]: T80
NAZEV [NAME]: Tank

Nasledujúcim príkazom nahradíme v políčku PŘI AKTIVACI waypointu NÁSTUP [GET IN] jeho obsah. Hráča aP umiestnime na pozíciu strelca, EAST2 bude šofér a EAST1 bude veliteľ vozidla:

aP AssignAsGunner Tank; EAST2 AssignAsDriver Tank; EAST1 AssignAsCommander Tank

Toto použijeme pri všetkých bojových vozidlách aj vrtulníkoch (tam nieje pozícia Commander). Pri bojových transportných vozidlách (napr. BMP, M113, MI-17, ...) môžeme použiť navyše aj príkaz na nastupovanie do nákladového priestoru V3S, aby sme tam mohli umiestniť napríklad členov ďalšieho teamu:

jednotka AssignAsCargo vozidlo

Obsadenie pozícií vo vozidlách ihneď po spustení misie
Na ďaľšíom príklade si predvedieme ako umiestniť jednotky do vozidiel už pri štarte misie.
Na to nám poslúži políčko INICIALIZACE pri každej jednotke. V ňom použijeme príkazy, ktoré už poznáme:

jednotka MoveInCargo vozidlo

jednotka MoveInCommander vozidlo

jednotka MoveInGunner vozidlo

jednotka MoveInDriver vozidlo

Uvedieme si príklad. Hráč začne misiu na mieste šoféra T80. Otvoríme si okno editácie jednotky aP a do políčka INICIALIZACE napíšeme:

this MoveInDriver Tank

Štart a pristávanie lietadiel
Lietadlá v OFP ovládané AI môžu štartovať a pristávať iba na letiskách.

Lietadlo umiestnené na letisko automaticky vyhľadá rolovaciu (taxi) dráhu a keď sa dostane na runway, tak odštartuje. Na pristávanie sa používa príkaz land :

jednotka land "land"

Tento príkaz som zatiaľ nikde nevidel podrobne rozpísaný, takže neviem ako pristávanie lietadiel funguje. Hneď ako sa mi to podarí zistiť, tak to na tomto mieste doplním. Ak máte niekto s týmto skúsenosti, prosím ozvite sa na email.

Tak, pozemné dopravné prostriedky a lietadlá sme si prebrali a teraz sa vrhneme na vrtuľníky, s ktorými sú spojené najväčšie bolesti hlavy niektorých hráčov snažiacich sa vytvoriť si troška zložitejšiu misiu.

Práca s vrtuľníkmi
V tejto časti si ukážeme rieśenie niektorých najčastejšich problémov a situácií pri používaní vrtuľníkov. Ďaľšie budú postupne doplňené ak to bude potrebné.

Nastúpenie teamu do vtruľníku a jeho následný štart:

Vytvoríme si zase našich troch vojakov z úvodu tohoto tutoriálu. V ich blízkosti si vytvoríme vrtuľník:

STRANA [SIDE]: VÝCHOD [EAST]
TRIDA [CLASS]: AIR
HODNOST [RANK]: SVOBODNÍK [CORPORAL]
JEDNOTKA [UNIT]: Mi17
NAZEV [NAME]: HELI
SCHOPNOST [SKILL]: 50%

A PALIVO [FUEL] nastavíme na 0

Ak sa pričlení k nášmu teamu (bledo modrá čiara), tak ho pomocou F2 vyčleníme z formácie.

Vrtuľníku vytvoríme waypoint tesne pred ním:

TYP: NALOŽ [LOAD]

A ďalší niekoľko sto metrov ďalej:

TYP: PRESUN [MOVE]

Veliteľovi teamu EAST1 vytvoríme waypoint:

TYP: NASTUP [GET IN]
CHOVÁNÍ [BEHAVIOUR]: OPATRNÉ [AWARE]

Do políčka PŘI AKTIVACI waypointu NASTUP zadáme:

HELI SetFuel 1

Waypointy NALOŽ a NASTUP zosynchronizujeme cez F5.

Týmto sme si vytvorili následovnú situáciu:
Vrtuľník stojí na zemi. Po tom ako náš team nastúpi, vrtuľník nahodí motory a vydá sa na ďalší waypoint.

Vytvorenie vrtuľníku vo vzduchu:

Teraz si vytvoríme vrtuľník priamo vo vzduchu a potom pridáme náš team na jeho palubu.

Najskôr vymažeme všetky waypointy vrtuľníku aj teamu tak, aby nám zostali iba jednotky aP, EAST1, EAST2 a HELI. Teraz si otvoríme okno editácie jednotky vrtuľníku HELI a nastavíme následujúce položky:

ZVLÁŠTNÍ: VE VZDUCHU [FLYING]
PALIVO [FUEL] nastavíme na plno

Takto si vytvoríme vrtuľník vznášajúci sa vo vzduchu. Teraz každému vojakovi nášho teamu v políčku INICIALIZACE napíšeme:

this MoveInCargo HELI

Po spustení misie sa objaví náš team vo vznášajúcom sa vrtuľníku.

Pristávanie vrtuľníkov:

Častým problémom spojeným s vrtuľníkmi je pristávanie. Keď chcete aby vrtuľník napríklad pristál a naložil nejakú jednotku, tak sa stáva, že pristane niekoľko sto metrov od pozície, ktorú ste mu určili. To je spôsobené tým, že si vrtuľník hľadá "bezpečné miesto" na pristátie. Keď však chceme "donútiť" vrtuľník pristáť na určenom mieste, použijeme pristávaciu polochu, takzvané H . Na pristávanie mimo základne použijeme H (invisible). Vtedy sa pristávacia plocha nezobrazí a vrtuľník nám pristane na tomto mieste. Oba tieto objekty nájdeme medzi prázdnymi objektami . Tieto objekty využijeme aj ak na pristátie vrtuľníku použijeme príkaz land.
Aj tak by sme však mali na bezpečné pristátie vyhľadávať plochy, kde sa v tesnej blízkosti nenachádzajú objekty a terén je ako-tak rovný. Ak však potrebujeme naložiť alebo vyložiť jednotku na nerovnom teréne, tak potom môžeme použiť príkaz FlyInHeight na to, aby sa vrtuľník vznášal tesne nad zemou a my môžeme nastúpiť alebo vystúpiť.

Do políčka PŘI AKTIVACI waypointu vrtuľníku zadáme:

HELI FlyInHeight 1

Vyskočenie na padáku:

Vrátime sa k nášmu vrtuľníku vznášajúcemu sa pekne vo vzduchu a pridáme mu jeden waypoint:

TYP: PRESUN [MOVE]

A druhý pár sto metrov ďalej:

TYP: PRESUN [MOVE]

Do políčka PŘI AKTIVACI druhého waypointu zadáme:

HELI FlyInHeight 200; EAST1 action ["EJECT",HELI]; EAST2 action ["EJECT",HELI]; aP action ["EJECT",HELI]; UnassignVehicle EAST1; UnassignVehicle EAST2; UnassignVehicle aP

Jednotlivé príkazy si rozpíšeme:

Týmto príkazom nastavíme v akej výške (v metroch) sa má HELI pohybovať na waypointe:

jednotka FlyInHeight číslo

Ďaľším príkazom spustíme akciu-vyskočenie z objektu HELI:

jednotka action ["EJECT",objekt]

Tento príkaz už poznáme. Slúži na opustenie jednotky HELI:

UnassignVehicle jednotka

Toto je jednoduchý spôsob ako vytvoriť výsadok na padáku. Podstatne lepšie je použiť script, ale to sa naučíme v inom tutoriále.

Toto boli riešenia najbežnejších problémov spojených s používaním vrtuľníkov. Tieto postupy môžete použiť aj pri iných podobných problémoch, ktoré vás postihnú pri vytváraní vlastných misií.


Tutorial #7
Autor : Leon

Jak přidávat hudbu, zvuky a rádiové hlášky
Pokud se zabýváte tvorbou přídavných misí do Flashpointu, možná vás už napadlo, že byste si mohli přidat nějaký hudební doprovod, vlastní zvuky nebo vytvořit nahraný rádiový vzkaz. Dost možná jste ale také narazili na problém, jak to udělat. A o tom je právě tento tutoriál.

Je až s podivem, že jen málokterá mise některé z těchto vylepšení obsahuje. Přitom je to věc velice atraktivní a zcela určitě přidá na celkovém dojmu. Nebojte se proto v tomto směru experimentovat, výsledek určitě bude stát za to. Jak to udělat vám hned vysvětlím, pouze berte na vědomí, že velikost souboru s misí se tímto může zvětšit z několika kB až do řádů MB.

V první řadě musíte mít vlastní hudební nahrávku. Může to být třeba písnička z CD (kterou nagrabujete), ale i vaše vlastní nahrávka přes mikrofon. V jakém vstupním formátu je také celkem jedno, ale ideální je asi univerzální wav. Co je však důležité - Flashpoint pracuje pouze se zvukem ve formátu .ogg. Tento formát zatím není příliš rozšířený, ale je hodně srovnatelný s mp3. K přeměně vaší nahrávky potřebujete speciální kodek Ogg Vorbis (http://www.vorbis.com) nebo nějaký speciální program. Vhodný je třeba dBPowerAMP Music Converter (http://www.dbpoweramp.com/). Poslední užitečnou věcí je pak ogg plugin pro oblíbený přehrávač Winamp, který umožní přehrávat právě soubory typu ogg. Všechny tyto programy najdete na http://games.worldonline.cz/flashpoint/download.asp .

My si bohatě vystačíme s utilitkou OggDrop přímo od Vorbis. Po spuštění se vám otevře jen takové nenápadné okénko s rybou. Stiskem pravého tlačítka si můžete nastavit kvalitu konverze. Mohu vás ujistit, že i ta nejhorší kvalita (64 kbit) je pro hru dostačující až až, navíc ušetříte na velikosti souboru. Pak již jen stačí na toto okno přetáhnout soubor s vaší nahrávkou a konverze do formátu ogg začne. Po skončení si ji můžete přehrát ve Winampu, abyste si byli jisti, co pak uslyšíte ve hře. Tím máte připravenu zvukovou nahrávku pro hru, teď již jen stačí hře vysvětlit, kdy a co má přehrávat.

K tomu je určen soubor description.ext, případně stringtable.csv. Tyto soubory být u mise vůbec nemusí, ale u těch složitějších misí se bez nich lze jen těžko obejít. Description.ext je jakýsi popis a výčet věcí, které budou ve hře potřeba. V souboru stringtable.csv je zase uložen text, který bude v misi potřeba. Na přesnější popis tu teď není čas (možná by to také chtělo tutoriál), ale pokud si prostudujete pár zdrojáku, brzy pochopíte jejich smysl. Nás teď budou zajímat jen položky CfgMusic, CfgSounds a CfgRadio v description.ext. Všechny tři položky jsou velice podobné, ale liší se v několika maličkostech. O tom si teď povíme.

Hudba
Ukážu to na příkladu - chceme přidat do hry dvě hudební nahrávky, které jsme nazvali hudba1 a hudba2. Máme již připravené soubory ve formátu ogg, které umístíme (je to vyloženě nutné!) do adresáře /music v adresáři s uživatelskou misí. Položka CfgMusic by pak měla vypadat nějak takto.

class CfgMusic
{

tracks[]=
{
hudba1, hudba2
};

class hudba1
{
name="Hudba 1";
sound[]={\music\hudba1.ogg, db+40, 1.0};
};

class hudba2
{
name="Hudba 2";
sound[]={\music\hudba2.ogg, db+40, 1.0};
};

};

Ve výčtu tracks [] jsou určeny jednotlivé třídy, které jsou pak dále podrobně určeny. Dávejte si pozor na to, že cesta k souboru (např. \music\hudba1.ogg) není v uvozovkách na rozdíl od zvuků a rádia. Další položka určuje hlasitost přehrávání, se kterou si můžete vyhrát do aleluja, poslední položka je pro mě neznámá, všude jsem viděl jen číslo 1, ale tipnul bych to na relativní rychlost přehrávání. Tímto jste připravili podmínky pro přehrávání hudby v misi, stačí ji již jen v některém okamžiku spustit. Na to slouží příkaz PlayMusic, v našem případě tedy

PlayMusic "hudba1"

který můžete aktivovat na nějaký waypoint, trigger apod.

Zvuky
Tentokrát chceme přidat zvuky. Postup je stejný jako u hudby (pouze adresář se soubory je /Sound), položka CfgSounds pak bude vypadat třeba takto.

class CfgSounds
{

sounds[]=
{
zvuk1, zvuk2
};

class zvuk1
{
name="zvuk 1";
sound[]={"zvuk1.ogg", db+10, 1.0};
titles[]=
{
0, $STR_zvuk1
};
};

class zvuk2
{
name="";
sound[]={"zvuk2.ogg", db+10, 1.0};
titles[]={};
};

};

Všimněte si, že je nutné dát odkaz na soubor do uvozovek. Úmyslně jsem také obě class naeditoval trochu jinak. Jednak pro ukázku, že položka name není nezbytná, ale především jsme chtěl upozornit na položku titles. V jednom případě jsem tam zavedl odkaz na $STR_zvuk1, což je odkaz na text ze souboru stringtable.csv, který se objeví při přehrání tohoto zvuku. V tomto souboru je pak nutné napsat asi toto:

STR_zvuk1, Ted se zrovna prehral jeden zvuk, tys to neslysel?

Text za čárkou je samozřejmě libovolný. Ve hře se pak zvuk přehraje pomocí příkazu PlaySound, v našem případě tedy třeba

PlaySound "zvuk1"

Rádiové hlášky
Na úplný konec jsem si ještě nechal hlášky z rádia. Formát je téměř totožný se zvuky a vypadá asi takto.

class CfgRadio
{

sounds[]=
{
hlaska1, hlaska2
};

class hlaska1
{
name = "";
sound[]={"hlaska1.ogg", db-20, 1.0};
title=$STR_hlaska1;
};

class hlaska2
{
name="";
sound[]={"hlaska2.ogg", db-20, 1.0};
title=$STR_hlaska2;
};

};

Rozdíl je v názvu položky title (oproti titles u zvuků). Opět se ale odkazuje na soubor stringtable.csv, kde by mělo být asi toto:

STR_hlaska1, Ted te zrovna neco rikam do radia, MujHrac

Všimněte si závěrečné položky v řádku, která určuje hráče říkající tuto hlášku. V editoru pak hlášku spustíte příkazem GlobalRadio, konkrétně pak

MujHrac GlobalRadio "hlaska1"

eventuálně SideRadio.

Pokud se chcete pustit více do hloubky rádiových hlášek, může vám pomoci, že hra zná 4 speciální identity:

Base
HQ
PAPA_BEAR
AirBase

To je však asi na speciální tutoriál, navíc o tom zatím moc nevím :)

Doufám, že jsem vám aspoň trochu objasnil, jak si můžete do mise přidat vlastní hudební nahrávku. Pokud máte nějaký dotaz, ptejte se v našem fóru nebo nám pište mailem. Stejně tak ale uvítám eventuální připomínky k tutoriálu, jakož i podnětné informace. Nikdo nejsme neomylný, tím spíše, že oficiálních materiálů je k dispozici málo. U dalších tutoriálů na viděnou.


Tutorial #9
Autor : MAA

Základy tvoření scriptů
Pre tých, čo nečítali môj tutoriál o kamerách, zopakujem na úvod, čo je to vlastne script. Script je externý súbor (vytvorený mimo prostredia editoru OFP), ktorý je napísaný v programovacom jazyku, ktorému engine hry rozumie. V OFP sa na jeho programovanie používajú špeciálne príkazy, ktorých význam a použitie nájdete na našej stránke v sekcii PRÍKAZY.

Tento tutorial bude rozdelený na niekoľko častí, kde si budeme postupne vytvárať scripty od tých najjednoduchších až po tie zložité. Budem používať aj niektoré príklady od iných autorov, takže sa niektorým z vás môžu zdať povedomé.

Vytvoríme si jednoduchú misiu, v ktorej budeme postupne scripty skúšať. Na ostrove EVERON si niekde vytvoríme vojaka:

STRANA [SIDE]: VÝCHOD [EAST]
TRIDA [CLASS]: MEN
OVLADANI [CONTROL]: HRÁČ [PLAYER]
HODNOST [RANK]: VOJÍN [PRIVATE]
JEDNOTKA [UNIT]: VOJÁK [SOLDIER]
NAZEV [NAME]: Hrac

Misiu si uložíme pod názov test4. Pomocou windowsáckej kombinácie ALT+TAB sa prepneme z OFP do Windowsu a spustíme si program NOTEPAD, WRITE alebo podobný software na editáciu textových súborov (POZOR! nedoporučujem WORD, ADOBE ACROBAT a podobné programy; pozn. by Leon - ideální je třeba UltraEdit). Po skončení editácie si súbor uložíme s názvom, ktorý si potom určíme s príponou *.sqs. Budeme si ich ukladať do adresára, kde máme uloženú misiu: OPERATIONFLASHPOINT\USERS\vaše meno\MISSIONS\TEST4.EDEN

Znova upozorňujem programátorsky zdatných jedincov, že som pre čo najjednoduchšie vysvetlenie pre menej zdatných jedincov použil nie presné výrazy na pomenovanie niektorych akcií. Preto ma prosím za to nekameňujte.

Tak, zopakovali sme si ešte pár podstatných vecí z minulého tutoriálu.
Pri písaní scriptu vám doporučujem používať kôli prehľadnosti pár pravidiel:

  • Príkazy píšte s veľkými prvými písmenami
  • Píšte si v scripte dôleźité poznámky (na začiatku riadku použite ";"[česky-středník] )
  • Lokálne premenné začínajte podtrhovníkom "_"
  • Parametre píšte veľkými písmenami
  • Jednotlivé príkazy nájdete rozpísané na našej stránke v sekcii PRIKAZY

Výpis textu na obrazovku
Teraz už môžeme začať s písaním scriptu. Začneme teda s tým najjednoduším, a to je výpis textu na obrazovke. Predpokladám, že už ste si otvorili textový editor, takže začneme:

; Toto je moj prvy script na vypis textu na obrazovke
TitleText ["Toto je moj prvy script", "PLAIN DOWN"]
Exit

Všimnite si prvý riadok. Takýmto spôsobom sa robia v scripte poznámky. Pri zložitejších scriptoch je doslova nutnosť robiť si poznámky kôli prehľadnosti.
Ďalej sme použili príkaz TitleText, ktorý slúži na vypísanie textu na obrazovku. Hranaté zátvorky [] nám určujú pole, do ktorého píšeme parametre pre príkaz TitleText. Parametre napíšeme do úvodzoviek. Prvý parameter je text, ktorý chceme vypísať. Druhý parameter je miesto (pozícia) na obrazovke, kde chceme text vypísať. V našom prípade je to spodná časť obrazovky. Ostatné možné pozície si rozoberať nebudeme, nájdete ich v sekcii PRIKAZY.
Na ukončenie scriptu použijeme príkaz Exit.

Script si uložte pod názov vypis.sqs a nakopírujte do adresára misie, ak ho tam nemáte.
Prepnite sa do OFP a do políčka PŘI AKTIVACI vojaka zadáme:

[] exec "vypis.sqs"

Príkazom exec spúštame script, ktorého názov umiestnime do úvodzoviek a parametre pre jeho spustenie píšeme do zátvoriek []. V našom prípade nepoužijeme žiadne parametre.

Misiu si vyskúšajte. Po spustení by sa vám mal na obrazovke objaviť zadaný text. Keď sa tak nestalo, tak máte niekde chybu. Väčšinou to bývajú zle napísané úvodzovky.

Teraz si vytvoríme nový, podobný script na výpis textu na obrazovku.

;Script na vypis textu s pouzitim premennej
_sprava = _this select 0
TitleText [_sprava, "PLAIN DOWN"]
Exit

Rozdiel oproti prvému scriptu je v použití lokálnej premennej. Nazvali sme ju _sprava. Premenná je laicky povedané niečo ako schránka s názvom, kam si ukladáme konkrétne údaje. Napríklad namiesto celej vety potom použijeme premennú (čo je iba jedno slovo), v ktorej sa táto veta skrýva. Textové údaje (príkaz TitleText vie pracovať iba s textom), ktoré tam umiestnime sa nazývajú string.
Teraz si ešte trocha rozoberieme premenné. Lokálna premenná je premenná, ktorá je použiteľna iba počas chodu scriptu. Ak by sme nepoužili podtrhovník "_", tak by bola táto premenná chápaná ako globálna a bola by platná počas celej misie. Keby sme ju už nikde nepoužili, tak by nám zbytoćne zaťažovala celý systém.
Dúfam, že ste toto moje vysvetlenie premenných pochopili. Lebo ich používanie je pri scriptovaní veľmi dôležité.

Script si uložíme s názvom vypis2.sqs a do políčka PŘI AKTIVACI vojaka zadáme:

["Toto je vypis s pouzitim premennej"] exec "vypis2.sqs"

Select slúži na výber údajov z poľa. V našom prípade si vyberáme prvý údaj (prvý údaj je 0, druhý je 1, ...) z aktuálneho poľa, použitého pri spúštaní scriptu. _this je špeciálna premenná, ktorá odkazuje na aktuálny objekt, z ktorého sme spúštali script.

A teraz vidíme výhodu použitia našej premennej. Keby sme chceli zmeniť text výpisu na obrazovku, nemusíme prepisovať script, ale iba zmeníme údaj (parameter) v poli. Napríklad:

["Toto je zmeneny vypis"] exec "vypis2.sqs"

Tymito jednoduchými scriptami sme sa ako-tak uviedli do práce s nimi. V ďalších častiach sa budeme snažiť si scriptovanie priblížiť na troška zložitejších príkladoch.


Tutorial #9

Tutorial 8
Autor : Leon

Tvorba briefingu a overview
V tomto tutoriálu si něco povíme o tvorbě a struktuře souborů briefing.html a overview.html, které slouží k popisu mise a zadávání úkolů před startem.
Tyto soubory by rozhodně neměly chybět u žádné mise, protože bez nich to působí vyloženě amatérsky a většina hráčů mise bez těchto informacích ani nehraje.

Já se vám pokusím nastínit na praktických ukázkách, jak vypadá struktura těchto souborů a co je v nich třeba editovat. Pro ty, co nerozumí jazyku HTML, pak na závěr ještě vysvětlím, jak tyto soubory vytvořit pomocí generátorů.

Oba soubory je nutné mít v adresáři s uživatelskou misí, protože pouze pak se vyexportují do mise. Při zkušebním přehrávání v editoru misí se ale nezobrazují.

Overview
Začnu u souboru overview.html, který zobrazuje informace o misi v menu (jednotlivé mise) hry. Když si tam nalistujete tu kterou misi, tak o ní vidíte informace právě ze souboru overview.html. Jde o HTML soubor (viz přípona), který má strukturu totožnou se soubory na internetu. Pokud ovládáte HTML alespoň na základní úrovni, nemělo by vám dělat problémy porozumět následujícímu zdrojáku overview.

<html>
<head>
<title>Overview</title>
</head>
<body>

<br>
<h2 align="center"><a name="Main">Útok na letiště</a></h2>

<p align="center"><img src="obrázek.jpg" width="128" height="64"></p>
<br>

<p>
Američané se vylodili na Everonu a ihned obsadili letiště, na které vzápětí přistála bitevní letadla A-10.
Ta jsou velkým nebezpečím pro všechny naše jednotky na ostrově. Pronikněte na letiště a zničte je za každou cenu.
<br><br>
Misi vytvořil Leon
<br><br>
flashpoint@cz.tiscali.com
<br>
http://games.worldonline.cz/flashpoint/
<br>
</p>

</body>
</html>

Za zmínku stojí jen několik věcí. Mezi tagy <a name="Main"> </a> je vložen název mise. Pod ním je vložen obrázek obrázek.jpg o daných rozměrech, který tam ale vůbec být nemusí. Pokud tam obrázek nechcete, stačí smazat celou řádku ve zdrojáku. Pod obrázkem je pak obvykle stručný popis mise, kde byste měli v několika málo větách misi popsat. V overview se nepouštějte do žádných slohových prací, od toho je eventuálně briefing. Na závěr by nemělo chybět jméno autora mise, případně odkaz na jeho stránku nebo mail.

Protože jde o HTML dokument, můžete se v editaci pořádně vyřádit. Na druhou stranu to příliš nepřehánějte, především s barvičkami. Nemá to sice vliv na funčknost, ale nepůsobí to příliš dobře. Začátečníkům bych ještě mohl vysvělit, co znamenají některé tagy ve zdrojáku.

Soubor HTML je uzavřen mezi tyto tagy, kterým soubor začíná a končí, takže ty berte jako fakt.

<html>
<head>
<title>Overview</title>
</head>
<body>

</body>
</html>

Dále najdete tagy <h2 align="center"></h2>. Je to párová značka, která uvozuje nadpisy (zjednodušeně řečeno). Align slouží pro určení pozice nadpisu ve vodorovném směru, v našem případě je tedy vycentrovaný (existují ještě left, right a justify).

<br> je naopak nepárová značka, pomocí které si vynutíte přechod na další řádku. První tato značka na konci textu způsobí přechod na další řádku, další značka pak odřádkování atd.

Tagy <p></p> uvozují blok textu, opět je možno použít align. Text je automaticky odřádkován.

<img src="obrázek.jpg" width="128" height="64"> slouží pro vkládání obrázků do dokumentu - img src="" zadává cestu ke zdrojovému obrázku, width="" pak jeho šířku v pixelech, height="" jeho rozměr na výšku. Obrázek je nutné mít také v adresáři s uživatelskou misí. Dříve se používalo pouze obrázků v dost nepraktickém formátu .paa, od verze 1.10 výš je možno vkládat i klasické obrázky .jpg, které ale nesmí být progresivní. Jejich rozměry byl měly být mocninou čísla 2 - 2,4,8,16,32,64,128,256 atd.

To je ve stručnosti popis významu jednotlivých tagů ve zdrojáku overview.html. Se znalostí těchto věcí byste si měli vcelku vystačit.

Briefing
V souboru briefing.html jsou pak uvedeny podrobné informace, které se vám zobrazí po nahrání mise (nebo až během mise). Jde také o HTML dokument, i když jeho struktura je složitější než u overview. Opět uvedu konkrétní příklad.

<html>
<head>
<title>Briefing</title>
</head>
<body>

<h2><a name="Main"></a></h2>
20. září 1985<br>
A už je to tady ... Američané se vylodili na Everonu. Čekali jsme to, ale přesto jsme tajně doufali, že se tak nestane. Nedá se nic dělat, musíme jít do boje. Tipnul bych si, že nás pošlou k útoku na letiště, jehož provoz představuje největší nebezpečí. Čeká nás tam peklo ...
<br>

<p><a name="Plan"></a>
<br>
Úkolem vašeho týmu je napadení nepřátelského <a href="marker:letiste">letiště</a> během nadcházející noci. Zaměřte se na zničení všech bitevních <a href="marker:a-10">A-10</a>, které představují největší nebezpečí pro naše tanky na ostrově. Náhradním cílem jsou pak vrtulníky Cobra stojící na <a href="marker:helipad">helipadu</a>. Váš tým bude vysazen vrtulníkem v prostoru západně od letiště (sektor <a href="marker:ei39">Ei39</a>) přesně o půlnoci. Od té chvíle je vše jen na vás. Letiště je silně střeženo, pokud možno se vyhněte oběma táborům na severní i jižní straně letiště. Do posledního okamžiku se snažte vyvarovat prozrazení. Dávejte pozor na hlídky, které se budou pohybovat okolo letiště. Po proniknutí k letadlům nastražte časované nálože (na 3 minuty) a stejnou cestou letiště opusťte. Až budete v bezpečné vzdálenosti od letiště, zavolejte rádiem o vrtulník, který vás pak naloží v sektoru <a href="marker:ej32">Ej32</a>. Pokud byste se nemohli dostat na toto místo, zavolejte si o člun, na který počkejte na pláži v sektoru <a href="marker:fg12">Fg12</a>. Nějaký dotaz? Ok, seřiďte si hodinky, je přesně 21 hodin 32 minut. Nástup k akci je ve 23.30, zatím se jděte připravit. Hodně štěstí.
</p>
<hr>

<p><a name="OBJ_0"></a>Pronikněte na letiště a zničte všechny <a href="marker:A-10">A-10</a>.
</p>

<p><a name="OBJ_1"></a>Sekundárním cílem je zničení vrtulníků Cobra na <a href="marker:helipad">helipadu</a>.
</p>

<p><a name="OBJ_2"></a>Probojujte se z letište, zavolejte rádiem o odvoz a přesuňte se do sektoru <a href="marker:ej32">Ej32</a> nebo <a href="marker:fg12">Fg12</a>.
</p>

<br>
<h2><p><a name="Debriefing:End1">Splnili jste úkol</a></p></h2>
<br>
<p>
Blahopřeji!
</p>
<br>

<br>
<h2><p><a name="Debriefing:End2">Mise byla neúspěšná</a></p></h2>
<br>
<p>
Bohužel, nesplnili jste úkol.
</p>
<br>

</body>
</html>

Zdroják jsem psal teď z hlavy, takže ani nevím, jestli uvedené sektory na Everonu vůbec existují, ale to je celkem fuk.

Důležité jsou jiné věci. Za <a name="Main"></a> by měl následovat text, který se pak objeví psaný kurzívou v položce notes (poznámky). Obecně je celkem jedno, co tam napíšete. Nepsaným pravidlem by ale mělo být, že tam je napsáno něco, co přesně neupřesňuje misi - současný stav ve válce, zápisky aktéra mise ve formě deníku apod. Prostě něco na odlehčení. Ostatně mnoho lidí tuhle sekci ani nečte, přesto by tam neměla chybět.

Po <a name="Plan"></a> je již text toho, co je samotné zadání mise. Opět je jedno, co tam napíšete, ale podle mého názoru by měl briefing vypadat nějak podobně, jako jsem ho popsal výše. Konkrétní zadání úkolu mise ve vojenském stylu, uvedení podstatných údajů, odkaz na polohu důležitých bodů. Působí to podstatně lépe, než když tam napíšete "Dojdi na letiště a znič letadla". Sami jste asi postřehli ten rozdíl. Možná byste nevěřili, jak jde kvalitním briefingem zvýšit celkový dojem z hraní mise. Proto si na textu dejte opravdu záležet.

Pak následuje sekce objectives (úkoly). Jednotlivé úkoly jsou zadávány za <a name="OBJ_0"></a>, přičemž další úkoly se odlišují jen číslem. První úkol by měl být označen 0, až pak 1 atd. V této sekci by měl následovat výčet toho, co je cílem mise a co se po skončení mise hodnotí. Důležité je propojit splnění úkolu se zadáním. To uděláte tak, že na nějaký spínač nebo waypoint ve hře dáte příkaz

"1" ObjStatus "DONE"

Číslo na začátku je číslo úkolu.Tím se úkol v zadání označí jako splněný. Další hodnoty jsou "FAILED", což je nesplnění úkolu, a pak "HIDDEN" a "ACTIVE". Ty jsou dobré k tomu, že ukryjí nebo odkryjí nějaký úkol během hry. Takový úkol je již předem zadán v briefing.html, ale dá se skrýt či odkrýt. Uvedu to na příkladu. Na začátku mise nechcete ukázat některé úkoly. V tom případě je ihned na začátku mise musíte inicializovat jako "HIDDEN". Jde to například napsat do inicializačního okna hráče. Poté, co se něco stane, je chcete zviditelnit. Stačí tedy na waypoint nebo trigger přidat například

"2" ObjStatus "ACTIVE"

čímž se úkol v briefingu objeví, navíc přímo na obrazovce se objeví hláška něco jako Plán mise byl aktualizán (Mission plan updated). Doufám, že jste to pochopili :) Nejvíce pochopíte tím, že si to přímo zkusíte.

Poslední sekce je pak Debriefing. Tato sekce End1 až End6 je spojena se stejně pojmenovanými spínači (triggers), které nějakým způsobem ukončují misi (ať už úspěšně nebo neúspěšně). Text tu stačí jen krátký, ale o to výstižnější.

Velmi důležité jsou tagy marker, například <a href="marker:A-10">A-10</a>. Tí, se odkazujete na nějaké místo na mapě. K tomu, abyste se na něho mohli odkázat, je nejprve třeba na v editoru misí vytvořit patřičný marker (značku) s názvem, který se pak objeví za dvojtečkou <a href="marker:název_markeru">. Nic na tom není, proto odkazy na markery v briefingu používejte dost často.

Na závěr popisu briefingu ještě objasním tag <hr>, který jsem tam koukám také použil. Slouží k vytvoření vodorovné čáry, pokud ho zadáte jen takhle, pak je čára přes celou šíři dokumentu.

Samozřejmě i do briefingu můžete vložit obrázek (stejným způsobem jako u overview), podle mého názoru by měl být ale pouze v overview.

Tvorba briefingu pomocí generátorů
Pokud se vám nechce editovat přímo HTML zdrojáky nebo je to pro vás prostě složité, existují i speciální programy na tvorbu těchto souborů. Jedním z nich je Briefing & Overview Generator ve verzi 1.5.0, který si můžete stáhnout na http://games.worldonline.cz/flashpoint/download.asp a který vám teď trochu představím.

Jde o jednoduchý prográmek, do kterého vpisujete pouze text a on vám pak oba HTML soubory vygeneruje.

V položce Overview se vyplní jen jméno mise a text, dole se pak nastaví cesta, kam chcete soubory uložit.

V druhé položce Briefing vyplníte první pole poznámkami a druhé zadáním mise. Do textu briefingu můžete vkládat Linebreak (ve zdrojáku <br>), který způsobí zalomení řádky. Přidávat také můžete odkazy na markery, přičemž do prvního otevřeného okna se zadává název markeru, do druhého pak slovo, které na něj odkazuje. Pod tím je okno s Objectives s úkoly, kam vždy jen napíšete úkol, dáte Add Objective (přidat úkol), napíšete další úkol atd. Úplně dole je pak 6 políček pro Debriefing, o kterém jsem již psal výše. Na závěr stačí kliknout na políčko Create Files (vytvoř soubory) a program vám soubory vygeneruje.

Jde o velmi jednoduchý, ale praktický prográmek, s jehož pomocí by měl vytvořit briefing každý. Má pouze několik malých nedostatků - nejde uložit soubory jinam než na C:, nejde vložit obrázek (pokud nepíšete přímo do zdrojáku), nejde vložit marker přímo do Objectives, překlep je v nadpisu (Breifing místo Briefing) a drobná chyba je i v číslování Objectives, které začíná od 1, i když by mělo začínat od 0. Na funkci to ale nemá žádný vliv, pouze si na to dejte pozor při spojování s ObjStatus. V dalších verzích to může být opraveno a mohou i přibýt další funkce.

Dalším zajímavým prográmkem, kterým lze briefing a overview vytvořit, je OFP Script Editor v nejnovější verzi 1.1 (je také ke stažení na stránce http://games.worldonline.cz/flashpoint/download.asp ).

Ten má oproti předchozímu programu několik výhod, ale princip je skoro stejný. Umožňuje navíc zadávat jméno obrázku pro overview, soubory lze uložit kamkoliv, markery lze vkládat i do objectives a po vytvoření souborů se mohou otevřít přímo v programu pro editaci, což je asi největší výhoda. Nedotažené je tvoření objectives, jejichž pořadí přeskakuje jak chce a stejně jako první program čísluje objectives od 1 (opět to není chyba zásadní). Tento program je asi na generování lepší, navíc umožňuje tvorbu dalších věcí pro hru.

Doufám, že jsem vám v celém článku dostatečně objasnil tvorbu briefingu a overview. Případné dotazy, dodatky či komentáře směřujte jako vždy do diskuse nebo do mailu.


Tutorial #10
Autor : MAA

Popis souboru "description.ext"
V tomto tutoriali si podrobne rozoberieme súbor description.ext. Tento súbor si vytvárame v adresári uživateľskej misie a nastavujeme si v ňom množstvo parametrov misie (napr. respawn, výber zbraní v briefingu, nastavenie zvukov, rádia a hudby, ...). Pre lepśie pochopenie, pridám aj zopár príkladov.

POZOR: Tento tutoriál je o súbore description.ext určeného pre jednotlivú misiu. Pre nastavenie parametrov campane sa pouźíva súbor s rovnakým názvom ale s odlišnými možnosťami. Ak bude záujem, tak si popíšeme aj tento súbor.

Teraz si ukážeme možnosti nastavovania jednotlivých parametrov a tried.

Nastavení respawn
Pri MultiPlayer misiách si môžeme nastaviť "oživenie" hráča (respawn). Môžeme na to použiť dva spôsoby:

Príklad:

respawn="INSTANT"
respawndelay=5

alebo:

respawn=2
respawndelay=5

Legenda:
respawndelay je čas v sekundách
respawn je typ respawnu a môže mať hodnoru buď číselnú alebo string:

0 = [NONE] bez respawnu
1 = [BIRD] do čajky (racka) = je to defaultné nastavenie
2 = [INSTANT] na mieste posledného úmrtia
3 = [BASE] na značkách (markers) RESPAWN_WEST, RESPAWN_EAST
4 = [GROUP] do zostávajúceho vojaka v skupine (zatiaľ iba pre veliteľa,
        bude to fixnuté)
5 = [SIDE] do zostávajúceho vojaka na strane (zatiaľ nefunguje)

Respawn je použiteľný iba pre hrateľné [playable] jednotky: TRIDA [CLASS]: MEN

Nastavení hodnocení
Na ohodnotenie výsledku misie použijeme:

MinScore = body
AvgScore = body
MaxScore = body

Legenda:
body je počet bodov.

Napríklad:

MinScore = 200
AvgScore = 2500
MaxScore = 6000

Nastavení textů při nahrávání
Ďalej si môžeme zadať texty, ktoré sa zobrazia počas načítavania intra alebo misie.

OnLoadIntro ="text"
OnLoadMission ="text"

Legenda:
text musí byť v úvodzovkách!
Môžeme použiť aj odkaz na string v stringtable.csv. Napríklad:

onLoadMission=$STRM_nazov1

Nastavení zobrazení prvků
Na zobrazenie/nezobrazenie niektorých prvkov počas briefingu použijeme príkazy:

Na zobrazenie debriefingu po ukončení misie:

Debriefing = X

Na zobrazenie hodín:

ShowWatch = X

Na zobrazenie kompasu:

ShowCompass = X

Na zobrazenie zápisníka:

ShowNotepad = X

Na zobrazenie polohovacieho systému:

ShowGPS = X

Na zobrazenie mapy:

ShowMap = X

Legenda:
X môže mať hodnotu 0 (pre nezobrazenie) a 1 (pre zobrazenie).

Definovanie tried:

Třída CfgIdentities
Túto triedu použijeme, ak chceme dať niektorej jednotke konkrétnu identitu (meno, tvár, hlas,…). Toto oceníme najmä pri cutscénach (kde má jednotka konkrétnu, nami vytvorenú podobu).

class CfgIdentities
{
class rank_name
{
name = "meno";
face = "tvar";
glasses = "okuliare";
speaker = "hlas";
pitch = vyska_hlasu;
};
};

Legenda:
rank_name = je meno vojaka (môže byť nastavené pomocou príkazu SetIdentity)
tvar = nastavenie textury pre tvár
okuliare = typ okuliarov. Možne hodnoty sú: none (žiadne), spectacles
        (priehľadné), sunglasses (slnečné)
hlas = výber prevoleného hlasu pre postavu
vyska_hlasu = číselné nastavenie výšky hlasu

Napríklad:

class CfgIdentities
{
class Blackie
{
name = "Blackie Lawless";
face = "Face3";
glasses = "SUNGLASSES";
speaker = "Adam";
pitch = 1.00;
};
};

Hra pozná takzvané špeciálne preddefinované identity, pre ktoré nemusia existovať fyzické jednotky:

Base
HQ
PAPA_BEAR
AirBase

Pri nich stačí napísať do init.sqs alebo do aktivačného políčka triggeru napríklad toto:

whq = [West, "HQ"]

A potom už iba použiť s príkazmi na používanie rádia, napríklad:

whq SideRadio "hlaska"

Legenda:
hlaska = je odkaz na hlašku (správu) definovanú v description.ext v triede CfgRadio

Napríklad:

whq = [West, "HQ"]; whq SideRadio "RADIO_defend"

Ak chcete použiť iba text bez zvukovej stopy, môžete použiť v hre aj príkazy na chat. (Vizerá to ako cez rádio, iba je to bez zvuku)

whq SideChat "text_hlasky"

Legenda:
text_hlasky = vami zadaný text pre správu

Napríklad:

whq = [West, "HQ"]; whq SideChat "Udržte pozíciu za každú cenu. Koniec"

Na konci tohoto tutoriálu nájdete odkaz na jednoduchý príklad použitia identít a rádia v misii, aj s použítím scriptu "Mflare.sqs".

Třída CfgSounds
Ďalšou triedou, ktorú si môžeme zadefinovať, je trieda na nastavenie zvukov:

class CfgSounds
{
sounds[] ={zvuk1, zvuk2};
class zvuk1
{
name = "";
sound[] = {"nazov1.ogg", db, vyska_hlasu};
titles[] = "text1";
};
class zvuk2
{
name = "";
sound[] = {"nazov2.ogg", db, vyska_hlasu};
titles[] =
{
0, string
};
};
};

Legenda:
zvuk1, zvuk2 = meno zvuku (bez prípony *.ogg)
nazov1 =názov zvuku
db = hlasitosť
vyska_hlasu = číselné nastavenie výšky hlasu
string = je odkaz na string zadefinovaný v stringtable.csv

Podrobnejšie informácie nájdete v tutoriali o pridávaní vlastných zvukov a hudby do misie.

Třída CfgSFX
Táto trieda sa definuje tak isto ako trieda CfgSounds. Slúži na pridanie vlastných zvukových efektov.

Třída CfgEnvSounds
Táto trieda sa definuje rovnako ako trieda CfgSounds. Slúži na pridanie vlastných zvukových efektov pozadia.

Třída CfgMusic
V tejto triede si nastavujeme hudobné tracky, ktoré chceme v misii použiť.

class CfgMusic
{
tracks[] ={hudba1, hudba2};
class hudba1
{
name = "";
sound[] = {"\music\nazov1.ogg", db,
          vyska_hlasu};
};
class hudba2
{
name = "";
sound[] = {"\music\nazov2.ogg", db,
          vyska_hlasu};
};
};

Legenda:
hudba1, hudba2 = meno zvuku (bez prípony *.ogg)
nazov1, nazov2 = názov hudobného tracku
db = hlasitosť
vyska_hlasu = číselné nastavenie výšky hlasu

Podrobnejšie informácie nájdete v tutoriali o pridávaní vlastných zvukov a hudby do misie.

Třída CfgRadio
V tejto triede si definujeme zvukové rádiové hlášky (správy), ktoré chceme počas hrania misie počuť cez rádio.

class CfgRadio
{
sounds[] ={zvuk1};
class zvuk1
{
name = "";
sound[] = {"nazov1.ogg", db, vyska_hlasu};
title = string;
};
};

Legenda:
zvuk1 = meno zvuku (bez prípony *.ogg)
nazov1 =názov zvuku
db = hlasitosť
vyska_hlasu = číselné nastavenie výšky hlasu
string = je odkaz na string zadefinovaný v stringtable.csv

Podrobnejšie informácie nájdete v tutoriali o pridávaní vlastných zvukov a hudby do misie.

Príklad na použitie rádia si môžete stiahnuť z linku na konci tohoto tutoriálu.

Třída CfgWeapons
Pre umožnenie výberu zbraní v briefingu musíme zadefinovať triedu CfgWeapons (zbrane):

class Weapons
{
class typ
{
count = X;
};
};

Legenda:
typ je typ zbrane (podľa prílohy zbraní v tutoriáli o pridávaní zbraní)
X je počet. Napríklad:

Príklad:

class Weapons
{
class SVDDragunov
{
count = 2;
};
class RPGLauncher
{
count = 1;
};
};

Třída CfgMagazines
So zbraňami si musíme zadefinovať aj triedu CfgMagazines (zásobníky):

class Magzines
{
class typ
{
count = X;
};
};

Legenda:
typ je typ zásobníka (podľa prílohy zbraní v tutoriáli o pridávaní zbraní)
X je počet.

Napríklad:

class Magazines
{
class SVDDragunov
{
count = 12;
};
class RPGLauncher
{
count = 3;
};
};

Tak, a sme na konci ďaľšieho tutoriálu. Dúfam, že vám tieto informácie pomôžu. V prípade nejakých nejasností, problémov alebo ak narazíte na nejakú chybu, informujte nás, prosím, mailom alebo v našej diskusii.

Na http://games.worldonline.cz/flashpoint/tutorials/ofptutorial10/MAA_Radio&Flare.Eden.rar si můžete stáhnout ukázkovou misi k tomuto tutoriálu.


Tutorial #11
Autor : MAA

Popis souborů "*.lip"
Jedným z nástrojov pri vytváraní pokročilejšich cutscén je súbor s príponou lip. Slúži na synchronizáciu pohybu úst a zvuku.

Pre jeho použitie si najskôr treba zadefinovať zvuk v súbore description.ext v triede CfgSounds a text v stringtable.csv. (Postup na definovanie zvuku nájdete v tutoriáli o pridávaní zvukov do misie a v popise súboru description.ext).
Lip súbor musí mať rovnaký názov ako príslušný zvukovú súbor a mať príponu *.lip. Môže sa použiť spoločne s príkazom na nastavenie mimiky tváre SetMimic (SAD, HAPPY, LEFT FROWN, RIGHT FROWN, ANGRY,...) a spúšta sa pomocou príkazu Say.

Formát súboru je:

frame = cislo
cas, pozicia_ust

Legenda:
cislo = je snímková frekvencia animácie pohybu úst
cas = čas od začiatku zvukového súboru, kedy sa má spustiť animácia pozicia_ust
pozicia_ust = animácia úst. Môže mať hodnotu od 0-7 (0-zatvorené ústa, 7-široko otvorené ústa). Na ukončenie synchronizácie použijeme hodnotu -1

Tu je grafické zobrazenie pozicie_ust:

Napríklad:

frame = 0.040
0.000, 1
0.040, 4
0.080, 1
0.120, 0
0.160, -1

Pak je již jen otázkou času a práce pohrát si se synchronizací zvuku a pohybu metodou pokus-omyl.

Použitie lip súboru nájdete v jednoduchej prilozenej misii.

Otázky a pripomienky smerujte, prosím, do našej diskusie.

Na http://games.worldonline.cz/flashpoint/tutorials/ofptutorial11/MAA_Lip_Test.Cain.rar si můžete stáhnout ukázkovou misi k tomuto tutoriálu.

Pozn. Ruprt

Tento postup se již nepoužívá neboť je snazší použít program WAV2LIP.EXE (stáhnout se dá na http://games.tiscali.cz/flashpoint/download.asp ), který výše popsanou práci udělá ve zlomku sekundy za Vás. Nicméně jsem tento tutoriál do této nápovědy zařadil z důvodu, aby si každý mohl udělat obrázek jak se to vlastně dělá a jak to funguje.


Tutorial #12
Autor : MAA

Vytvoření Intra a Outra pomocí scriptů
Na vytvorenie intra a outra misie existujú dva základné spôsoby. Jeden je použitím editoru a druhý spôsob je pomocou scriptu. Ak intro, ktoré chceme vytvoriť, nemá s našou misiou veľa spoločné (budeme v ňom používať jednotky, ktoré v misii už nepoužijeme alebo sa odohráva na inom mieste), je lepšie ho vytvoriť v editore. V tomto tutoriali si predvedieme druhý spôsob. Vytvorenie intra a outra použitím scriptov. Ja ho používam, keď intro plynule prechádza do misie a hráč sa zapája do rozbehnutého deja.

Vytvoríme si jednoduchú misiu, na ktorej si to ukážeme. Hráč v úlohe odstreľovača má za úlohu zlikvidovať nepriateľského agenta, ktorý príde jeepom na stretnutie s vodcom povstalcov. Vytvoríme si intro, v ktorom bude kamera sledovať agenta až k miestu stretnutia. Potom si vytvoríme jedno outro pre splnenú a jedno pre nesplnenú misiu.

Vytvoření základu mise
Nastavíme si ostrov Everon. Západne od osady Regina si v skupinke stromov vytvoríme nášho hráča:

STRANA [SIDE]: VÝCHOD [EAST]
TRIDA [CLASS]: MEN
OVLADANI [CONTROL]: HRÁČ [PLAYER]
JEDNOTKA [CLASS]: SNIPER
NAZEV [NAME]: Hrac

Do jeho políčka INICIALIZACE si pridáme ďalekohľad:

this AddWeapon "BINOCULAR"

Potom si severne v sektore Ff75 vytvoríme jedného západného Black Op a na ceste jeden Jeep:

STRANA [SIDE]: ZÁPAD [WEST]
TRÍDA [CLASS]: CAR
HODNOST [RANK]: VOJÍN [PRIVATE]
JEDNOTKA [CLASS]: DŽÍP [JEEP]
NAZEV [NAME]: Jeep
AZIMUT 170

STRANA [SIDE]: ZÁPAD [WEST]
TRIDA [CLASS]: MEN
OVLADANI [CONTROL]: NEMUŽE HRÁT HRÁČ [NOT PLAYABLE]
JEDNOTKA [UNIT]: BLACK OP (DAY)
NAZEV [NAME]: Agent

Pridaním nasledujúcich príkazov v jeho políčku INICIALIZACE si ho posadíme do jeepu:

this MoveInDriver Jeep; This SetBehaviour "SAFE"

Smerom k osade Regina Agentovi vytvoríme waypointy MOVE.

Teraz si ešte na severnom okraji osady vytvoríme jedného partyzána:

STRANA [SIDE]: PARTYZÁN [RESISTANCE]
TRIDA [CLASS]: MEN
OVLADANI [CONTROL]: NEMUŽE HRÁT HRÁČ [NOT PLAYABLE]
JEDNOTKA [UNIT]: DUSTOJNÍK [OFFICER]
NAZEV [NAME]: Vodca

V políčku INICIALIZACE nastavíme:

This SetBehaviour "SAFE"

V misii si zadáme waypointy pre Agenta (nastúpenie/umiestnenie do jeepu, presun k osade, vystúpenie z jeepu a presun k povstalcovi). Ich parametre si zadajte podľa ukážkovej misie a nezabudnite aj na premenné, ktoré sa nachádzajú v ich podmienkach a aktivačných políčkach. Sú potrebné na správny chod misie.

Intro
Všetko máme pripravené, tak môžeme prejsť k vytvoreniu intra.
Najskôr si v editore označíme pomocou markerov (značiek) pozície kamier. Použitie markerov je jednoduchšie a prehľadnejšie ako pracné zisťovanie súradníc pre kamery. Má to ešte výhodu, že ak vám pozícia kamery nevyhovuje, stačí posunúť príslušný marker a máte zmenu pozície bez problémov a prehľadne vyriešenú.

Na označenie pozícií kamier pozdĺž cesty som použil 4 markery typu DOT [BOD] a dával som im nazvy pos1 až pos4. Pri mieste stretnutia agenta s povstalcom som si ešte urobil jeden marker s názvom stretnutie.

Vytvoríme si script s názvom Init.sqs. Týmto názvom (ten je veľmi podstatný) si zabezpečíme, že sa nám tento script (u nás cutscéna) spustí ihneď po načítaní misie. Editáciu celého súboru nebudem popisovať. Stačí ak si stiahnete hotovú misiu a pozriete si príslušný súbor. Ak ste čitali pozorne naše predchádzajúce tutoriály, tak by ste mali už väčšinu príkazov poznať. Podrobnejšie si použité príkazy môžete pozriet u nás v sekcii PRÍKAZY, alebo v tutoriáli o cutscénach a scriptoch.

V stručnosti si predstavíme aspoň nové príkazy:

Príkazom TitleCut s parametrom BLACK IN si vytvoríme nenásilný plynulý prechod z čiernej obrazovky do hry a s parametrom BLACK OUT zase naopak z hry do čiernej obrazovky pri ukončení misie v outre.
Cez GetMarkerPos si získame pozície markerov, ktoré sme použili na označenie pozícií kamier.
Pomocou PlayMove si spustíme animáciu, v ktorej postava hráča zaľahne a ďalekohľadom sleduje dianie na scéne.

Spustením misie si overíte, či intro funguje správne.

Zopakujem základné kroky pri vytváraní intra:

1. Vytvorte si základ misie ako sú statické objekty, nastavte počasie,..

2. Vytvorte si jednotky potrebné v intre a misii.

3. Zadefinujte waypointy, triggery a všetky veci, ktoré majú vplyv na chod intra

4. Spustením misie si vyskúšajte, či sa jednotky správajú ako ste zamýšlali.

5. Ak všetko funguje správne, stačí si vytvoriť klasickú cutscénu (napríklad podľa tutoriálu o vytváraní cutscén) a dať jej názov Init.sqs.

Outro
Ak chceme vytvoriť outro na jednoduchý koniec, stačí si vytvoriť dva triggere.
Prvý je trigger END1 s názvom Uplny_Koniec_Dobry. Pomocou príkazov a parametrov si vytvoríme podmienku, ktorá nám vedie k splneniu misie. U nás to bude likvidácia Agenta, takže zadáme:

Not Alive Agent

A do políčka Při Aktivaci [OnActivation] treba na spustenie outra zadať:

[] exec "OutroWin.sqs"

Potom si vytvoríme a editujeme súbor s týmto názvom (názov môže byť aj iný, ja som ho tak pomenoval kvôli prehľadnosti) a editujeme ho. Môžeme zase postupovať podľa tutoriálu o vytváraní cutscén.

Na spustenie outra pri našom zabití, stačí do políčka Při Aktivaci [OnActivation] triggeru LOOSE s názvom Uplny_Koniec_Zly zadať napríklad:

[] exec "OutroLoose.sqs"

Takýmto spôsobom si jednoducho vytvoríme koncové cutscény pre našu misiu. V našom prípade však ešte musíme ošetriť možnosť, keby nám náhodou cieľ unikol. Keby sme to neurobili, tak by sa nám misia neukončila, pretože by nebola splnená podmienka triggeru END1 ani triggeru LOOSE. Takže by sme museli cieľ nahánať po celej mape alebo sa ním nechať zastreliť :

Vyriešime to následovne. Vytvoríme si trigger SWITCH s názvom Agent_Uteka . Zgrupneme ho s Agentom, nastavíme parameter NOT PRESENT a do aktivačného políčka zadáme:

this && PrisielAgent && Alive Agent

PrisielAgent je premenná, ktorá nadobúda platnosť ak Agent príde na stretnutie (aktivuje waypoint pri Vodcovi) a tým sa nachádza v poli trigeeru. Aktiváciu tohoto waypointu si musíme kontrolovať preto, lebo inak by sa tento trigger aktivoval okamžite po spustení misie, pretože by boli splnené jeho dve ďalšie podmienky (Agent by sa nenachádzal v poli triggeru a bol by nažive).
Do aktivačného políčka (Při Aktivaci [OnActivation] ) tohoto triggeru uvedieme:

KoniecBad = TRUE

Túto premennú potom použijeme na spustenie triggeru LOOSE tak, že do podmienky [Condition] tohoto triggeru zadáme:

This Or KoniecBad

Keď bude hráč mŕtvy (This) alebo (Or) nadobudne platnosť podmienka triggeru Agent_Uteka (Agent opustí pole triggeru) a premenná (KoniecBad) tohoto triggeru tým pádom nadobudne hodnotu TRUE, spustí sa záverečné outro pri nesplnení misie.

Ukázali sme si jednoduché ukočenie misie s jedným outrom a môžeme prejsť k ukážke ukončenia misie s viacerými ukončeniami.

Větvený konec mise
Skúsime si vytvoriť koniec našej misie, kde budeme plniť až dve úlohy. Pri splnení každej úlohy (likvidácia Agenta a Vodcu) sa nám prehrá krátka cutscéna (OutroWin1 a OutroWin2) a po splnení oboch sa prehrá koncové OutroWin. Ak misiu nesplníme spustí sa OutroLoose. V našom prípade sa za nesplnenie považuje aj ak zkilvidujeme iba jeden cieľ a druhý utečie.

Doporučujem vám stiahnuť si ďalšiu ukážkovú misiu (s vetveným ukončením), v ktorej je už všetko upravené. Ak to však budete testovať na predchádzajúcej misii, tak si zmažte ukončovacie triggere a pridajte Agentovi waypointy na útek.

Pripravíme si finálne ukončenie misie pomocou triggeru (spínača) END1 s názvom Uplny_Koniec_Dobry a do jeho podmienky dáme dve premenné. Ich význam pochopíte ďalej.

V políčku Podmínka [Condition] bude:

MrtvyAgent And MrtvyVodca

Do aktivačného políčka Při Aktivaci zadáme:

[] exec "OutroWin.sqs"

Týmto triggerom si spustíme našu koncovú cutscénu pri úspešnom zakončení misie.

Prejdeme k vytváraniu triggerov na sledovanie splnenia jednotlivých cieľov.

Vytvoríme si trigger SWITCH s názvom Koniec_Dobry1. Pomocou neho si spustíme cutscénu prehranú po likvidácii Agenta. Jeho podmienku si dáme takú, ktorá nám slúži na splnenie tohoto cieľa. V našom prípade to bude Not Alive Agent. Do políčka Při Aktivaci [OnActivation] zadáme príkaz na spustenie cutscény a pomocou premennej si pripravíme ukončenie misie.

[] exec "OutroWin1.sqs"; MrtvyAgent = TRUE

Ďalším triggerom SWITCH si spustíme cutscénu po splnení sekundárneho cieľa a premennú si tiež prichystáme na ukončenie misie. Jeho podmienku si dáme zase takú, ktorá nám slúži na splnenie druhého cieľa. U nás tu bude likvidácia Vodcu Not Alive Vodca (pri zničení vozidla dajte napríklad Not CanMove Ciel2)

[] exec "OutroWin2.sqs"; MrtvyVodca = TRUE

Teraz nám už dáva zmysel použitie dvoch premenných (MrtvyAgent, MrtvyVodca) v podmienke triggeru Uplny_Koniec_Dobry. Keď obe premenné nadobudnú hodnotu TRUE, trigger sa aktivuje a spustí koncové outro. Tieto premenné použijeme aj na simulovanie úteku Agenta a Vodcu. Použijeme ich v podmienkach ich waypointov na útek z polí triggerov kontrolujúcich ich prítomnosť na mieste stretnutia. To si ukážeme nižšie.

Ešte nám zostáva ukončiť misiu pri neúspechu. Za neúspešnú ju budeme považovať ak bude hráč mrtvý alebo niektorý z cieľov utečie. Na to nám budú slúźiť 3 samostatné triggere.

Vytvoríme si trigger LOOSE. Dáme mu názov Uplny_Koniec_Zly. Do jeho aktivačného políčka zadáme:

[] exec "OutroLoose.sqs"

Toto outro sa spustí ak bude hráč mŕtvy.

Teraz si zabezpečíme ukončenie ak niektorý z cieľov unikne. Vytvoríme si na to dva triggery END2 a END3.

Trigger END2 s názvom Uplny_Koniec_Zly2 zgrupneme s Vodcom. Zadáme Not Present. Do aktivačného políčka zadáme:

[] exec "OutroLoose.sqs"

Podmienka pre tento trigger bude:

this && Alive Vodca

Trigger END3 s názvom Uplny_Koniec_Zly1 zgrupneme s Agentom. Zadáme Not Present. Do políčka Při Aktivaci zadáme:

[] exec "OutroLoose.sqs"

A podmienku dáme:

this && PrisielAgent && Alive Agent

Znova zopakujem prečo treba použiť v podmienke aj premennú PrisielAgent:
Táto premenná nadobúda platnosť ak Agent príde na stretnutie (aktivuje waypoint pri Vodcovi) a tým sa nachádza v poli triggeru. Aktiváciu tohoto waypointu si musíme kontrolovať preto, lebo inak by sa tento trigger aktivoval okamžite po spustení misie, pretože by boli splnené jeho dve ďalšie podmienky (Agent by sa nenachádzal v poli triggeru a bol by nažive).

Vetvenie misie môže mať rôzne podoby. Najviac by to asi bolo viditeľné pri tvorbe kampane. V tomto tutoriáli som iba načrtol možnosti a postupy jako pri ich vytváraní postupovať.

P.S. A ako obvykle, otázky a pripomienky smerujte do našej diskusie.

Ukázku mise s jednoduchým ukončením lze stáhnout z http://games.worldonline.cz/flashpoint/tutorials/ofptutorial12/MAA_Intro&Outro_Test_Jednoduchy.zip

Ukázku mise s větveným ukončením lze stáhnout z http://games.worldonline.cz/flashpoint/tutorials/ofptutorial12/MAA_Intro&Outro_Test_Vetveny_Ko.zip


Tutorial 14
Autor : MAA

Vytvoření multiplayer (MP) mise
Náplňou tohoto tutoriálu je vytvorenie multiplayer misie (misie pre hru po sieti).
Mutliplayer misie sa rozdeľujú na niekoľko typov ako cooperative(COOP), deathmatch(DM), team deathmatch(TDM), capture the flag (CTF).

Na začiatku pripomeniem, ako sa dá jednoducho vytvoriť COOP misia. Stačí pri vytváraní singleplayer misie (misie pre jedného hráča) nastaviť pri niektorých jednotkách OVLÁDÁNÍ [CONTROL] - HRATELNÉ [PLAYABLE]. Misiu si potom uložíme ako misiu určenú pre sieťovú hru. Potom po vytvorení servera s touto misiou sa hráči môžu nastaviť do jednotiek, ktoré sme takto sprístupnili a hrať misiu spolu.

S vydaním patchu verzie 1.20 sa stalo vytvorenie jednoduchých multiplayerových misií typov COOP a CTF hračkou. Dajú sa vytvoriť spustením sprievodcov priamo z menu, pri vytvaraní multiplayer hry. Takže sa nimi zapodievať moc nebudeme. Skúsime si vytvoriť misiu typu hold city. Jej podstatou je získanie určitej pozície (poprípade vlajky) a jej udržanie pred týmami súperov. Ostatné týmy sa snažia územie (vlajku) získať pre seba a tým získať body.

Popis mise
Naša misia sa bude odohrávať pri osade Meaux. Nastúpia proti sebe dva týmy. Jeden východný a jeden západný. Ich úlohou bude obsadiť Meaux, vztýčiť vlastnú vlajku a obraňovať ju pred súperom. Za každé vztýčenie vlajky dostane tým jeden bod. Na ukončenie misie bude treba nazbierať zvolený počet bodov alebo misiu ukončíme po uplynutí navoleného času.

Vytvoření základu mise
Severne od Meaux si vytvoríme skupinku troch východných vojakov. Ich výber nechám na vás. V ich blízkosti pridáme pár krabíc s muníciou, stan a niekoľko vozidiel. Ich výber nechám zase na vás, ale kvôli plynulosti hrania misie doporučujem pridať iba pozemné vozidlá.
Niekoľko sektorov juhovýchodne si pri ceste vytvoríme zase troch západných vojakov, krabice s muníciou pre nich, stan a tiež niekoľko vozidiel. Do osady rozmiestnime niekoľko ťažkých guľometov M2, krabice so zbraňami a tiež pár vozidiel na spestrenie.
Všetkým ľudským jednotkám dáme hodnotu OVLÁDÁNÍ [CONTROL] - HRATELNÉ [PLAYABLE] a všetkým vozidlám STRANA[SIDE] - PRÁZDNÝ[EMPTY] a hodnotu INFO AGE - AKTUÁLNÍ[AKTUAL], aby boli prázdné jednotky od začiatku misie pre AI známe a nestrieľali po nich (u mňa to akosi nefunguje :))
Veliteľom oboch týmov dáme waypoint UDRŽET POZICI [HOLD] do stredu osady. Dáme si misiu uložiť ako uživateľskú misiu s vami zvoleným názvom. Doporučujem vám, aby ste sa po urobení každej zmeny vždy prepli do veliteľa každého týmu (nastaviť OVLÁDÁNÍ - HRÁČ) a skúsili si, či všetko funguje jako má a či je všetko na správnom mieste. V opačnom prípade prídete na prípadnú chybu dosť neskoro a budete musieť kontrolovať zbytočne veľa vecí naspäť.

Vytvoření a modifikace description.ext a stringtable.csv
Teraz nasleduje nastavenie súboru description.ext. Vytvoríme si súbor s názvom description.ext v adresári vašej uživateľskej misie. Čo všetko si v ňom môžeme nastaviť si prečítajte v tutoriáli o tomto súbore. Nas bude zaujímať iba niekoľko nastavení. Prvým z nich bude respawn (oživenie jednotky po jej úmrtí ). Typ respawnu si navolíme 3 [BASE] pre oživenie na značkách (markeroch) respawnu pre každý tým. Dobu respawnu nechám zase na vás ale odporúčam hodnotu 10 a viac.
Ďalšou vecou, čo urobíme, bude nastavenie parametrov pre spustenie multiplayer misie. Tieto parametre si budeme potom vyberať v menu, pri spúštaní servera pre misiu.
Prvým parametrom bude čas, určený na hranie misie. Po jeho vypršaní sa misia ukončí. V description.ext to bude vizerať následovne:

titleParam1
          = $STRD_Z1;
valuesParam1[] = {10000, 300, 600, 900, 1200, 1500, 1800, 2700, 3600,
          7200};
defValueParam1 = 1800;
textsParam1[] = {$STRD_10, $STRD_T005, $STRD_T010, $STRD_T015, $STRD_T020,
          $STRD_T025, $STRD_T030, $STRD_T045, $STRD_T060, $STRD_T120};

TilteParam1 je textový názov parametru. U nás je to odkaz na string STRD_Z1 v súbore stringtable.csv. ValuesParam1 je súhrn časových jednotiek v sekundách. Ich názov na zobrazenie je opäť definovaný pomocou odkazov na súbor stringtable.csv pomocou TextParam1. Čiže napríklad pre hodnotu 10000 sa priradí a zobrazí názov STRD_10 v stringtable.csv. Prostredníctvom DefValueParam1 si nastavíme defaultnú (prednastavenú) hodnotu pre daný parameter.

Ďalším parametrom je počet bodov (skóre), ktoré budú potrebné k víťazstvu. Nastavenie tohoto parametru bude vizerať takto:

titleParam2
          = $STRD_Z2;
valuesParam2[] = {10000, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 60,
          70, 80, 90, 100, 120, 140, 160, 180, 200, 250, 300};
defValueParam2 = 20;
textsParam2[] = {$STRD_10, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 60,
          70, 80, 90, 100, 120, 140, 160, 180, 200, 250, 300};

Hodnoty tohoto parametru nastavujeme podobne ako hodnoty parametru pre čas.

Teraz si vytvoríme súbor stringtable.csv a zadefinujeme si do neho jednotlivé stringy (texty). Jeho obsah bude vizerať asi takto:

LANGUAGE, Czech

STRD_Z0,"Bitka o Meaux"
STRD_Z1,"Čas:"
STRD_Z2,"Body k víťazstvu:"
STRD_01,"1 minúta do konca"
STRD_10,"Bez limitu"
STR_End,"Koniec hry\n Konečný stav - Západ %1 : Východ %2"
STR_Score,"Stav - Západ %1 : Východ %2"
STRD_T005,"5 min"
STRD_T010,"10 min

Položka LANGUAGE (jazyk) je veľmi podstatná a bez nej by nám tento súbor nebol k ničomu. Nastavujeme si tu, pre aký jazyk je vytvorený a použíteľný tento súbor. Pre použitie aj v anglickej verzii Flashpointu doporučujem vytvoriť aj stringy pre tento jazyk, inak hráči s touto verziou nebudú nič na obrazovke vidieť. Stringy nemusia byť preložené, stačí ich znova opísať v češtine alebo slovenčine a oddeliť čiarkami. Potom sa zobrazia aj v anglickej verzii v češtine alebo slovenčine. Súbor bude potom vizerať takto:

LANGUAGE, Czech, English

STRD_Z0,"Bitka o Meaux","Bitka o Meaux"
STRD_Z1,"Čas:", "Čas:"
STRD_Z2,"Body k víťazstvu:", "Body k víťazstvu:"
STRD_01,"1 minúta do konca", "1 minúta do konca"
STRD_10,"Bez limitu","Bez limitu"

To by bolo k description.ext a stringtable.csv asi všetko.

Nastavení úvodních hodnot
Nasledujúcim krokom je nastavenie úvodných hodnôt pri spúštaní misie. Na to si vytvoríme súbor init.sqs. Ako sme si povedali už v totoriáli o tvorbe intra a outra, tento súbor sa automaticky spustí pri načitaní misie. Zadefinujeme si do neho hodnoty premenných WestScore a EastScore. Na začiatok im dáme hodnoty 0.
To isté, ako cez tento súbor, môžeme urobiť aj tak, že si vytvoríme trigger s názvom Init a do jeho aktivačného políčka si zadefinujeme veci, ktoré chceme spustiť na začiatku misie.

Už máme zadefinované parametre a vytvorený základ misie a môžeme pristúpiť k vytvoreniu jadra misie.

Vytvoření jádra mise
Najskôr si v základňách oboch týmov vytvoríme značky (markers) na oživenie (respawn). Markeru vo východnej základni dáme názov RESPAWN_EAST a v západnej základni RESPAWN_WEST. Ich tvary dajte elipsu alebo kruh. Potom si umiestnime do osady Meaux jednu vlajku. Názov dáme vlajka a do jej inicializačného políčka zadáme:

this SetFlagTexture "bivlajka.jpg"; this SetFlagSide Resistance

Týmto dáme úvodnú textúru na vlajku logo BI a stranu vlastníka dáme neutrálnych partyzánov.
Teraz si nastavíme pomocou spínačov (triggerov) skórovanie. Vytvoríme si trigger PŘEPÍNAČ[SWITCH] s názvom BodyEast. Do jeho podmienky dáme:

(side (FlagOwner vlajka) == East)

To znamená, že sa trigger spustí, ak bude vlastníkom vlajky východný voják.
Do aktivačného políčka zadáme:

vlajka
          SetFlagOwner objNull; vlajka SetFlagTexture "rus_vlajka.pac";
          vlajka SetFlagSide East; EastScore=EastScore+1; PublicVariable "EastScore";
          UkazScore=1

Týmto si zabezpečíme nasledovné: Ak sa trigger spustí, nestane sa vlastníkom vlajky žiadny vojak (aby nám vlajka zostala na stožiari a nie aby ju mal vojak na chrbáte), vlajka bude mať textúru ruskej vlajky, bude patriť východu, k skóre východu sa pričíta jeden bod, premennú EastScore si sprístupníme pre ďalšie spracovanie a premennou UkazScore si spustíme trigger na zobrazenie aktuálneho skóre (to uvidíte pri vytvorení triggeru na tento účel).

Teraz si ešte v efektoch triggeru navolíme zobrazenie textu Východ vlastní vlajku ! v spodnej časti obrazovky.

To isté si urobíme aj pre západ. Názov triggeru dáme BodyWest. Do podmienky dáme:

(side (FlagOwner vlajka) == West)

A do aktivačného políčka:

vlajka
          SetFlagOwner objNull; vlajka SetFlagTexture "usa_vlajka.pac";
          vlajka SetFlagSide West; WestScore=WestScore+1; publicVariable "WestScore";
          UkazScore=1

V efektoch nastavíme zobrazenie textu Západ vlastní vlajku ! ako pri predošlom triggeri.

Teraz si vytvoríme trigger SWITCH s názvom Score na zobrazenie aktuálneho skóre.
Časovaču nastavíme všetky hodnoty na 1 a do podmienky zadáme:

UkazScore==1

Do aktivačného políčka zadáme:

titletext [Format [Localize "STR_Score", WestScore, EastScore], "PLAIN"]; UkazScore=0

Po tom ako nadobudne podmienka platnosť (hodnota premennej UkazScore bude 1), sa v strede obrazovky zobrazí formátovaný text, ktorého maska je definovaná v stringtable.csv pod názvom STR_Score a hodnami sú premenné WestScore a EastScore. Zároveň sa nám trigger deaktivuje zmenou hodnoty UkazScore na 0.

Ďalším triggerom bude trigger KONEC1 [END1] s názvom Game_Over na konečné ukončenie misie. Časovaču dáme všetky hodnoty na 2. Podmienku na spustenie si nastavíme premennou:

Koniec

A aktiváciou si spustíme vytvorené outro:

[] exec "Outro.sqs"

Nasledujúce dva triggere slúžia na ukončenie misie po splnení zadaných parametrov pri spúštaní servera pre hranie misie.

Prvý trigger SWITCH s názvom Limit_Score slúži na ukončenie po dosiahnutí navoleného skóre.
Podmienka bude:

(EastScore >= param2) or (WestScore >= param2)

a aktivácia:

Koniec=TRUE

Druhý trigger SWITCH s názvom Limit_Cas slúži na ukončenie po dosiahnutí stanoveného časového limitu.
Podmienka bude nasledovná:

(time >= param1)

a aktivácia:

Koniec=TRUE

Premennou Koniec si spustíme úplné ukončenie misie pomocou triggeru Game_Over..

Teraz si vytvoríme ešte trigger SWITCH s názvom Minutka, ktorý nás upozorní keď začne posledná minúta hry.
Podmienka bude:

(Param1-time)<=60

Aktivácia bude:

Hint Localize "STRD_01"

Takto si zobrazíme hint s textom STRD_01 uvedením v stringtable.csv, keď bude čas zostávajúci do konca hry 1 minúta.

Tak, funkčnosť misie by mala byť zabezpečená a môžeme pristúpiť k záveru.

Doplňky k misi
Posledným krokom je vytvorenie intra, outra, briefingu a overview. Pri ich vytváraní môžete postupovať podľa nášich predošlých tutoriálov na túto tému, alebo použiť utilitky na to určené. Ďalej si môžete doplniť rôzne vychytávky jako napríklad to, že sa body pripočítajú týmu až keď bude kontrolovať vlajku nejaký určený čas alebo sa po tom ako bude niektorý tým viditeľne slabší, k nemu pripojí skupinka AI riadených bojovníkov napríklad z radov partyzánov,… atď. Možností je veľa, stačí využíť trocha fantázie a misia je omnoho zaujímavejšia. Len nezabudnite na obmedzené možnosti multiplayeru vo Flashpointe a zbytočne to nepreháňajte pri počte jednotiek a scriptov, aby bola misia nielen efektná, ale aj hrateľná.

Pod týmto tutoriálom nájdete odkaz na download ukážkovej misie, ktorú som vytvoril, aby ste si mohli popisovaný postup odsledovať na hotovej misii. Je sice bez briefingu a bez overview, ale na to nebol tento tutorial zameraný a ani som na to nemal dosť času

Takže parbe zdar a Flashpointu zvlášť. Stretneme sa pri ďalšom tutoriáli a v diskusii, kde sa vám snažíme poradiť s vašimi problémami.

P.S. Skoro som zabudol. Ako je už pravidlom, otázky a pripomienky smerujte, prosím, do našej diskusie.

Stáhnout ukázkovou misi k tomuto tutoriálu lze z http://games.worldonline.cz/flashpoint/tutorials/ofptutorial14/MAA_MP_Test.Eden.zip


Tutorial 15
Autor : Leon

Velice často nás bombardujete dotazy s otázkou, jak vyvořit kampaň. Po dlouhou dobu se vůbec netušilo, jak správně sladit mise do celku a veškeré "kampaně" byly jen soubory jednotlivých misí. Až nedávno Pcverden ze švédké skupiny PSK publikoval návod na to, jak udělat skutečnou kampaň. Já jsem zatím neměl možnost a čas zkoušet tento postup, a proto se dopustím ojedinělého porhřešku a víceméně pro vás jeho tutoriál jen přeložím, aniž by byl postup odzkoušen. Až se na tvorbu kampaně dostanu, tak tento tutoriál případně pozměním. Vaše touha po kampaních je ale taková, že mi to určitě odpustíte:)

Sice jde o překlad, ale myslím si, že v původním zdrojáku jsou chyby. Tam, kde si to myslím, na to upozorním.

Jak vytvořit kampaň
V první řadě si vytvořte ve vašem uživatelském adresáři nový adresář, například

users/pcverden/Norge.abel

Do něj nakopírujte následující soubory:

1985.paa (není nutný)
mission.sqm
overview.html
vssver.scc

V tomto adresáři vytvořte další adresář a nazvěte ho Missions. Do něho budete umísťovat jednotlivé mise kampaně v klasické podobě. To znamená, že mise umístěné v /"username"/missions pouze zkopírujete do adresáře users/"username"/missions/campaign/Norge.abel. (kde teď vzal adresář campaign? - pozn. Leon)

Ještě před jejím kopírováním si ale buďte jisti, že jste je řádně dokončili. Jakmile je umístíte do této složky, už je nebudete moci editovat v editoru. (jednotlivé mise ale můžete editovat stále z /user/missions/, pouze je pak musíte znovu překopírovat - pozn. Leon)

Nyní nastal čas to vyzkoušet. Otevřete editor a pak načtětě Norge.Abel. Měla by se objevit hláška 'read me only file', odklikněte a uložte do 'Singleplayer mission' adresáře (tomu moc nerozumím, ale asi to chce zkusit, při použití programu OFP Campaign Editor (viz konec článku) toto zakládání odpadá, pozn Leon).

Zbytek tutoriálu je zaměřen na soubor description.ext, který musí být uložen u kampaně (v základním adresáři, ne v podadresářích). Obsahuje instrukce, které určují, jak jsou spojené mise do kampaně.

Identities
Class CfgIdentities je stejná jako v každém jiném description.ext (popis description.ext jsme si již rozebírali v jiném tutoriálu, pozn Leon).

class CfgIdentities
{
class Carlsson
{
name = "GB Carlsson";
face = "Face25";
glasses="None";
speaker = "Adam";
pitch = 1.10;
};
class Hedin
{
name = "Lt Hedin";
face = "Face24";
glasses="None";
speaker = "Greg";
pitch = 1.05;
};
};

Awards
Awards neboli vyznamenání je to, co se vám objeví podle toho, jak moc budete dobří nebo špatní při výsledcích mise. Většina misí toho vůbec nevyužívá, ale pokud to chcete používat, vyjměte pomocí DePBO soubory xxreward?.???? z originálních kampaní a eventuálně si je zkopírujte do adresáře user/"user"/missions/campaign/missions.

class Awards
{
class Award01
{
limit = 12;
abel = XXREWARD1.ABEL;
cain = XXREWARD1.CAIN;
eden = XXREWARD1.EDEN;
};
class Award02
{
limit = 40;
abel = XXREWARD2.ABEL;
cain = XXREWARD2.CAIN;
eden = XXREWARD2.EDEN;
};
class Award03
{
limit = 100;
abel = XXREWARD3.ABEL;
cain = XXREWARD3.CAIN;
eden = XXREWARD3.EDEN;
};
};

class Penalties
{
class Penalty01
{
limit = -1;
abel = XXPUNISH1.ABEL;
cain = XXPUNISH1.CAIN;
eden = XXPUNISH1.EDEN;
};
class Penalty02
{
limit = -7;
abel = XXPUNISH2.ABEL;
cain = XXPUNISH2.CAIN;
eden = XXPUNISH2.EDEN;
};
class Penalty03
{
limit = -12;
abel = XXPUNISH3.ABEL;
cain = XXPUNISH3.CAIN;
eden = XXPUNISH3.EDEN;
};
class PenaltyGameOver
{
//
          pozn. - ukončí kampaň, pokud máte pod -15 bodů.
limit = -15;
abel = XXGAMEOVER.ABEL;
cain = XXGAMEOVER.CAIN;
eden = XXGAMEOVER.EDEN;
};
};

exitScore = -15;

Lives
// Tohle určuje, kolik budete mít k dispozici životů.

class MissionDefault
{
lives = -1;
lost = ;
end1 = ;
end2 = ;
end3 = ;
end4 = ;
end5 = ;
end6 = ;
};

Jak přejít z mise do mise
Nejdůležitější část description.ext, která přímo určuje, jak spojit mise do kampaně.

Name = je název kampaně

firstbattle = je úvodní mise do kampaně

V první části, kde je 'firstmission = Intro', je to asi nutné.

Dále už jen měníte názvy svých misí.

Template = je adresář s tou kterou misí. Nezapomínejte na celý název (i s '.Eden' atd.)

Do části mezi 'class Mobilisering' a 'class Uppsittning' vkládejte stejným způsobem další mise.

Všimněte si několik drobností u poslední mise 'Uppsittning', kde 'end1 = Uppsittning' i 'lost = Uppsittning'. To říká hře, že po skončení mise už nic dalšího nenásleduje (běžně to odkazuje na následující misi, pozn Leon).

Poslední část je pouze cutscéna, takže nemá end1 ani lost. Po skončení cutscény je kampaň ukončena a hra se vrací do hlavního menu.

class Campaign
{
name = "Sverige - 1995";
firstBattle = Prologue;
class Prologue
{
name = "PROLOGUE";
cutscene = ;
firstMission = Intro;
end1 = ;
end2 = ;
end3 = ;
end4 = ;
end5 = ;
end6 = ;
lost = ;
// jsem přesvědčen, že zde má následovat }, pozn. Leon
class Intro: MissionDefault
{
end1 = Mobilisering;
end2 = Mobilisering;
end3 = Mobilisering;
end4 = Mobilisering;
end5 = Mobilisering;
end6 = Mobilisering;
lost = intro;
template
          = 00svensktv.eden;
};
class Mobilisering: MissionDefault
{
end1 = Uppsittning;
end2 = Uppsittning;
end3 = Uppsittning;
end4 = Uppsittning;
end5 = Uppsittning;
end6 = Uppsittning;
lost = Mobilisering;
template = 00svenskintro.Abel;
};
class Uppsittning: MissionDefault
{
end1 = Uppsittning;
end2 = Uppsittning;
end3 = Uppsittning;
end4 = Uppsittning;
end5 = Uppsittning;
end6 = Uppsittning;
lost = Uppsittning;
template = 00svensktv2.Abel
};
class over: MissionDefault
{
noAward=true;
end1 = ;
end2 = ;
end3 = ;
end4 = ;
end5 = ;
end6 = ;
lost = ;
template=00svenskxx.cain;
};
};

Tvorba kampaně pomocí programu OFP Campaign Editor
Pro většinu z vás, kteří do hloubky editace misí ještě nepronikli, je pak určen program OFP Campaign Editor (ke stažení na naší stránce download). Ten poměrně intuitivně vytváří všechny tyto uvedené soubory a třídy v nich bez toho, aniž byste se museli do maličkostí biflovat přesný postup. Za ideální považuji smíchání obou postupů - základ vytvořit tímto programem a něco případně doladit ručně. Faktem však zůstává, že musíte vědět, jaké nastavení je k čemu. A o tom jsme si dosud povídali.

Jak tedy takový program OFP Campaign Editor funguje. Na následujících obrázcích vidíte jednoduché a přívětivé prostředí programu. Po spuštění to po vás chce buď zadání nové mise (pro zajímavost paralelně sledujte, co se vám vytváři za adresáře), nebo načtení kampaně již rozdělané.

V horní liště se vpravo nahoře máte položky pro ukládání, ale nejdůležitější je trochu nenápadný přepínač na liště úplně vlevo. Tam se přepínáte mezi vkládáním misí a ostatními důležitými volbami (Strings, Penalties, Awards, Campaign Info, Identities, Radio, Sound). Zbytek je již na vás a myslím, že tento program pochopí prakticky každý. Ostatní je vaší trpělivosti a snaze dotáhnout dílo do konce.

A to je celé kouzlo tvoření kampaně. Pokud tedy máte dostatek misí a chcete je spojit dohromady, zde je návod, jak na to. My se k tomuto tématu určitě ještě vrátíme s vlastními zkušenostmi a radami.


Tutorial 16
Autor : MAA

Jak unpacknout (rozpakovat) misi
Toto je môj jubilejný 10 tutoriál a vysvetlím vám v ňom, ako si môžete rozpakovať misiu formátu *.pbo. To využijete vtedy, ak si napríkad stiahnete hotovú misiu z našej stránky a chcete si ju nejako upraviť. Napríklad zmeniť niektoré jednotky na HRATELNÉ [PLAYABLE] pre hranie misie v multiplayer cooperatívnom móde. Alebo si iba pozrieť ako autor postupoval pri jej vytváraní, poprípade odpozerať niektoré postupy. Musím vás ale upozorniť, že zmeny v hotových misiách by ste mali prevádzať iba so súhlasom ich autora, ak nieje uvedené inak v súboroch priložených k nim.

Na rozpakovanie budete potrebovať dva programčeky: DePBO a Unpack-SQM. Oba nájdete na http://games.worldonline.cz/flashpoint/download.asp .

Ešte pred samotným začiatkom práce vás musím upozorniť, že nasledujúci postup platí IBA pre rozpakovanie misie, nie kampane alebo iných *.pbo súborov. Pri nich je postup odlišný.

Takže môžeme začať. Najskôr si, pre uľahčenie práce nakopírujte misiu s koncovkou pbo do adresára: …\OPERATIONFLASHPOINT\Users\vaše_meno\Missions\
Nieje to však nutné. Súbor *.pbo môžete mať na hociakom inom mieste.

Teraz spustite DePBO. V hornej časti máte dve políčka. Úplne hore je ".PBO File" [Súbor PBO] a pod tým "Save Directory" [Adresár pre uloženie]. Pri každom políčku máte tlačítko "Browse" [Nalistovať].
Tlačítkom "Browse" pri políčku ".PBO File" si nalistujeme súbor misie, ktorý chceme rozpakovať. "Save Directory" si nalistujeme "…OPERATIONFLASHPOINT\Users\vaše_meno\Missions\" .

Potom stlačte tlačítko "Extract Files" [Rozpakovať súbory] v spodnej časti okna. V strednom okne by sa vám mali vypísať súbory, ktoré boli rozpakované. Ak vám vypíše nejakú chybovú hlášku, buď robíte niečo zle alebo je súbor poškodený,… Je viacero možných dôvodov. Ak narazíte na nejaké problémy, tak nám napíšte do diskusie.

Teraz máme misiu rozpakovanú v našom adresári s misiami. Mal by sa vám vytvoriť adresár s názvom misie a s kódovým názvom ostrova (Eden, Abel, Cain, Intro). V jeho obsahu by mali byť všetky súbory (aj zvuky a hudba), ktoré autor pri vytváraní misie použil. Adresár nebude obsahovať súbory ako napríklad stringtable.csv, description.ext, briefing, scripty a podobne keď ich autor nepoužil, ale musí obsahovať súbor "mission.sqm". Ak si tento súbor skúsite čítať, tak zistíte, že obsahuje samé "hakybaky" (česky "klikyháky"?, pozn. od Leona):) To znamená, že ho musíme ešte decryptovať.

Na decryptovanie súboru nám poslúži druhy programček " Unpack-SQM ". Súbor "unpack-sqm.exe" si nakopírujte do adresára misie k súboru "mission.sqm" a spustite ho. Po pár sekundách by sa malo DOSové okno programu zavrieť a v adresári by mal byť vytvorený súbor "mission.txt". Pozrieme si či je čitateľný. Ak áno, tak pôvodný súbor "mission.sqm" premenujeme napríklad na "mission.old" a nový súbor "mission.txt" premenujeme na "mission.sqm".

Teraz už stačí spustiť OFP a v editore si načítať rozpakovanú misiu a meniť si a pozerať čo len chcete :)

Dodatek
Pri niektorých misiách je rozpakovávanie trocha zložitejšie. Po rozpakovaní *.pbo zostávajú všetky rozpakované súbory misie ešte zacryptované a treba každý súbor zvlášt decryptovať podobne ako súbor "mission.sqm". Keďže je program Unpack-SQM dosť neštastne viazaný priamo na názov "mission.sqm" je nutné každý súbor po jednom postupne premenovať na "mission.sqm", potom spustiť unpack-sqm.exe a vytvorený súbor "mission.txt" premenovať (a prepísať pôvodný súbor, ak treba) na pôvodný názov (napríklad: barrage.sqs). To platí pre všetky súbory vrátane obrázkov a zvukov. Tieto zmeny rozpakovávania by mali platiť pre súbory *.pbo spakované editorom OFP. Misie spakované pomocou programu StuffPBO by mali ísť rozpakovať pôvodným postupom.

Prípadné otázky a návrhy na ďalšie tutoriály smerujte do našej diskusie.


Tutorial 17
Autor : Leon

Vynucený výsadek týmu vojáků
Již dlouho jsme vám nepřinesli žádný tutoriál, což není způsobeno tím, že by nebylo o čem psát, ale spíše tím, že nebyl čas psát. Teď jsem si chvilku našel, takže vám alespoň ukážu a přiblížím dva užitečné scripty. Doufám, že jejich pochopení vám nebude dělat problém, zvláště pokud si přečtete úvodní tutoriál na téma scripty.

Prvním dnes popsaným scriptem je moje drobná modifikace scriptu eject.sqs:

; script na vynucený výsadek vojáků z vrtulníku
; voláno z editoru syntaxí
; [<jméno vedoucího skupiny>, <jméno vrtulníku>] exec "eject.sqs"

; načtení zadaných hodnot do scriptu

_leader = _this select 0
_heli = _this select 1

; vytvoření proměnné, kde budou všichni z jednotky zadaného vedoucího

_group = units _leader

; spočítá, kolik je v této skupině lidí

_total = count _group
_i = 0

; nyní následuje smyčka, kdy vyskočí jeden po druhém v určítém časovém intervalu

#loop

(_group select _i) action ["eject", _heli]
unassignvehicle (_group select _i)

; samotný časový interval a přechod na dalšího člena ve skupině

~0.3
_i = _i + 1

; bude opakovat smyčku, dokud všichni nevyskáčí

? _i < _total : goto "loop"

; konec scriptu

exit

Jak vidíte, jedná se o poměrně jednoduchý script. V editoru je třeba mít vrtulník (se jménem například Heli1) a skupinu vojáků, kterým bude velet voják nazvaný třeba Para1. Pokud chcete mít vojáky ihned na začátku mise ve vrtulníku, dejte každému z nich do inicializačního pole

this moveincargo Heli1

Tím se přesunou do nákladového prostoru vrtulníku, odkud pak vyskočí. Samotný výskok se udělá triggerem, který inicializuje vrtulník Heli1 (spojíte trigger a vrtulník přes F2). Při sepnutí spínače pak spustíte script následujícím způsobem

[Para1, Heli1] exec "eject.sqs"

To vám zajistí, že všichni ve skupině s vojákem Para1 vyskočí (Para1 jako první). V samotném scriptu jsou popsány všechny kroky, takže by vám to mělo být jasné. Všimněte si, že po samotném vyskočení (příkaz eject) následuje důležitý příkaz unassignvehicle, který v praxi zajištuje to, že se vrtulník nebude pro vojáky vracet (bral by to jako nucený výskok). Důležitý je také časový interval mezi jednotlivými výskoky - v našem případě je 0,3 sekundy, což se mi v praxi osvědčilo. V případě snížení na 0,2 a méně parašutisti skáčou na sebe a ničí si padáky, při vyšším nastavení se zase roztahuje celá skupina po velkém prostoru. Samozřejmě také záleží na dalších věcech - rychlosti vrtulníku (nastavte na pomalou nebo běžnou) a povětrnostních podmínkách (větru). Proto si toto číslo upravujte podle konkrétní situace.

Shození čehokoliv na padáku
Druhý script slouží pro shození čehokoliv na padáku a jeho autor je Lnt. Charles Wonder

; SKRIPT PRO PRISTANI CEHOKOLI NA PADAKU
; autor: Lnt. Charles Wonder
;
;Czech:
;pomoci tohoto skriptu muze cokoli od bedny s naboji po tank pristat na padaku
;Pouziti: [vec_ktera_ma_pristat, padak] exec "padak.sqs"
; vec_ktera_ma_pristat == vec ktera ma na padaku pristat (umistit na zem)
; padak == jmeno padaku na kterem ma ta vec pristat (nejlepe do vzduchu, musi byt prazdny)
; Priklad: [hummer, padak01] exec "padak.sqs"
; na padaku padak01 pristane HMMWV hummer
;skript funguje tak ze kazdou setinu sekundy upravi pozici objektu na pozici padaku
;a kdyz je dva metry nad zemi tak se odpoji.
;Pouzivat i modifikovat. O PROPADNYCH VYLEPSENICH ME PROSIM INFORMUJTE.
;muj e-mail: chucky.w@worldonline.cz
;

_objekt=_this select 0
_padak=_this select 1

goto "begin"

#begin
_objekt setpos getpos _padak
_padpos=getpos _padak
~0.01
_padposz=_padpos select 2
? (_padposz > 2) : goto "begin"
_padposx = _padpos select 0
_padposy = _padpos select 1
_objekt setpos [_padposx, _padposy, 0]
exit

Jde o ještě primitivnější script než v prvním případě. Stačí si na mapě vytvořit prázdný padák a věc, kterou chcete shodit. Vhodnou inicializací pak spustíte tento script. Ten pracuje na jednoduchém principu - každou setinu vteřiny nastavuje polohu věci na polohu padáku a zároveň kontroluje, jak vysoko se nachází. Je-li ve výšce 2 metry, spadne na zem.

Brzy bychom chtěli publikovat sérii tutoriálu na téma tvorba addonů do hry, uvidíme, jak na tom budeme s časem.

Stáhnout script eject.sqs můžete z http://games.worldonline.cz/flashpoint/tutorials/ofptutorial17/eject.zip
Stáhnout script padak.sqs můžete z http://games.worldonline.cz/flashpoint/tutorials/ofptutorial17/padak.zip


Tutorial 18
Autor : Leon & Zapotocky

Efekty k příkazům switchmove a playmove
Poslední dobou jste nás neustále žádali, abychom napsali tutoriál na všelijaká gesta a pohyby, které se dají využívat především v intrech a scriptech. Pro nedostatek času jsem se k tomu dostal až teď, ale věřím, že tento poměrně vyčerpávající tutoriál nahradí ono zpoždění. Tímto bych chtěl poděkovat i našemu čtenáři Zápotockému, který mi poslal také poslal tutoriál na toto téma. Z toho sice nakonec nezbylo skoro nic, přesto ho uvádím jako spoluautora.

Když jsem přemýšlel, jaká by byla nejlepší forma pro ukázku všech těchto pohybů, došel jsem k závěru, že kromě popisu všech efektů je vám všechny (všechny potřebné a důležité, ve skutečnosti jich je spousta, ale jde o běžné pohyby vojáků ve hře, které ani nevnímáte) přehraju i v jedné misi (nazval jsem ji Pohyby). Ta je formou intra dlouhého přes 6 minut, kdy jsou na jednom vojákovi ukázány všechny možné pohyby a gesta.

K vytvoření takovéto mise si stačilo vytvořit dva vojáky - prvním je hráč (pojmenoval jsem ho man), druhým ukázkový voják (pojmenovaný vojak), spínač pro ukončení mise a k misi přiložit script init.sqs - script s tímto jménem se při spuštění mise spouští automaticky. Oboje vám samozřejmě dávám ke stažení ve formě zdrojových souborů (jsou na konci tutorialu). V další části tohoto tutoriálu pak rozebírám samotný zdroják scriptu init.sqs.

Nejdříve ale bude vhodné přiblížit si několik věcí obecně. Ke spuštění všech těchto efektů slouží příkazy switchmove a playmove. Jsou to příkazy velmi podobné a snad jediný rozdíl v nich je ten, že switchmove se provádí okamžitě, playmove trochu nevyzpytatelně. V každém případě je lepší zkoušet si v každé misi, co funguje lépe.

Chtěl bych upozornit, že tutoriál je pouze o těchto příkazech a nezařadil jsme do něj například příkaz SetUnitPos, pomocí kterého lze vojáka přinutit lehnout nebo vstát. Pro úplnost - jeho syntaxe je

jednotka SetUnitPos "DOWN"

další možnosti jsou "UP" a "AUTO". Aby se to ale nepletlo, ve výčtu jsou jen efekty u příkazu switchmove (playmove).

To je snad vše, přistupme proto k jednotlivým příkazům.

Zdrojový script s ukázkami
;na začátek si nastavíme false pro hodnotu konec, která je podmínkou ve spínači pro ukončení mise

konec = false

;Něco o autorovi:)

titleCut ["","BLACK IN",4]
titletext [" ... ukázky všelijakých pohybů ve Flashpointu...\nLeon - http://flashpoint.tiscali.cz","PLAIN DOWN",3]

;Nastavíme chování vojáka tak, aby se cítil "bezpečně", tzn. pušku má na rameni

vojak SetBehaviour "SAFE"

;Vytvoříme a nastavíme kameru z pozice našeho sledovatele na vojáka, který bude konat pohyby

_CameraPos = getpos man
_cmx = (_CameraPos select 0)
_cmy = (_CameraPos select 1)
_cmz = (_CameraPos select 2) + 3
_cam = "camera" CamCreate [_cmx,_cmy,_cmz]
_cam CameraEffect ["Internal","back"]
_cam CamSetTarget vojak
_cam CamSetFov 0.4
_cam CamCommit 0
@camCommitted _cam
~10

;Každý příkaz trvá 8 sekund, přičemž se vám na obrazovku vypíše příkaz, který voják provádí.

;Jako první provede salutování

vojak switchmove "EffectStandSalute"
titletext ["switchmove EffectStandSalute\nVoják provádí salutování","PLAIN DOWN",1]
~8

;Které poté ukončí. Tento příkaz nemusíte použávat pokaždí po předchozím, který se stejně ukončí.

vojak switchmove "EffectStandSaluteEnd"
titletext ["switchmove EffectStandSaluteEnd\nkteré poté ukončí","PLAIN DOWN",1]
~8

;Voják si lehne do polohy, jako by měl dělat kliky a začne je dělat

vojak switchmove "FXStandToDip"
titletext ["switchmove FXStandToDip\nVoják si lehne do polohy, jakoby měl dělat kliky a začne je dělat","PLAIN DOWN",1]
~8

;Voják dělá klasické kliky

vojak switchmove "FXStandDip"
titletext ["switchmove FXStandDip\nVoják dělá klasické kliky","PLAIN DOWN",1]
~8

;Voják vstává z polohy, ve které se dělají kliky

vojak switchmove "FXStandFromDip"
titletext ["switchmove FXStandFromDip\nVoják vstává z polohy, ve které se dělají kliky","PLAIN DOWN",1]
~8

;Voják gestikuluje, jako by s někým hovořil

vojak playmove "EffectStandTalk"
titletext ["playmove EffectStandTalk\nVoják gestikuluje, jakoby s někým hovořil","PLAIN DOWN",1]
~8

;Voják si zvedá telefon a usedá na židli

vojak switchmove "FxStandToTelHand"
titletext ["switchmove FxStandToTelHand\nVoják si zvedá telefon a usedá na židli","PLAIN DOWN",1]
~8

;Voják vsedě telefonuje

vojak switchmove "FXStandTelLoop"
titletext ["switchmove FXStandTelLoop\nVoják vsedě telefonuje","PLAIN DOWN",1]
~8

;Voják ze sedu pokládá telefon

vojak switchmove "FXStandDropTel"
titletext ["switchmove FXStandDropTel\nVoják ze sedu pokládá telefon","PLAIN DOWN",1]
~8

;Voják pokládá telefon

vojak switchmove "FxStandToTel"
titletext ["switchmove FxStandToTel\nVoják pokládá telefon ze stoje","PLAIN DOWN",1]
~8

;Voják má ruce v bok

vojak switchmove "FXStandAtt"
titletext ["switchmove FXStandAtt\nVoják má ruce v bok","PLAIN DOWN",1]
~8

;Voják dává ruce v bok trochu jinak

vojak switchmove "FXStandAttVar1"
titletext ["switchmove FXStandAttVar1\nVoják dává ruce v bok trochu jinak","PLAIN DOWN",1]
~8

;Voják zaujímá blíže nespecifikovaný postoj civilisty

vojak switchmove "CivilStillv1"
titletext ["switchmove CivilStillv1\nVoják zaujímá blíže nespecifikovaný postoj civilisty","PLAIN DOWN",1]
~8

;Voják se vzdává

vojak switchmove "FXStandSur"
titletext ["switchmove FXStandSur\nVoják se vzdává","PLAIN DOWN",1]
~8

;Voják se vzdává jinak

vojak switchmove "FxStandSurUniv"
titletext ["switchmove FxStandSurUniv\nVoják se vzdává jinak","PLAIN DOWN",1]
~8

;Voják se vzdává z polohy vleže

vojak switchmove "FxStandSurDown"
titletext ["switchmove FxStandSurDown\nVoják se vzdává z polohy vleže","PLAIN DOWN",1]
~8

;Voják umírá ze stojící polohy

vojak switchmove "FxStandSurDead"
titletext ["switchmove FxStandSurDead\nVoják umírá ze stojící polohy","PLAIN DOWN",1]
~8

;Voják zaujímá bojový postoj

vojak switchmove "EffectCombatStand"
titletext ["switchmove EffectCombatStand\nVoják zaujímá bojový postoj","PLAIN DOWN",1]
~8

;Voják stojí v pozoru

vojak switchmove "FxAngel"
titletext ["switchmove FxAngel\nVoják stojí v pozoru","PLAIN DOWN",1]
~8

;Voják stojí v pozoru, ruce mírně pokrčeny

vojak switchmove "FxAngel2"
titletext ["switchmove FxAngel2\nVoják stojí v pozoru, ruce mírně pokrčeny","PLAIN DOWN",1]
~8

;Voják se jakoby opře o stůl a hledí na něj

vojak switchmove "FxStandRotateTable"
titletext ["switchmove FxStandRotateTable\nVoják se jakoby opře o stůl a hledí na něj","PLAIN DOWN",1]
~8

;Voják rozhazuje rukama

vojak switchmove "FxStandHip"
titletext ["switchmove FxStandHip\nVoják rozhazuje rukama","PLAIN DOWN",1]
~8

;Voják umírá ze stojící polohy

vojak switchmove "StandDyingVer2"
titletext ["switchmove StandDyingVer2\nVoják umírá ze stojící polohy","PLAIN DOWN",1]
~8

;Voják si sedá na stůl (židli)

vojak switchmove "FXStandToTable"
titletext ["switchmove FXStandToTable\nVoják si sedá na stůl (židli)","PLAIN DOWN",1]
~8

;Voják sedí na stole

vojak switchmove "FxStandUnivTable"
titletext ["switchmove FxStandUnivTable\nVoják sedí na stole (židli)","PLAIN DOWN",1]
~8

;Voják vstává ze sedu na stole

vojak switchmove "FxStandFromTable"
titletext ["switchmove FxStandFromTable\nVoják vstává ze sedu na stole (židli)","PLAIN DOWN",1]
~8

;Voják sedí

vojak switchmove "EffectStandSitDown"
titletext ["switchmove EffectStandSitDown\nVoják sedí","PLAIN DOWN",1]
~8

;Voják sedí jinak

vojak switchmove "EffectStandSitDownVer1"
titletext ["switchmove EffectStandSitDownVer1\nVoják sedí jinak","PLAIN DOWN",1]
~8

;Voják sedí ještě jinak

vojak switchmove "EffectStandSitDownVer2"
titletext ["switchmove EffectStandSitDownVer2\nVoják sedí ještě jinak","PLAIN DOWN",1]
~8

;Voják sedí bez hnutí

vojak switchmove "EffectStandSitDownStill"
titletext ["switchmove EffectStandSitDownStill\nVoják sedí bez hnutí","PLAIN DOWN",1]
~8

;Voják panikaří se zbraní, ta je obráceně

vojak switchmove "EffectWeaponPanic"
titletext ["switchmove EffectWeaponPanic\nVoják panikaří se zbraní, ta je obráceně","PLAIN DOWN",1]
~8

;Voják dělá blíže neidentifikovatelný pohyb

vojak switchmove "FXStandBug"
titletext ["switchmove FXStandBug\nVoják dělá blíže neidentifikovatelný pohyb","PLAIN DOWN",1]
~8

;Voják se nalévá alkoholem

vojak switchmove "FXStandDangle"
titletext ["switchmove FXStandDangle\nVoják se nalévá alkoholem","PLAIN DOWN",1]
~8

;Voják se staví ke stolu?

vojak switchmove "FXStandEndTable"
titletext ["switchmove FXStandEndTable\nVoják se staví ke stolu?","PLAIN DOWN",1]
~8

;Voják něco ukazuje na stolu

vojak switchmove "FXStandShowTable"
titletext ["switchmove FXStandShowTable\nVoják něco ukazuje na stolu","PLAIN DOWN",1]
~8

;Voják k nám stojí zády

vojak switchmove "FXStandStraight"
titletext ["switchmove FXStandStraight\nVoják k nám stojí zády","PLAIN DOWN",1]
~8

;Voják vstává ze sedu

vojak switchmove "SitDownToStand"
titletext ["switchmove SitDownToStand\nVoják vstává ze sedu","PLAIN DOWN",1]
~8

;Voják umírá v sedící poloze

vojak switchmove "SitDownDying"
titletext ["switchmove SitDownDying\nVoják umírá v sedící poloze","PLAIN DOWN",1]
~8

;Voják jednoduše stojí

vojak switchmove "Stand"
titletext ["switchmove Stand\nVoják jednoduše stojí","PLAIN DOWN",1]
~8

;Voják stojí a nehýbe se

vojak switchmove "StandBase"
titletext ["switchmove StandBase\nVoják stojí a nehýbe se","PLAIN DOWN",1]
~8

;Voják leží mrtvý

vojak switchmove "StandDead"
titletext ["switchmove StandDead\nVoják leží mrtvý","PLAIN DOWN",1]
~8

;Voják leží mrtvý jinak

vojak switchmove "StandDeadVer2"
titletext ["switchmove StandDeadVer2\nVoják leží mrtvý jinak","PLAIN DOWN",1]
~8

;Voják dělá pohyb, jako by si přikládal dalekohled k očím

vojak switchmove "StandToBinocStand"
titletext ["switchmove StandToBinocStand\nVoják dělá pohyb, jakoby si přikládal dalekohled k očím","PLAIN DOWN",1]
~8

;Voják asi neví, zda má odejít

vojak switchmove "EffectStandMove"
titletext ["switchmove EffectStandMove\nVoják asi neví, zda má odejít","PLAIN DOWN",1]
~8

;teď si zrušíme kameru

_cam CameraEffect ["Terminate","Back"]
CamDestroy _cam

;a konec nastavíme na true, címž se nám sepne spínač na konec mise

konec = true

exit

Závěr

U některých animací se stane, že po jejich provedení se voják nevrátí do původní polohy a jakoby se v té poloze zasekne. Náprava je jednoduchá - stačí zadat další nulový příkaz v podobě

jednotka switchmove "Null"

Tím se jednotka vrátí do běžné pozice.

Doufám, že jste vše pochopili, pokud ne, směřujte dotazy do diskusí.

Kompletní výčet pohybů je zde.

Na závěr vám ještě dlužím link na zdrojáky této mise, tady je:

Stáhnout zdrojovou misi Pohyby můžete z http://games.worldonline.cz/flashpoint/tutorials/ofptutorial18/pohyby.eden.zip


Tutorial 19
Autor : Leon

Ukázka intra
Často nám posíláte všelijaké dotazy, ze kterých vyplývá, že vám stále dělá značné problémy práce s kamerou a tvorba intra. Rozhodl jsem se proto, že vám popíšu jedno konkrétní intro. Pakliže ho pochopíte, dokážete pak již vytvořit cokoliv.

Jako ukázkové intro jsem použil část svého velmi dlouhého intra z připravované kampaně pro ČSLA armádu. Vybral jsem úsek, který zabírá jen americké jednotky a nepotřebujete pro něj tedy addon ČSLA. Podotýkám, že v některých momentech jsem intro zjednodušil, také proto, abych příliš neprozradil, o co v kampani půjde. Zdrojáky k intru si můžete stánout na konci tutoriálu (pro přehrání musíte mít verzi hry alespoň 1.30).

Ač se možná zdá zdroják na první pohled složitý, není tomu tak. Když to zjednoduším, stačí si na začátek intra vytvořit kameru, s tou si trochu pohrát a nakonec jí zase zničit. Navíc hru s kamerou lze (víceméně) omezit jen na několik příkazů - CamSetPos, CamSetTarget, CamSetFov, CamCommit a CamCommitted. Když pochopíte přesně jejich funkci a naučíte se je společně používat, máte skoro vyhráno.

Ač si to mnoho lidí neuvědomuje, nejdůležitějším předpokladem pro tvorbu pěkných inter jsou "režisérské" schopnosti autora. Co je platné, že někdo ovládá práci s kamerou, když ji nedokáže náležitě využít. Tato schopnost se bohužel příliš naučit nedá, ale když popustíte uzdu své fantazie, jistě naněco přijdete.

Nyní už přímo k našemu intru. Pro začátek nastíním situaci a příběh. Na jednom menším ostrůvku u Everonu je americká základna, na které je několik nepodstatných objektů - vozidla, hlídka u tábora, několik helipadů s vrtulníky, pár bunkrů, vlajka, oheň a pár dalších. Z těch pro nás důležitých je to vrtulník Chinook (nazval jsem si ho chin1) a skupina vojáků, kterým velí voják označený jako usvelitel. Kus od tábora (někde, aby nebyl zpočátku vidět) je americký důstojník (amik1) a kousek od něj vozidlo Hummer (hmw). Děj bude následující. Důstojník přijede vozidlem na základnu, vystoupí a sdělí pokyny usvelitelovi. Ten pak se svým týmem nastoupí do Chinooku a odletí ze základny do akce.

Základní údaje již víte a můžeme tedy přistoupit přímo ke komentovanému zdrojáku intra.

Rozbor zdrojového scriptu
V první řadě si pro jistotu nastavíme všechny podmínky, které později využijeme, na hodnotu false, což znamená, že se nevykonávají.

letim1=false
nastup=false
vystup=false
salute=false
gotochin=false
inchin=false
konec=false

Příkazem skiptime přesouváme čas v misi o 2 hodiny později. Středník před příkazem ale znamená, že se příkaz nevykoná. To proto, že v tomto ukázkovém intru nic předtím nebylo, takže je to zbytečné. Ale v rámci celého intra pro kampaň to důležité je. Příkazy TitleCut a TitleText byste již měli znát....

;skiptime 2
titleCut ["","BLACK IN",6]
titletext [" ... o 2 hodiny později ...","PLAIN DOWN",6]

Nyní je třeba založit kameru pro naše účely. Pro její pozici si beru souřadnice od objektu nazvaného h3, což je v mém případě neviditelný H (helipad). Výhoda oproti zadávání souřadnic číselně je ta, že při ladění intra stačí s h3 na mapě pouze hýbat podle představy, což ulehčuje práci. Použití neviditilného H pro získání souřadnic používám často, protože to má své výhody - objekt není vidět, ale přitom vrací v poli souřadnic všechny hodnoty (x, y, z). Často se objevuje v praxi to, že se na mapu dá marker a souřadnice se pak získávají příkazem GetMarkerPos. Ten však vrací pouze hodnoty x a y, takže na to pozor. Ale tím nechci říci, že jde o špatný postup. Já jsem si jen zvykl na neviditelné H. Velmi častá chyba je, že se souřadnice pro kamery přejímají beze změny. Jenže většina objektů má souřadnice z = 0 nebo jen velmi málo, takže kamera je pak nastavena ze země nebo z minimální výšky. Když k z souřadnici přičtete nějaké ty metry, získáte tím podstatně větší přehled na mapě a vypadá to lépe.

_CameraPos = getpos h3
_cmx = (_CameraPos select 0)
_cmy = (_CameraPos select 1)
_cmz = (_CameraPos select 2) + 35
_cam = "camera" CamCreate [_cmx,_cmy,_cmz]
_cam CameraEffect ["Internal","back"]

Příkazem CamCommit aplikujeme všechny neprovedené předešlé změny pro kameru, číselná hodnota určuje, za jak dlouho se tak stane. Hodnota 0 znamená, že okamžitě, při konkrétních hodnotách dochází k přechodu mezi kamerovými změnami. První použití tohoto příkazu nám aplikuje vznik kamery. Ihned poté příkazem CamSetTarget zaměříme kameru na oheň (je pojmenovaný fire2) na základně a příkazem CamSetFov nastavíme úroveň přiblížení na něj. Defaultní hodnota je tuším 0.7, takže hodnotou 0.6 si ho trochu přiblížíme.Až doposud se ale tyto příkazy neprojevily, protože se tak stane až po příkazu CamCommit! V tomto případě (s hodnotou 4 sekundy) se po jeho vykonání stane to, že kamera přejde plynule během 4 vteřin na cíl fire2 a trochu ho přiblíží. Poslední příkaz @CamCommitted je příkaz, jehož význam si mnoho lidí vůbec neuvědomuje. Způsobuje to, že se další příkazy začnou vykonávat až poté, co kamera vykoná požadované věci. Je dobré ho používat právě po příkazu CamCommit. Více nad tímto příkazem raději nepřemýšlejte, ale takto ho používejte často. Zkazit tím nic nemůžete.

_cam CamCommit 0
_cam CamSetTarget fire2
_cam CamSetFov 0.6
_cam CamCommit 4
@camCommitted _cam

Teď změníme hodnotu podmínky nastup na true, čímž se spustí akce, která je touto podmínkou podmíněna. V tomto případě je to podmínka ve waypointu vojaka amik1 pro nástup do Hummeru.

nastup=true

Následující 4 vteřiny se nic neděje a pak se na obrazovce pomalu (během 5 vteřin, viz poslední hodnota) objevuje nápis. Pak nastavíme cíl pro kameru na americkou vlajku v táboře a nastavíme přiblížení na hodnotu 0.18 (což je teď relativně velké přiblížení). Příkazem CamCommit tyto příkazy aplikujeme - v praxi to vypadá tak, že se cíl kamery mění za tu dobu z ohně na vlajku a zároveň si jí přibližuje.

~4
titletext ["Americká základna,\n ostrov východně od Everonu","PLAIN DOWN",5]
_cam CamSetTarget vlajkaus
_cam CamSetFov 0.18
_cam CamCommit 4
@camCommitted _cam

Chvilku posečkáme a pak podobným postupem změníme cíl na Chinook chin1 s tím, že se pohled zase naopak trochu oddálil.

~2
_cam CamSetTarget chin1
_cam CamSetFov 0.45
_cam CamCommit 2
@camCommitted _cam

Po chvilce pohled ještě více oddálíme a příkazem TitleText bez textu docílíme toho, že nám předčasně zmizí z obrazovky nápis.

~3
_cam CamSetFov 0.55
_cam CamCommit 4
@camCommitted _cam
titletext ["","PLAIN DOWN",5]

Nyní se kamera natočí k přijíždějícímu Hummeru (hmw) s vojákem amik1. Po chvilce si pak vozidlo přiblíží na hodnotu 0.15.

_cam CamSetTarget hmw
_cam CamCommit 2
~3
_cam CamSetFov 0.15
_cam CamCommit 3
@camCommitted _cam

Podmínka vystup je nastavena na waypointu vojáka amik1, kam má dojet vozidlem (při aktivaci - vystup = true). V momentě, kdy se tak stane, nabývá podmínka hodnotu true a tím se aktivuje. Příkazem @vystup si zajistíme, že se vykonávání scriptu pozastaví právě do okamžiku, než nabude vystup hodnoty true.

@vystup

Po vystoupení vojáka z vozidla se kamera přepne něj a ještě více si ho přiblíží...

_cam CamSetTarget amik1
_cam CamSetFov 0.1
_cam CamCommit 4
@camCommitted _cam

Vedoucí skupinky vojáků v táboře usvelitel a amik1, který právě přijel autem, dojdou díky waypointům téměř k sobě. Během toho je vhodné příkazem DoWatch nastavit, aby se po sobě vojáci dívali.

usvelitel DoWatch amik1
amik1 DoWatch usvelitel

S dalšími akcemi počkáme až do okamžiku, kdy bude mít proměnná salute hodnotu true. To se stává podobně jako předtím v momentě, kdy amik1 dojde na další waypoint.

@salute

Nyní si přesuneme kameru jinam (příkazem CamSetPos). Zjistíme si souřadnice vojáka amik1 a kameru umístíme trochu za něj a nad něj tak, abychom viděli na usvelitele a jeho tým.

_CameraPos = GetPos amik1
_cmx = (_CameraPos select 0) + 6
_cmy = (_CameraPos select 1) - 6
_cmz = (_CameraPos select 2) + 4
_cam CamSetPos [_cmx,_cmy,_cmz]
_cam CamSetTarget usvelitel
_cam CamSetFov 0.4
_cam CamCommit 3
@camCommitted _cam

V tomto okamžiku následuje rozhovor obou vojáků. Pro účely tohoto tutoriálu ale omezíme jejich konverzaci na pár gest. Více o gestech jsme psali v minulém tutoriálu.

~1
usvelitel switchmove "EffectStandSalute"
~1
usvelitel switchmove "FXStandAtt"
amik1 switchmove "EffectStandSalute"
~5
usvelitel switchmove "FxStandStill"
~10

Podmínka gotochin je pro nástup týmu vojáků vedeného usvelitelem do vrtulníku Chinook. Změnou na hodnotu true se tento tým jde naložit do vrtulníku. Amik1 stojí a dívá se za nimi.

gotochin=true
amik1 DoWatch usvelitel

Opět plynule změníme polohu kamery za vrtulník tak, abychom viděli přesun a nástup týmu vojáků do něj. Pohled trvá až do okamžiku, kdy jsou všichni vojáci naloženi (waypoint - při aktivaci - inchin = true).

~5
_CameraPos = GetPos chin1
_cmx = (_CameraPos select 0) + 50
_cmy = (_CameraPos select 1) + 50
_cmz = (_CameraPos select 2) + 20
_cam CamSetPos [_cmx,_cmy,_cmz]
_cam CamCommit 3
~5
_cam CamSetTarget usvelitel
_cam CamSetFov 0.35
_cam CamCommit 3
@camCommitted _cam

@inchin

Nyní dáme pokyn vrtulníku, aby někam odletěl. V originální verzi to mám udělané přes waypointy, ale protože tam mám další vazby, bude nám teď stačit, když se vrtulník začne přesouvat na pozici objektu h4 (opět neviditelný H) příkazem DoMove.

chin1 DoMove GetPos h4

Vrtulník startuje a my přesuneme kameru plynule za amika1 tak, abychom viděli start vrtulníku. Amik1 se při tom kouká na odlétající vrtulník.

~2
_CameraPos = GetPos amik1
_cmx = (_CameraPos select 0) - 20
_cmy = (_CameraPos select 1) + -5
_cmz = (_CameraPos select 2) + 2
_cam CamSetPos [_cmx,_cmy,_cmz]
_cam CamSetTarget chin1
_cam CamSetFov 0.3
_cam CamCommit 4
@camCommitted _cam
amik1 DoWatch chin1

Těsně pod odlepení vrtulníku od země zaměříme cíl kamery opět na amika1, který jim k odletu zasalutuje. Pak se kamera přepne zpět na odlétávající vrtulník.

~8
_cam CamSetTarget amik1
_cam CamSetFov 0.2
_cam CamCommit 2
@camCommitted _cam
~2
amik1 switchmove "EffectStandSalute"
~3
_cam CamSetTarget chin1
_cam CamSetFov 0.5
_cam CamCommit 3
@camCommitted _cam

Nyní následuje smyčka příkazů. Během ní se vždy nastaví poloha kamery kousek za vrtulník, přičemž kamera míří pohledem na amik1. Smyčka se bude opakovat, dokud hodnota letim1 nenabyde hodnoty true. To se stane poté, co vrtulník aktivuje spínač na své cestě (při aktivaci - letim1 = true). Tím se docílí efektu, kdy vidíte vzdalující se základnu (jakoby) z vrtulníku. Ještě bych chtěl podotknout, že jméno podmínky nemusí být vůbec shodné s návěštím (#). Spíš by tomu mělo být naopak, aby se to nepletlo. Já jsem si na to ale zvykl a vyznám se v tom.

#letim1
_CameraPos = GetPos chin1
_cmx = (_CameraPos select 0) + 5
_cmy = (_CameraPos select 1) + 45
_cmz = (_CameraPos select 2) + 10
_cam CamSetPos [_cmx,_cmy,_cmz]
_cam CamSetTarget amik1
_cam CamCommit 0
~0.01
? NOT (letim1) : goto "letim1"

V momentě, kdy se sepne první spínač, se kamera zastaví a plynule přejde pohledem na stále se vzdalující vrtulník a po nějakou dobu se za ním dívá.

_cam CamSetTarget chin1
_cam CamCommit 4
@camCommitted _cam
~10

Tím můžeme intro ukončit, přičemž je důležité zničit po sobě kameru.

_cam CameraEffect ["Terminate","Back"]
CamDestroy _cam

Misi ukončíme nastavením proměnné konec na true. Tím se nám aktivuje spínač, který má nastaven typ Konec č.1 a jako podmínku má konec.

konec = true

exit

Závěr
Doufám, že jste vše pochopili, pokud ne, směřujte dotazy do diskusí.

Na závěr vám jako vždy dávám k dispozici zdrojáky této mise, tady jsou:

Stáhnout zdrojovou misi Int2 (vyžaduje verzi hry minimálně 1.30) můžete z http://games.worldonline.cz/flashpoint/tutorials/ofptutorial19/int2.eden.zip


Tutorial 20
Autor : Deepx & Leon

Deepx nám poslal návod (za což mu děkuji), jak vytvořit funkční dynamický waypoint. Protože si myslím, že by to mohlo zajímat i vás, otiskuji ho prakticky v nezměněné formě. Jen jsem si dovolil mezi řádky vložit některé své komentáře (kurzívou) a na konce přidat několik faktů o nových souvisejících příkazech přímo ve hře.

Dynamický waypoint
Nejprve o co vlastně jde: řešil jsem situaci, kdy v misi potřebuji dynamickou změnu WP, čili směřuji k WP 1, teď se stane jakoby neočekávaná akce (např. jiná jednotka kousek poblíž potřebuje naléhavě vaši pomoc) a už se vám ukazuje WP 2, kde po jeho aktivaci či splnění znovu směřuji zpátky k WP 1.

Jak tuto situaci tedy řešit - pomocí skriptovaného WP. Tato funkce není prakticky nikde na internetu popsaná, k výsledku jsem se dopracoval zkoušením. Pro snažší pochopení jsem vytvořil ukázkovou misi, odkaz ke stažení níže. Vytvoříme tedy jednotku, kterou ovládáte:

[strana] západ
[třída] men
[inicializace] prepniWP=false
(jednotka může být v podstatě jakákoliv, důležité je však pole inicializace)

Pozn. Leon: Protože údaje v inicializačním poli nemají se samotnou jednotkou nic přímo společného, bylo by asi přehlednější zadat podmínku prepniWP=false přímo na začátek níže uváděného scriptu (viz další poznámka).

Na ní navážeme následující waypointy:

WP 0
[typ] skriptovaný WP
[popis] cíl cesty
[podmínka] true
[skript] wp_skript.sqs

WP 1
[typ] přesun
[popis] Bravo potřebuje tvoji pomoc
[podmínka] true

WP 2
[typ] přesun
[popis] cíl cesty
[podmínka] true

Dále na cestě k WP 0 vytvoříme spínač:

[osa A,B] 20
[aktivace] kdokoli
[podmínka] this
[při aktivaci] prepniWP=true

Nakonec to nejdůležitější, vytvoříme skript, který obsluhuje WP 0:

#loop
~0.1
? NOT(prepniWP) : goto "loop"
exit

Tento skript uložíme pod názvem "wp_skript.sqs" do adresáře s misí.

Pozn. Leon: Prehledněji a jednodušeji by šlo script zapsat takto:

prepniWP=false
@prepniWP
exit

Předpokládám že již z toho co jsem napsal lze pochopit princim skriptovaných WP, ale přesto to ještě vysvětlím. Skriptovaný WP zůstává aktivní dokud běží obsluhující skript. Aktivací spínače tedy ukončíme smyčku ve skriptu a tím ukončíme skript, WP tedy přestane být aktivní a přepne se na další. Obsluhující skript může samozřejmě kontrolovat cokoliv, např. počet našich vojáků v oblasti, tento příklad je asi nejjednodušší použití skriptovaného WP.

Zde popisovanou misi si můžete stáhnout k vyzkoušení z http://games.worldonline.cz/flashpoint/tutorials/ofptutorial20/prepnuti_WP.Intro.zip

Kontakt na Deepx

Nové příkazy přímo ve hře
Zmiňovaný problém o dynamické změně waypointů by šel patrně vyřešit i jinak. Teď nechci rozebírat, jakým způsobem, ale náhodou jsem narazil na dva nové příkazy pro hru, které s umístěním waypointů úzce souvisí. Jde o příkazy SetWPPos a GetWPPos, z nichž první nastavuje polohu waypointu, zatímco druhý ji zjišťuje. Je nutné upozornit, že oba příkazy fungují až od verze hry 1.21, což značí nejméně českou verzi 1.30.

Příkaz SetWPPos má následující základní definici:

waypoint setWPPos position

Zadávání waypointů se dělá do hranatých závorek, ve kterých je první parametr jednotka, pro kterou je waypoint nastavován, druhý parametr je pak pořadí waypointu. Nastavení polohy waypointu pak může vypadat třeba takhle:

[groupOne, 1] setWPPos getMarkerPos "MarkerOne"

Tím nastavíme polohu waypointu na místo markeru označeného MarkerOne.

Příkaz GetWPPos dělá přesně opačnou věc, tedy zjišťuje pozici waypointu.

getWPPos waypoint

Použití pak vypadá asi takto:

getWPPos [groupOne, 1]

Příkaz vrací pole dvou hodnot x a y, které udávají polohu waypointu na mapě. Funguje tedy podobně, jako příkaz GetMarkerPos.

V praxi se dá dobře použít především příkaz SetWPPos, kterým se dá měnit poloha waypointu a tím docílit zajímavých efektů v hratelnosti. Konkrétně odzkoušené to zatím nemám - jde o nové příkazy a co to vím, nepotřeboval jsem to.

Závěr
Doufám, že jste vše pochopili, pokud ne, směřujte dotazy do diskusí.

Pokud máte nějaký podobný zajímavý postup na cokoliv týkající se editace misí, budeme rádi, když nám to pošlete a podělíte se tak o poznatky s ostatními.


Tutorial 21
Autor : MAA

Dlouho jste nás žádali o sepsání tutoriálu na téma tvorba a modifikace addonů pro Flashpoint. Ihned po dokončení našeho ČSLA addonu jsme si řekli, že získané informace si nenecháme pro sebe a podělíme se o ně. Maa tedy zasedl a sepsal celý obsáhlý materiál na toto téma. Protože jde o téma velmi rozsáhlé a dost složité, rozhodli jsme se vše rozdělit na několik tutoriálu a předkládat vám vše postupně tak, abyste měli čas to pochopit.

Obsah

1. ÚVOD
2. ČO BUDEME POTREBOVAŤ
3. POTREBNÉ SUBORY
4. ČO OBSAHUJE ADDON
5. PRÍPRAVA ADDONU
6. MODEL
7. PRÁCA S TEXTÚRAMI
8. PRÁCA SO ZVUKMI
9. CONFIG
10. STRINGTABLE
11. FINALIZÁCIA A PREVOD DO PBO
12. ZÁVER
13. ADDON - ZBRAŇ
14. ADDON - VOZIDLO
15. ADDON - VOJAK
16. GROUPS
17. DOPLNKOVÉ INFO A DOWNLOAD UKÁŽKOVÝCH ADDONOV

1. Úvod
V tomto tutoriále si vysvetlíme, ako sa dajú vytvárať addony do OFP. Tutoriál bude rozdelený na viacej častí. Základnú teoretickú časť vám vysvetlím ja a potom budú následovať praktické návody, pri ktorých si vysvetlíme, ako postupovať pri vytváraní konkrétneho addonu (zbraň, vozidlo, vojak,...). Tieto praktické návody budeme písať ja (MAA) a môj kolega a kamarát Partisan.

Addon je doplnok (jednotka, zbraň, vozidlo, objekt,..), ktorý je dodatočne doplnený do hry, pre zvýšenie jej hrateľnosti.

Hneď na začiatku vám ale musím pripomenúť, že je zatiaľ možné IBA upravovať jednotky a objekty použité v pôvodnej hre. Až do vydania SDK totiž nieje možné importovať do hry žiadne nové jednotky a objekty. Aj keď sa už objavili prvé pokusy (A-Lone-Wolfov p3d2obj) o sprístupnenie možnosti modifikovania modelov z hry hráčskej komunite, ich prevod naspäť do formátu P3D zatiaľ nieje možný :(
Prvé ako-tak úspešné pokusy o drobné zmeny na jednoduchých modeloch boli manuálne urobené pomocou HEX-a editacie.

Ďalej vás chcem upozorniť, že úprava textúr (hlavne pri zložitých objektoch) nieje jednoduchá a bez znalostí MINIMÁLNE základov počítačovej grafiky sa ďaleko nedostanete. Preto ak tieto znalosti nemáte a aj tak sa chcete pustiť do editovania textúr, tak si svoje schopnosti najskôr vyskúšajte na jednoduchších objektoch. Pri zložitejších objektoch radšej doporučujem nováčikom v grafike, aby sa spojili do teamu s niekym, kto toto ovláda. Podobne to rieši viacej známych zahraničných autorov (najznámejší sú asi JellyBelly a TigerShark /TJP/), kde jeden upravuje textúry a druhý config a ostatné veci.

V tomto tutoriáli prepokladáme aspoň základné znalosti počítačovej grafiky, takže jej nebudeme venovať väčšiu pozornosť.

Ďaľšou vecou, na ktorú by som vás rád upozornil je, že v poslednom čase sa stále viacej rozširuje hyenizmus aj v OFP komunite. Preto vás prosím, ak chcete použiť niektoré veci (textúry, configy,...) od iných autorov, je vecou slušnosti, vypýtať si od tohto autora súhlas na ich použitie a uviesť jeho meno do credits readme súboru vášho addonu. Ak neovládate angličtinu na vypýtanie si súhlasu od zahraničného autora, tak ho aspoň uveďte v credits. Váš addon tým určite nestratí na kvalite ani atraktívnosti a zároveň oceníte jeho prácu, ktorej určite venoval dosť svojho času. Každý autor si svoje textúry, configy,... aj tak spozná podľa špecifických znakov, tak zápisom do credits predídete naskorším problémom a hanbe.

Toľko na úvod a teraz už niečo konkrétnejšíe k vytváraniu addonov.

2. Co budeme potřebovat
K vytvoreniu vlastného addonu budete potrebovať nasledovné nástroje, v podobe utilitiek (nájdete ich na http://games.tiscali.cz/flashpoint/download.asp) a programov:

1. DePBO - táto utilitka slúži na rozpakovanie súborov *.PBO
2. Unpack-SQM - touto utilitkou si zase rozpakujeme súbory *.P3D do editovateľnej formy
3. TexView - táto utilitka slúži na prevod textúr z *.PAA *.PAC to *.TGA a naopak
4. P3D Swap Texture Utility - touto utilitkou si definujeme, ktoré textúry sa použijú na model
5. StuffPBO - touto utilitkou si prevedieme náš addon do formátu *.PBO
6. grafický editor s podporou Alpha kanálov (PhotoShop, PhotoPaint,...)
7. dekódovaný config hry OFP (od A-Lone-Wolfa)

3. Potřebné soubory
Teraz si objasníme, ako je to vlastne so súbormi potrebných pri tvorbe addonu.

V adresári, kde máme hru nainštalovanú, vyhľadáme a otvoríme podadresár Dta. Nájdeme v ňom množstvo súborov, z ktorých nás zaujímajú najmä tieto:

Data.PBO - v tomto súbore sa nachádzajú všetky textúry použité v originál hre. Môžu byť vo formáte .PAA alebo .PAC.

Data3D.PBO - v tomto súbore nájdeme všetky modely (objektov, jednotiek, zbrani,...) použité v originál hre. Tieto modely sú v súboroch s príponou .P3D. V týchto súboroch sú obsiahnuté informácie o vlastnostiach modelu,.... ale hlave čo nás zaujíma je, že sú tam informácie o tom, aké textúry (zo súboru Data.pbo) sa budú na týchto modeloch používať.

DtaExt.PBO - tu sa nachádzajú pre nás zaujímavé textúry pre "Výstroj" ("Equipment" v anglickej verzii), ktoré sa používajú pri definovaní zbraní. Tieto súbory sú tiež vo formáte .PAA a .PAC.

Sound.PBO - tu sa nachádzajú všetky možné i nemožné zvuky. Zatiaľ nás veľmi nezaujímajú, len pre úplnosť spomeniem, že hra podporuje pomerne nepopulárny zvukový formát .OGG. Pri tvorení addonov môžeme použiť aj formáty .WSS a .WAV.

Význam týchto súborov lepšie pochopíte asi až pri konkrétnej práci s nimi.

4. Co obsahuje addon
Súbor addonu väčšinou obsahuje tieto veci:

model(y) - súbor(y) s príponou P3D
textúry - súbory s priponami PAC a PAA (v krajnom prípade sa dajú použiť aj súbory JPG)
konfiguračný súbor CONFIG.CPP
zvuky - súbory s príponami OGG a WSS, WAV
súbor názvov - stringtable.csv

Čo bude addon obsahovať záleži na tom, čo budete konkrétne modifikovať, ale vždy MUSÍ obsahovať súbor config.cpp. Napríklad ak iba premenovávate niektorú jednotku, stači použiť v addone iba konfiguračný súbor.

5. Příprava addonu
Najskôr si vytvoríme adresár, kde budeme addon vytvárať. Treba ho pomenovať tak, ako by mal byť pomenovaný váš addon.

Tu by som chcel hneď upozorniť na VEĽMI dôležitú vec. Pri pomenovávaní všetkých častí vášho addonu vám doporučujem dodržiavať určité pravidlá !
Najlepšie je pomenovať všetky vaše addony, triedy,.. a aj samotné jednotky tak, aby boli nezameniteľné s inými jednotkami, modelmi, triedami, ... a v žiadnom prípade nepoužívať pri ničom (okrem názvov v stringtable.csv) diakritiku !
Doporučujem najskôr použiť aspoň časť (prvé 3-4 písmená) svojho nicku (prezývky) alebo mena a až potom dáť názov samotného addonu, modelu, triedy,... . Vyhnete sa tak konfliktom s inými addonmi alebo originálnymi jednotkami alebo dokonca zdvojeniu definícií v configu hry, ktoré spôsobujú nestabilitu celej hry.
Ja používam k identifikácii svojich addonov názvy začínajúce "MAA_".
Pár informácií o týchto problémoch sme priniesli v našich januárových novinkách.

Adresár addonu sme si teda pomenovali a môžeme pokračovať ďalej.
Rozpakujeme si súbory Data3D.pbo, Data.pbo, DtaExt.pbo a Sound.pbo (stači iba tie, ktoré budeme potrebovať) do nejakého dočasného adresára (upozorňujem, že to zaberie dosť miesta na disku !!). Ak ideme modifikovať nejaký už hotový addon, tak stačí iba tento addon rozpakovať do dočasného adresára !
Na rozpakovanie súborov použijeme, tak ako aj pri rozpakovávaní misií (o tom sme písali v tomto tutoriále) utilitku DePBO.

Postup pri rozpakovávaní súborov PBO:
Spustite si utilitku DePBO. V hornej časti máte dve políčka. Úplne hore je ".PBO File" [Súbor PBO] a pod tým "Save Directory" [Adresár pre uloženie]. Pri každom políčku máte tlačítko "Browse" [Nalistovať].
Tlačítkom "Browse" pri políčku ".PBO File" si nalistujeme súbor addonu, ktorý chceme rozpakovať a pri "Save Directory" si nalistujeme adresár, kde chceme addon rozpakovať.
Potom stlačte tlačítko "Extract Files" [Rozpakovať súbory] v spodnej časti okna. V strednom okne by sa vám mali vypísať súbory, ktoré boli rozpakované. Ak vám vypíše nejakú chybovú hlášku, buď robíte niečo zle alebo je súbor poškodený,… Je viacero možných dôvodov. Ak narazíte na nejaké problémy, tak nám napíšte do diskusie.

Takýmto spôsobom si rozpakujeme všetky potrebné PBO súbory.

6. Model
Teraz si do adresára nášho addonu nakopírujeme model jednotky, ktorý chceme použiť. Ak sme použili originál model (zo súboru Data3D.pbo alebo zo súboru niektorého oficiálneho addonu), tak si musíme ešte aj tento model zvlášť rozpakovať, podobne ako pri misiách. Na to nám poslúži utilitka Unpack-SQM.

Postup pri rozpakovávaní súborov P3D:
Súbor "unpack-sqm.exe"si nakopírujte do adresára vášho addonu. Potom si súbor modelu premenujte na "mission.sqm" a spustite utilitku unpack-sqm. Po pár sekundách by sa malo DOSové okno programu zavrieť a v adresári by mal byť vytvorený súbor "mission.txt". Tento si premenujte podľa potreby s príponou P3D. Pôvodný súbor modelu si môžete odložíť do zálohy alebo zmazať.

7. Práce s texturami
Teraz si spustíme utilitku P3D Swap Texture Utility.
V hornom menu pôjdeme cez ponuku File > Open.P3D a nalistujeme si súbor nášho modelu. Keď sa súbor načita (môže to trvať pár sekúnd až minút, podľa množstva textúr), objaví sa v okne programu zoznam všetkých textúr použitých na tomto modeli. Už podľa názvu sa dá pri niektorých textúrach určiť na čo slúžia (vonkajšie textúry, interiér,...). Teraz je vhodné si všetky tieto textúry vytiahnuť z dočasného adresára, kde sme si rozpakovali súbor Data.pbo a nakopírovať si ich do pracovného adresára. Ja si vždy kvôli prehľadnosti vytvorím niekde adresár s názvom Working_NázovJednotky a v tomto potom pracujem s textúrami. Finálne verzie textúr potom nakopirujem do adresára addonu.
Teraz si spustíme utilitku TexView. Postupne si načítame všetky textúry, prezrieme si ich a vytriedime si tie, ktoré chceme upravovať. (Kvôli rýchlosti je vhodné si zadefinovať v nastaveniach Windows priamo otváranie súborov s príponami *.pac a *.paa utilikou TexView.) Textúry, ktoré budeme editovať, si pomocou voľby "Save As" v menu a pridaním prípony TGA k názvu súboru, uložíme do editovateľného formátu TGA. Kvôli prehľadnosti doporučujem pri ukladaní vložiť medzi názov súboru a príponu TGA aj pôvodnú príponu súboru, aby sme predišli problémom pri spätnom prevode do formátov PAC a PAA, lebo ako asi viete medzi týmito dvoma formátmi je zásadný rozdiel. Súbory s príponou PAA, totiž obsahujú navyše aj informáciu o Alpha kanáloch.
Takže názvy textúr budú vizerať asi takto "g2_hrud_p_pac.tga".
Nepotrebné textúry si premiestnime do iného adresára, alebo ak sme si istý, že ich už naozaj nebudeme potrebovať, tak ich zmažeme.

Teraz nasleduje samotná editácia textúr. Tej sa v tomto tutoriáli venovať nebudeme.

Ďalším krokom je prevod modifikovaných textúr naspäť do pôvodných formátov PAC a PAA. Postupne si načítame modifikované textúry TGA do TexView a pomocou "Save As" si ich uložíme do pôvodných formátov. Tu nám príde vhod to vloženie pôvodnej prípony do názvu ;)

Modifikované textúry (už v PAC a PAA) si nakopírujeme do adresára addonu. Keď to chcete mať prehľadnejšie a robíte do addonu viac jednotiek, tak doporučujem si pre každú jednotku vytvoriť zvlášť podadresár na textúry.

Teraz nasleduje výmena textúr na modeli za naše upravené.

Postup pri výmene textúr:
Znova si spustíme P3D Texture Swap Utility a načítame si náš model. V okienku "Texture Folder" si zadáme CELÚ cestu (vrátane názvu addonu) k textúram modelu iba MALÝMI PÍSMENAMI. (napríklad: "maa_t72\textury\"). Potom si postupne kliknutím na textúru v okne programu (jej názov sa potom zobrazí v poli "Default File") a nalistovaním modifikovanej textúry (nalistovaním v poli "Replacement") nahradíme všetky potrebné textúry.
Potom si dáme uložiť model pod nový názov (kvôli prípadným /a častým/ problémom pri ukladaní). Keď nám prebehlo ukladanie v poriadku (zobrazilo sa "File Saved"), tak si pre istotu skúsime novouložený model načítať. Po jeho načítaní by sme mali vidieť už nové cesty k textúram. Keď je všetko v poriadku, môžeme pôvodný model zmazať. Ak sa vyskytli nejaké problémy, popíšte nám ich podrobne do diskusie.

8. Práce se zvukami
Ako si vytvoriť vlastné zvuky pre addon, si môžete pozrieť v tutoriále o pridávaní zvukov. Použitie zvukov si vysvetlíme v praktických tutoriáloch na vytvorenie jednotlivých addonov..

Závěr
Pro dnešek je to zatím vše, v pondělí budeme pokračovat. Zatím si pořádně nastudujte dosavadní informace, protože to horší a mnohem složitější teprve přijde.

Doufám, že jste vše pochopili, pokud ne, směřujte dotazy do diskusí.


Tutorial 22
Autor : MAA

1. část tutoriálu o addonu

Config
Teraz sa pozrieme na najdôležitejšiu časť každého addonu. Tou je súbor s názvom "Config.cpp". V tomto súbore sa nachádzajú všetky dôležité údaje a nastavenia jednotky alebo jednotiek obsiahnutých v addone, bez ktorých by žiaden addon nefungoval.
Nastavenia definujeme pomocou takzvaných tried (class), čo je vlastne súhrn vlastností. Tieto triedy sa dajú navzájom odvodzovať. To znamená, že ak vytvárame novú triedu, ktorá sa podobá na nejakú už existujúcu triedu, tak stačí túto novú triedu od existujúcej odvodiť. V novej triede potom iba zmeníme niektoré požadované vlastnosti.
Ak si definujeme celú vlastnú novú triedu, tak ju odvodzujme z nadradenej triedy All pri jednotkách a z triedy Default pri munícii a zbraniach.

*************

Príklad odvodenia triedy:

 class
          Default {};
class MGun: Default {};
class Riffle: MGun {};
class NovaZbran : Riffle
{
displayName = "$STR_MAA_NovaZbran";
};

Trieda Riffle je odvodená z triedy MGun. Trieda MGun je zase odvodená z nadradenej triedy Default. My sme si našu triedu odvodili od triedy Riffle (takže preberieme jej vlastnosti) a zmenili sme si iba jej názov. Viacej to asi pochopíte pri praktických tutoriáloch.
**********

Pri vytváraní addonu sa nezaobidete bez decryptovaných konfigov jednotlivých verzií OFP. Nájdete v nich definície všetkých predmetov, jednotiek,... v OFP. Za tieto konfigy patrí vďaka A-Lone-Wolfovi, ktorý ich pre nás (tvorcov addonov) decryptoval. Díki ;)

Základná štruktúra súboru Config.cpp

//*************************************//

// nazov addonu, autor, verzia addonu,...

#define
          TEast 0
#define TWest 1
#define TGuerrila 2
#define TCivilian 3
#define TSideUnknown 4
#define TEnemy 5
#define TFriendly 6
#define TLogic 7

#define true 1
#define false 0

#define private 0
#define protected 1
#define public 2

#define
          WeaponNoSlot 0// dummy weapons
#define WeaponSlotPrimary 1// primary weapons
#define WeaponSlotSecondary 16// secondary weapons
#define WeaponSlotItem 256// items
#define WeaponSlotBinocular 4096// binocular
#define WeaponHardMounted 65536// mounted weapons

class CfgPatches{};

class CfgAmmo{};

class CfgWeapons{};

class CfgVehicles{};

class CfgGroups{};

class CfgFaces{};

class CfgNonAIVehicles{};

//*******************************************//

Toto bola základná štruktúra configu addonu. V každom config.cpp musí byť uvedená časť začínajúca znakmi "#". Rozpísanie jednotlivých tried závisí už na konkrétnom addone.
Pri písaní config.cpp sa používajú určité pravidlá. Napríklad: poznámky oddeľujeme znakmi "//", jednotlivé parametre oddeľujeme bodkočiarkou [středníkem] ";", parametre tried zapisujeme do zátvoriek "{ };".........

Význam jednotlivých tried si hneď vysvetlíme.

CfgPatches

V tejto triede si definujeme všetky jednotky (zbrane, vozidla, vojakov,...), ktoré bude addon obsahovať.

Nezabudnite pri definovaní názvov jednotlivých jednotiek addonu dodržiavať zásady pomenovávania, ktoré som vám vysvetlil v úvode tutoriálu.

Štruktúra definície zbrane:
******************************

class NazovZbrane {units[]={}; weapons[]={NazovZbrane}; requiredVersion = 1.30;};

****************************

Legenda:
NazovZbrane - je názov zbrane, pod akým ju chceme zadefinovať vo svojom addone. (Nemusí sa zhodovať s názvom v menu editora pri výbere jednotiek, ten sa definuje v súbore stringtable.csv)
RequiredVersion - tu je uvedená minimálna požadovaná verzia hry. Treba si dať na toto pozor hlavne ak definujete svoje jednotky na nejaké jednotky z oficiálnych upgradov. Pre istotu doporučujem uviesť verziu, na ktorej je váš addon vytváraný.

Štruktúra definície jednotky:
*******************************

class NazovJednotky{units[] = {NazovJednotky}; weapons[] = {}; requiredVersion = 1.30;};

********************************

Legenda:
NazovJednotky - je názov vojaka, vozidla,... pod akým chceme jednotku zadefinovať vo svojom addone. (Nemusí sa zhodovať s názvom v menu editora pri výbere jednotiek, ten sa definuje v súbore stringtable.csv)
RequiredVersion - tu je uvedená minimálna požadovaná verzia hry. Treba si dať na toto pozor hlavne ak definujete svoje jednotky na nejaké jednotky z oficiálnych upgradov. Pre istotu doporučujem uviesť verziu, na ktorej je váš addon vytváraný.

CfgAmmo

V tejto triede si definujeme charakteristiku pre muníciu zbraní. Definujeme si tu parametre ako: silu zásahu, zvuk zásahu, farebné stopy nábojov (tracers), minimálny a maximálny dosah,...

Štruktúra definície munície:
********************************

class NazovAmmo: VychodziaTrieda{hit=12; indirectHit=2; indirectHitRange=0.1;};

********************************

Legenda:
NazovAmmo - je názov munície,... pod akým ju chceme zadefinovať
VychodziaTrieda - je názov triedy z ktorej vycházdame pri definícii. Keď definujeme svoju samostatnú triedu, tak vycházdame s nadradenej triedy "Default{};"
Hit - je nastavenie sily pre priamy zásah definovanou muníciou
IndirectHit - je nastavenie účinku nepriameho zásahu do vzdialenosti nastavenej v indirectHitRange

Niektoré s jednotlivých možností pri nastavovaní tejto triedy si ukážeme názorne v praktickom tutoriále.

CfgWeapons

V tejto triede si definujeme parametre zbrane použitej v addone.

Štruktúra definície zbrane:
*******************************

class NazovZbrane: VychodziaTrieda{ParametreZbrane};

********************************

Legenda:
NazovZbrane - je názov zbrane pod akým chceme zbraň zadefinovať. Musíme použiť názov predtým zadefinovaný v triede CfgPatches.
VychodziaTrieda - je názov triedy z ktorej vycházdame pri definícii. Keď definujeme svoju samostatnú triedu, tak vycházdame s nadradenej triedy "Default{};"

Nastavenie tejto triedy je už zložitejšie a preto si možností pri nastavovaní tejto triedy ukážeme až názorne v praktickom tutoriále.

CfgVehicles

V tejto triede si definujeme všetky jednotky: vojakov, vozidlá,...

Štruktúra definície jednotky:
**********************************

class NazovJednotky: VychodziaTrieda{ParametreJednotky};

*********************************

Legenda:
NazovJednotky - je názov jednotky pod akým chceme zbraň zadefinovať. Musíme použiť názov predtým zadefinovaný v triede CfgPatches.
VychodziaTrieda - je názov triedy z ktorej vycházdame pri definícii. Keď definujeme svoju samostatnú triedu, tak vycházdame s nadradenej triedy "Default{};"

Nastavenie tejto triedy je už zložitejšie a preto si možností pri nastavovaní tejto triedy ukážeme až názorne v praktickom tutoriále.

CfgGroups

V tejto triede si definujeme skupiny, ktoré budú dostupné v editore cez výber preddefinovaných skupin pomocou klávesy F2

Štruktúra definície skupiny:
**********************************

class NazovSkupiny: {ParametreSkupiny};

*********************************

Legenda:
NazovSkupiny - je názov definície skupiny
ParametreSkupiny - sem definujeme jednotlivé parametre skupiny ako sú názov, zloženie,...

Podrobnejšie si možností pri nastavovaní tejto triedy ukážeme až názorne v praktickom tutoriále.

CfgFaces

V tejto triede si definujeme novovytvorené tváre

Štruktúra definície nových tvári:
**********************************

class NazovTvare: {ParametreTvare};

**********************************

Legenda:
NazovTvare - je názov novovytvorenej triedy tvare.
ParametreTvare - je názov novovytvorenej triedy tvare. Nastavovať sa dajú tieto hodnoty:

name="MenoTvare";
texture="\NazovAddonu\NazovTextury.jpg";
east=1;
west=1;
guerrila=1;

Hodnotami east, west, guerrila, civilian ..si nastavujeme, pre ktorú
          stranu sa môže tvár používať.

CfgNonAIVehicles

V tejto triede si definujeme všetky novovytvorené jednotky, zbrane, posádku pre vozidlá,...

Štruktúra definície triedy:
*********************************

class NazovNovejJednotky: VychodziaTrieda{};

********************************

Legenda:
NazovNovejJednotky - je názov novovytvorenej triedy jednotky, zbrane, posádky,...
VychodziaTrieda - je názov triedy z ktorej vychádzame pri definícii. Použíteľné sú tieto nadradené triedy: ProxyWeapon{};
ProxyCrew {};
ProxyDriver: ProxyCrew {};
ProxyGunner: ProxyCrew {};
ProxyCommander: ProxyCrew {};

Pre nás je ale dôležité, že túto triedu je treba definovať pri nových zbraniach, čo je vlastne každá, ktorá je už aj málo upravená od pôvodnej.
Podľa mojich informácií je definovanie triedy CfgNonAIVehicles pri odvodených jednotkách vozidiel a vojakov zbytočné. Jej význam nadobudne na dôležitosti asi až s vyjdením balíku SDK a následným vznikom zbrusu nových vozidiel. Definícia tejto triedy pravdepodobne najviac súvisí s doposiaľ nepreskúmanými triedami CfgVehicleActions a CfgMovesMC.

Stringtable
Do súboru "stringtable.csv" si definujeme názvy jednotiek, objektov, činností,…. Tak, ako sme to robili pri editácii misií. Je vhodné definovať okrem CZ alebo SVK názvov aj anglické, ak chceme, aby sa addon rozšíril aj do zahraničia. Tam maju totiž na addony s neanglickými názvami jednotiek negatívny názor 9 a aj veľké problémy s názvami jednotiek s diakritikou. Taktiež budú mať problémy aj hráči v CZ a SVK s inou, ako českou verziou hry.

Převod do PBO
Takže už máme urobený svoj vlastný addon a teraz ho treba už iba spakovať do formátu PBO. Na to mám poslúži utilitka StuffPBO.

Postup pri spakovávaní súborov do formátu PBO:
Spustite si utilitku StuffPBO. Stlačíme tlačítko "Set Input" a nalistujete si adresár, v ktorom sa nachádzajú pripravené súbory addonu. Pomocou "Set Output" si zase zvolíme názov pre addon. Musí mať taký istý názov ako adresár addonu. Potom už iba pomocou tlačítka "Stuff" dáme addon spakovať.

Závěr
Hotový addon (súbor s príponou PBO) si potom nakopírujeme do podadresára ADDONS v adresári hry Operation Flashpoint a môžeme si užívať svoj výtvor :

Ak ste s addonom spokojný a chcete ho sprístupniť aj ďalším hráčom, tak si vytvorte textový súbor "readme.txt" s popisom addonu a ďaľšími údajmi (credits, mail,...). Nakoniec si addon aj s readme spakujte, pripojte sa na internet a pošlite nám váš nový addon na náš mail. Díki ;)


Tutorial 24
Autor : MAA

1. část tutoriálu o addonu

2. část tutoriálu o addonu

Tvorba addonu vozidla
V tomto tutoriále si názorne, krok za krokom vysvetlíme, ako postupovať pri tvorbe addonu vozidla. Vyskúšame si vytvoriť modifikovanú škodovku a pridelíme ju k partizánom.

Pred tým, ako sa pustíte do vytvárania addonu podľa tohoto tutoriálu si preštudujte prosím predchádzajúci tutoriál o základoch tvorby addonov, pretože sa základným veciam venovať nebudeme.

1. Vytvoríme si adresár s takým názvom, ako sa bude volať náš addon: "MAA_Skodovka". V ňom si vytvoríme aj podadresár pre textury s názvom "Textury". Pri pomenovávaní addonu postupujte podla pravidiel uvedených v tutoriále o základoch tvorby addonov.

2. Rozpakujeme si súbor "Data3D.pbo" do adresára "Data3D-modely" a súbor "Data.pbo" do adresára "Data-Textury". Vytvoríme si aj pracovný adresár "Working".

3. Z adresára "Data3D-modely" si vyberieme model pre náš addon: "Skodovka_blue.p3d" a nakopírujeme si ho do adresára nášho addonu.

4. Súbor "Skodovka_blue.p3d" si rozpakujeme pomocou utilitky "unpack-sqm.exe". Rozpakovanému súboru (mission.txt) dáme názov "MAA_SkodovkaTEMP.p3d" a pôvodný súbor (mission.sqm) zmažeme.

5. Súbor "MAA_SkodovkaTEMP.p3d" si otvoríme v utilitke "P3D Util". Po jeho načítaní sa nám zobrazí ZOZNAM textúr, ktoré sa nachádzajú na modeli. Podľa tohoto zoznamu si z adresára "Data-Textury" vyberieme všetky textúry potrebné k modelu a nakopírujeme si ich do vytvoreného podadresára "Orig" v pracovnom adresári "Working". Utilitku "P3D Util" ešte nezatvárajte.

6. Pomocou utilitky "TexView" si textúry postupne otvárame a textúry, ktoré budeme modifikovať si uložime s príponou TGA. Pri ich ukladaní dodržujte postup popísaný v tutoriále o základoch tvorenia addonov.

7. Všetky textúry uložené už vo formáte TGA, ktoré budeme modifikovať si kvôli prehľadnosti presunieme do adresára "Working".

8. Editujeme textury (TGA). Nezabudnite ich ukladať v 32 bitovej farebnej hĺbke a s Alpha kanálmi.

9. Upravené TGA textúry si pomocou "TexView" uložíme naspäť do pôvodných formátov PAC a PAA. Nové PAC a PAA súbory si potom nakopírujeme do podadresára "Textury" v adresári addonu "MAA_Skodovka". Stačí si tam nakopírovať IBA zmenené textúry, aby nebol addon zbytočne veľký. Ja som upravil iba 2 textúry "blue_sk_strch.pac" a "blue_sk_kapot.pac".

10. V spustenej utilitke "P3D Util" si nastavíme cestu k novým textúram v položke "Texture Folder" na "maa_skodovka\textury" (tak ako je to vidno na [obrazku2]) a zameníme upravené textúry.

11. Súbor si uložíme pod názov "MAA_Skodovka.p3d". Ak uloženie prebehlo v poriadku, tak pôvodný súbor "MAA_SkodovkaTEMP.p3d" zmažeme.

12. Teraz by sme mali mať v adresári addonu súbor "MAA_Skodovka.p3d" a v podadresári "Textury" všetky modifikované textúry.

13. Do adresára addonu si nakopírujeme template súbor "stringtable.csv" a súbor configu "Config.cpp". Ten začneme modifikovať.

a) V triede "CfgPatches" si zadefinujeme novú triedu "MAA_Skodovka".

class CfgPatches
{
class MAA_Skodovka
{units[] = {MAA_Skodovka}; weapons[] = {}; requiredVersion = 1.30;};
};

b) V triede "CfgVehicles" si z triedy "All" odvodíme postupne triedu "Skoda".

class CfgVehicles
{
class All{};
class AllVehicles:All{};
class Land:AllVehicles{};
class LandVehicle: Land {};
class Car: LandVehicle {};
class SkodaHelper: Car {};
class SkodaBase: SkodaHelper {};
class Skoda: SkodaBase {};
}

Pri odvodzovaní tried sa môžeme riadiť aj prehľadnou stromovou štruktúrov v dodatku "Object Class Tree Appendix" neoficiálneho "Command Reference".

Pri vozidlách je dôleźité si zadefinovať aspoň tieto základné vlastnosti:

DisplayName
Definuje sa tu zobrazovaný názov jednotky, ktorý si zadefinujeme aj v súbore STRINGTABLE.CSV addonu.

Side
Tu sa nastavuje strana pre novú jednotku. Môže byť označená priamo názvom (TWest,TEast,TGuerrila,TCivilian), alebo príslušným číslom (0,1,2,3).

Model
Tu treba zadefinovať celú cestu k modelu P3D.

Crew
V tejto položke sa nastavuje posádka vozidla. Treba tu nastaviť triedu vojaka z rovnakej strany, kam priraďujeme vozidlo. Základné triedy vojakov pre jednotlivé strany sú: SoldierWB, SoldierEB, SoldierGB, Civilian2.

Samotná definícia novej jednotky v configu bude vizerať takto:

class MAA_Skodovka: Skoda
{
displayName="$STR_MAA_Skodovka";
side=TGuerrila;
model="\maa_skodovka\maa_skodovka.p3d";
crew="SoldierGB";
};

14. V súbore "stringtable.csv" si zadefinujeme zobrazovaný názov pre vozidlo.

15. Teraz si addon spakujeme pomocou "StuffPBO". Názov nového súboru addonu musí byť rovnaký ako názov adresára addonu. Názov addonu teda musí byť "maa_skodovka.pbo".

16. Keď všetko prebehlo v poriadku, nakopírujeme si hotový addon do podadresára "ADDONS" v OFP a otestujeme jeho funkčnosť v praxi.

17. Ak ste postupovali správne, tak by mal výsledok vizerať ako na poslednom obrázku.

Závěr
Ak pri vytváraní addonu narazíte na nejaké problémy, smerujte prosím svoje otázky k nám do diskusie.

Template súbory CONFIG.CPP a STRINGTABLE.CSV si môžete stáhnout z :

http://games.worldonline.cz/flashpoint/tutorials/ofptutorial24/Templates.rar

Celý spakovaný adresár addonu si môžete stiahnuť z :

http://games.worldonline.cz/flashpoint/tutorials/ofptutorial24/MAA_Skodovka_adresar.rar

Výsledný addon pak z :

http://games.worldonline.cz/flashpoint/tutorials/ofptutorial24/maa_skodovka_pbo.rar

Hotový addon (súbor s príponou PBO) si potom nakopírujeme do podadresára ADDONS v adresári hry Operation Flashpoint a môžeme si užívať svoj výtvor.


Tutorial 23
Autor : Leon

Deepx nám poslal návod (za což mu děkuji), jak vytvořit funkční dynamický waypoint. Protože si myslím, že by to mohlo zajímat i vás, otiskuji ho prakticky v nezměněné formě. Jen jsem si dovolil mezi řádky vložit některé své komentáře (kurzívou) a na konce přidat několik faktů o nových souvisejících příkazech přímo ve hře.

Dynamický výpis textu
Pokud jste viděli trailer na kampaň Retaliation, určitě jste si všimli zajímavého nápadu s běžícím textem, který má navozovat efekt psaní na stroji. Zaujalo mě to natolik, že jsem byl zvědavý, jak to autoři udělali. Po rozbalení jsem byl ale zklamán, protože jsem zjitil, že je to uděláno přes velmi pracný výpis každého textu po sobě, což vypadá asi takto:

Titletext ["P", "PLAIN",0.1]
~0.15
Titletext ["Po", "PLAIN",0.1]
~0.15
Titletext ["Pon", "PLAIN",0.1]
~0.15

Pokud tedy chcete změnit text výpisu, musíte přepisovat celý dlouhý script. To se mně ale vůbec nelíbí, takže jsem si sedl a vymyslel na to podstatně jednodušší script, který vám chci ukázat. Tady je jeho základní podoba:

;Vypis beziciho textu na obrazovku by Leon, http://flashpoint.tiscali.cz

_text = ["P","o","n","d","ě","l","í"," ","1","6","."," ","s","r","p","n","a",", ","8",":","2","5","\n","\n","P","r","ů","z","k","u","m","n","á"," ","g","e","o","l","o","g","i","c","k","á"," ","s","t","a","n","i","c","e",","," ","j","i","ž","n","í"," ","E","v","e","r","o","n"]

_counter = 0
_napis = ""

#pis
_pismeno = _text select _counter
_napis = _napis + _pismeno
Titletext [format ["%1", _napis], "PLAIN", 0.1]
_counter = _counter + 1
~0.15
? _pismeno != "" : goto "pis"

exit

Teď si trochu vysvětlíme, co vlastně script dělá a proč. Nejprve si do pole proměnné _text zadáme text (kupodivu), který chceme postupně vypsat na obrazovku. Pokud chcete do pole zadávat znaky, respektive stringy (řetězce znaků), musíte je zadávat do uvozovek. Jednotlivé znaky se pak oddělují čárkou. Také speciální znak "\n" pro zalomení řádku berte jako znak, mezerník je nutno zadat jako " " - to není to samé, co prázdný znak "" !

Dále si nadefinujeme proměnnou _counter, která nám bude ukazovat na pořadí v poli _text. Zadáme ji hodnotu 0, protože v poli je první znak jako 0, druhý jako 1 atd. Dále si vytvoříme proměnnou _napis, která se bude vypisovat na obrazovku, pro začátek to bude prázdný řetězec.

Pak přichází klíčová část scriptu - cyklus. Nejprve se v něm načte do proměnné _pismeno znak (řetězec) z pole _text z pořadí, na které ukazuje _counter. Pak se toto _pismeno přidá na konec proměnné _napis, čímž se každým průchodem cyklu řetězec v proměnné _napis prodlouží o jeden znak. Příkazem TitleText se pak _napis vypíše na obrazovku, napřed je ale třeba si ho příkazem format převést. Pokud byste chtěli, aby se text zobrazoval jako hint vlevo nahoře, použijte místo řádku s TitleText řádek

hint format ["%1", _napis]

Dále už si jen zvýšíme _counter o jedno tak, aby ukazoval na další položku v poli, zadáme časový údaj pro odstup (tím si regulujete rychlost běžícího textu) a na závěr cyklu musí následovat podmínka, při které se cyklus vrací na svůj začátek. V tomto případě jsem použil podmínku, při které se testuje, zda _pismeno nenačetlo prázdný řetězec. Vím, že to není ideální, protože cyklus tak na závěr proběhne jednou naprázdno. Z programátorské hlediska by bylo lepší testovat _pismeno ihned po načtení, v momentě, kdy načte prázdný řetězec skočit až za cyklus, na konci cyklu by pak bylo goto bez podmínky. Myslím si ale, že takhle je to pro vás přehlednější a jeden průchod cyklu navíc vůbec nevadí, ani ho nepoznáte.

Jak jsem uváděl na začátku, jde jen o základní verzi scriptu, který si každý může doplnit jak chce. Já ho mám třeba doplněn ještě o zvuk ťukání, ale na další vychytávky už třeba přijdete sami.

Pokud si script uložíte třeba pod názvem výpistextu.sqs, stačí ho pak odněkud inicovat příkazem

[] exec "vypistextu.sqs"

Doufám, že jste tenhle vcelku jednoduchý script pochopili :)

Odečet času
Druhým scriptem, který si dnes ukážeme, bude časový odečet nějaké akce. Opět uvedu pouze základní verzi scriptu a její rozšíření nechám na vás.

;Odpocet casu by Leon, http://flashpoint.tiscali.cz

_minuta = 10
_sekunda = 0

#odecti
~1
? _sekunda < 0 : _sekunda = 59; _minuta = _minuta - 1
? _sekunda <10 : hint format ["Do konce zbývá %1:0%2", _minuta, _sekunda]
? _sekunda >9 : hint format ["Do konce zbývá %1:%2", _minuta, _sekunda]
_sekunda = _sekunda - 1
? (_minuta != 0 && _sekunda != 0) : goto "odecti"

exit

Nejprve si opět nadefinujeme základní proměnné. Tentokrát si vystačíme pouze se dvěma - _minuta bude počítat minuty, _sekunda sekundy :) Protože jde o odpočet času, musíme si nastavit počáteční čas. Zde jsem si ho nastavil na celých 10 minut.

Pak již následuje obvyklý cyklus. Nejprve se testuje, zda _sekunda není nižší než 0, tzn. -1. Takový stav nastane, když od 0 odečteme 1 (viz o 3 řádky níže). V takovém případě nastavíme stav sekund na 59 a odečteme jednu minutu. Další řádky slouží k výpisu aktuálního času na obrazovku v rámci hintu na obrazovce vlevo nahoře. Provede se vždy jen jeden výpis, a to podle toho, zda je počet sekund pod 10 nebo 10 a více. To proto, že vypadá špatně, když je čas do konce třeba 5 minut a 7 sekund zapsán jako 5:7 - lepší je 5:07. Proto v případě, že je čas jednomístný, přidávám do výpisu (v rámci příkazu format) před výpis _sekundy ještě znak 0.

Pak snížíme čas (_sekunda) o jedna a na závěr položíme podmínku pro opakování. Pro tento případ jsem zvolil podmínku, kdy se zjišťuje, zda jsou _minuty a _sekundy různé od 0.

Pokud byste chtěli počítat i hodiny, byl by postup podobný, jen byste přidali pár podmínek pro celé hodiny. Podobný postup by byl i v případě, že byste nechtěli čas odečítat, ale počítat. Především byste _minuty a _sekundy neodčítali, ale přičítali. Jiná by byla i první podmínka, asi v tomto stavu

? _sekunda > 59 : _sekunda = 0; _minuta = _minuta + 1

Závěrečná podmínka by pak mohla vypadat řeba takto (i když logičtější by bylo mít "pricti")

? (_minuta < 10) : goto "odecti"

v případě, že byste chtěli počítat jen do 10 minut.

Pokud si script nazvete třeba odecet.sqs, stačí ho pak volat příkazem

[] exec "odecet.sqs"

Pokud si chcete vyhrát, můžete script modifikovat třeba tím, že si budeme počáteční časový stav načítat z parametrů při zadání. V našem případě by to pak vypadalo

[10, 0] exec "odecet.sqs"

a první dva řádky scriptu by pak vypadaly

_minuta = _this select 0
_sekunda = _this select 1

Stejně jako u prvního scriptu, i tentokrát je jen na vás, zda tento script bude něco spouštět, nebo bude jen informativní.

Závěr
Doufám, že jste vše pochopili, pokud ne, směřujte dotazy do diskusí.


Tutorial 25

Autor : Leon

Tvorba pokročilejšího scriptu
Dnešní tutoriál je určen po ty, kteří již mají určité zkušenosti s tvorbou scriptů. Ukážeme si v něm, jak vytvořit script, který nám poslouží pro dotankování paliva a doplnění munice ve vrtulníku. Po drobných úpravách ho ale lze použít i pro jiná vozidlo, například tanky, BMP apod. Vše si opět probereme na praktické ukázce, na konci si můžete stáhnout script i s ukázkovou misí.

Situace by měla asi vypadat takto. Na letišti jsou připraveny dva nákladní vozy - jeden pro doplnění paliva, druhý pro doplnění munice. My pak chceme, aby poté, co si rádiem vyžádáme jejich služby, došlo k doplnění paliva a munice.

V první řadě si vybereme místo, kde k tomu má dojít. Logicky se nabízí nějaké letiště, já jsem si vybral to na severním Everonu. Tam jsem si umístil heliport H pojmenovaný hmi24, zhruba na něj posadil vrtulník Mi-24 Hind pojmenovaný mi1, k benzínce jsem umístil zásobovací Ural Fuel (pojmenovaný cisterna), o něco níže pak muniční Ural Ammo (se jménem municak). U mi1 jsem snížil hodnoty pro palivo a munici tak, aby byl na první pohled vidět výsledný efekt.

Poslední věc, kterou potřebujeme, je spínač. Ten bude aktivován Radiem Alpha (do pole text můžete napsat třeba Dotankovat a doplnit munici - je to text, který se vám pak zobrazí v menu Radio ve hře), bude mít ovšem další podmínky. Je přeci nelogické, aby se dotankování dělo, když vrtulník je někde mimo. Proto musíme podmínkami spínače nějak zaručit, že akce proběhne v trochu reálných podmínkách. K tomu by mohlo stačit napsat do políčka podmínka zhruba toto

this and (getpos mi1 select 2)<0.5 and (hmi24 distance mi1)<20 and (speed mi1)<1

Jsou to celkem 4 podmínky, teprve při splnění všech dojde ke spuštění scriptu.

První podmínka - this - je samotné volání rádiem.

Druhá podmínka - (getpos mi1 select 2)<0.5 - nám zaručí, že vrtulník je (skoro) na zemi. Na zemi by byl reálně při == 0, ovšem pozor na všechny případy, kdy chcete podobné věci porovnávat právě s nulou. Občas to blbne, měla by proto stačit podmínka, že je "skoro" na zemi.

Třetí podmínka - (hmi24 distance mi1)<20 - nám zase zaručí, že vrtulník přistál na letišti. Příkaz distance zjišťuje vzdálenost mezi dvěma jednotkami, v našem případě je to vzdálenost mezi vrtulníkem a heliportem. Vrtulník tak musí přistát do vzdálenosti nejvíce 20 metrů od heliportu.

Čtvrtá podmínka - (speed mi1)<1 - nám ještě zaručí, že se vrtulník nepohybuje. Opět by bylo vhodnější zjišťovat (speed mi1)==0, ale z podobných důvodů jako u výšky nám může posloužit toto. Také bychom neměli zapomenout, že vrtulník se může pohybovat i zápornou rychlostí, což by se dalo ošetřit ještě (speed mi1)>-1.

Když jsou tedy splněny všechny 4 podmínky, můžeme spustit script. Do políčka při aktivaci zadáme

[] exec "dopln.sqs"

Tím voláme externí script pojmenovaný dopln.sqs, který se postará o samotné doplnění munice a paliva. Ještě je dobré nastavit spínání spínače na opakované, pak můžeme script volat víckrát, takže si můžeme přiletět doplnit palivo několikrát. Nejprve je zde celý script:

mi1 sidechat "Tady Orel, doplňte mi palivo a střelivo!"

_CisOldPos = GetPos cisterna
_MunOldPos = GetPos municak

cisterna DoMove [(getpos mi1 select 0)+10, (getpos mi1 select 1)+10, 0]

#cis_uz
? ((cisterna distance mi1)<30) and ((speed cisterna) < 1) : goto "cis_namiste"
~1
goto "cis_uz"

#cis_namiste
~3
cisterna sidechat "Doplňuji vám palivo, zachovejte opatrnost!"

#dopln
mi1 setfuel (fuel mi1 + 0.01)
~0.1
? (fuel mi1)<1 : goto "dopln"

~1
cisterna sidechat "Máte plné nádrže, končím!"
~3
cisterna domove _CisOldPos

municak DoMove [(getpos mi1 select 0)+10, (getpos mi1 select 1) -10, 0]

#mun_uz
? ((municak distance mi1)<30) and ((speed municak) <1) : goto "mun_namiste"
~1
goto "mun_uz"

#mun_namiste
municak sidechat "Začneme vám doplňovat munici!"
~1
mi1 removemagazine "HellfireLauncherHind"
mi1 addmagazine "HellfireLauncherHind"
~1
mi1 removemagazine "MachineGun30"
mi1 addmagazine "MachineGun30"
~1
mi1 removemagazine "Rocket57x64"
mi1 addmagazine "Rocket57x64"
~2
municak sidechat "Munice doplněna, končím!"
~3
municak domove _MunOldPos

exit

Nyní si rozebereme celý script dopln.sqs.

mi1 sidechat "Tady Orel, doplňte mi palivo a střelivo!"

Na začátek si dáme nějaký pokyn pro tankování.

_CisOldPos = GetPos cisterna
_MunOldPos = GetPos municak

Zjistíme si počáteční pozice cisterny a municak, budou to místa, kam se pak budou vracet.

cisterna DoMove [(getpos mi1 select 0)+10, (getpos mi1 select 1)+10, 0]

Cisterna se rozjede do místa, které má souřadnice x+10 a y+10 od vrtulníku. Místo příkazu DoMove by šlo použít waypointy, jenže my nemůžeme předem zaručit, že vrtulník přistane na určitém místě, proto je lepší příkaz DoMove s relativními souřadnicemi k pozici vrtulníku.

#cis_uz
? ((cisterna distance mi1)<30) and ((speed cisterna) < 1) : goto "cis_namiste"
~1
goto "cis_uz"

Tady testujeme, zda už je cisterna na místě. Použil jsem dvě podmínky - jednak vzdálenost od vrtulníku, jednak rychlost cisterny - při dojezdu na místo zastaví. Teoreticky by šla použít jen podmínka pro rychlost, ale spojení se vzdáleností zaručí, že se podmínka nesplní, když se po cestě cisterna o něco zasekne. Při nastavování vzdálenosti nezapomínejte, že ač jsme souřadnice nastavili na x+10 a y+10, vzdálenost je přepona těchto souřadnic (viz Pythagorovo věta)! Navíc je lepší nechat tam určitou toleranci, protože jednotka většinou nedojede úplně na místo určení. V neposlední řadě si pak uvědomte, že vzdálenost je zde jen podpůrná podmínka, tou hlavní je rychlost cisterny.

#cis_namiste
~3
cisterna sidechat "Doplňuji vám palivo, zachovejte opatrnost!"

Cisterna je na místě, dáme ji určitý čas na "natažení hadic" apod.

#dopln
mi1 setfuel (fuel mi1 + 0.01)
~0.1
? (fuel mi1)<1 : goto "dopln"

Bylo by podivné, kdyby se palivo doplnilo skokem na plnou hodnotu, tato jednoduchá smyčka nám zabezpečí plynulé dotankování paliva až na maximum.

~1
cisterna sidechat "Máte plné nádrže, končím!"
~3
cisterna domove _CisOldPos

Cisterna ohlásí splnění úkolu a odjede zpět na své původní místo.

municak DoMove [(getpos mi1 select 0)+10, (getpos mi1 select 1) -10, 0]

#mun_uz
? ((municak distance mi1)<30) and ((speed municak) <1) : goto "mun_namiste"
~1
goto "mun_uz"

Po odjezdu cisterny přijede muniční vůz za stejných podmínek jako cisterna, jen přijede na souřadnice x+10 a y-10 (sami si zkuste ideální pozici s ohledem na směr, odkud přijíždí).

#mun_namiste
municak sidechat "Začneme vám doplňovat munici!"
~1
mi1 removemagazine "HellfireLauncherHind"
mi1 addmagazine "HellfireLauncherHind"
~1
mi1 removemagazine "MachineGun30"
mi1 addmagazine "MachineGun30"
~1
mi1 removemagazine "Rocket57x64"
mi1 addmagazine "Rocket57x64"

S doplňováním munice je to trochu složitější, protože příkaz ammo nám zjistí jen aktuální stav v zásobníku. Vrtulník má ale tři druhy munice. Proto je ideální odstranit veškerou munici a přidat novou - to má efekt doplnění munice na maximum. Samozřejmě, že časové odstupy jsou zde nesmyslně krátké, protože přezbrojení vrtulníku trvá ve skutečností hodně dlouho. Zvolte si sami, jak dlouho se vám bude zdát doplnění munice adekvátní.

~2
municak sidechat "Munice doplněna, končím!"
~3
municak domove _MunOldPos

exit

Municak ohlásí splnění úkolu a vrátí se na svoji původní pozici, script se ukončí. Protože je ale nastaven na opakované volání, lze ho volat znovu.

Volání se provádí přes rádio (klávesy 0-0-1). Jen nezapomeňte, že pro jeho spuštění musí být splněny všechny 4 podmínky ve spínači, nestačí jen si o to zavolat.

Závěr
Ač se někomu bude zdát script už takhle složitý, existuje spousta věcí, které by do něho šlo přidat. Tak třeba script netestuje, zda vrtulník vůbec potřebuje dotankovat a doplnit palivo. Dále není ošetřena možnost, že vrtulník vzlétne během celé akce - stačilo by před každou důležitější akcí testovat výšku vrtulníku a jeho rychlost, případně jeho momentální pozici vzhledem k té, kdy se akce spustila. Tím by se ale stal celý script nepřehledný pro většinu čtenářů, což zase nechci. Navíc každý tutoriál, tedy i tento, vás má především učit. Tenhle článek vás měl především naučit přemýšlet nad scriptováním a popisovaný script byl k tomu jen prostředkem.

Zdrojové scripty mise si můžete stáhnout z :

http://games.worldonline.cz/flashpoint/tutorials/ofptutorial25/Pokus dopln.Eden.zip


Tutorial 26

Autor : Leon

Dodatek ke tvrobě kampaně
Když jsem pro vás psal první tutoriál o tvorbě kampaně, neměl jsem s tím žádné praktické zkušenosti. Slíbil jsem tehdy, že až budu, napíšu k němu pokračování. Tady je. Zkušenosti jsem získal při tvorbě ČSLA kampaně, takže především na ní ukáži všechny podstatné věci.

Základní postup při tvorbě kampaně by měl být asi takový, že si v první řadě uděláte samostatné mise a ty pak složíte do kampaně. Pokud nebudete používat složitější věci, můžete je pak jednoduše složit třeba pomocí programu OFP Campaign Editor a máte vystaráno. Složitější je to u kampaně, kde na sebe mise přímo navazují, předávají si parametry, používají společné zvuky či hudbu, načítají si identitu atd. Tam je potom lepší tvořit kampaň zároveň s každou novou misí, protože si všechny zmíněné věci můžete vyzkoušet - v editoru misí to nelze, ten s description kampaně nespolupracuje.

Soubor description.ext je nejdůležitější soubor kampaně. Je tam definováno vše podstatné a bez něho prostě kampaň nevytvoříte. V prvním tutoriále jsem ho již zhruba popisoval, takže nyní se zaměřím jen na další věci. V první řadě je zde description.ext z ČSLA kampaně.

class CfgIdentities
{
class Kouba
{
name = "Jiří Kouba";
face = "Face52";
glasses="None";
speaker = "Adam";
pitch = 1.0500;
};
class Henderson
{
name = "Jim Henderson";
face = "Face1";
glasses="None";
speaker = "Jonah";
pitch = 1.0500;
};
class Smiricky
{
name = "Dan Smiřický";
face = "Face41";
glasses="None";
speaker = "Dan";
pitch = 1.1000;
};
class Meveryk
{
name = "Janko Meveryk";
face = "Face27";
glasses="None";
speaker = "Dan";
pitch = 1.0;
};
}

class Awards
{
class Award01
{
limit = 12;
abel = ;
cain = ;
eden = ;
};
class Award02
{
limit = 40;
abel = ;
cain = ;
eden = ;
};
class Award03
{
limit = 100;
abel = ;
cain = ;
eden = ;
};
};

class Penalties
{
class Penalty01
{
limit = -1;
abel = ;
cain = ;
eden = ;
};
class Penalty02
{
limit = -7;
abel = ;
cain = ;
eden = ;
};
class Penalty03
{
limit = -12;
abel = ;
cain = ;
eden = ;
};
class PenaltyGameOver
{
limit = -15;
abel = ;
cain = ;
eden = ;
};
};

exitScore = -10000;

class MissionDefault
{
lives = -1;

lost = ;
end1 = ;
end2 = ;
end3 = ;
end4 = ;
end5 = ;
end6 = ;
};

class Campaign
{
name = "ČSLA: Operation Paranoid";
firstBattle = Part1;

class Part1
{
name = "Invasion";

cutscene = ;

firstMission = CSLA01Intro;
lost = ;
end1 = ;
end2 = ;
end3 = ;
end4 = ;
end5 = ;
end6 = ;

class CSLA01Intro: MissionDefault
{
noAward=true;
end1 = CSLA02Invaze;
end2 = CSLA01Intro;
end3 = CSLA01Intro;
end4 = CSLA01Intro;
end5 = CSLA01Intro;
end6 = CSLA02Invaze;
lost = CSLA01Intro;
template = CSLA01Intro.Eden;
};
class CSLA02Invaze: MissionDefault
{
end1 = CSLA03Protiutok;
end2 = CSLA02Invaze;
end3 = CSLA02Invaze;
end4 = CSLA02Invaze;
end5 = CSLA02Invaze;
end6 = CSLA03Protiutok;
lost = CSLA02Invaze;
template = CSLA02Invaze.Eden;
};
class CSLA03Protiutok: MissionDefault
{
end1 = CSLA04General;
end2 = CSLA03Protiutok;
end3 = CSLA03Protiutok;
end4 = CSLA03Protiutok;
end5 = CSLA03Protiutok;
end6 = CSLA04General;
lost = CSLA03Protiutok;
template = CSLA03Protiutok.Eden;
};
class CSLA04General: MissionDefault
{
end1 = CSLA05Durras;
end2 = CSLA04General;
end3 = CSLA04General;
end4 = CSLA04General;
end5 = CSLA04General;
end6 = CSLA05Durras;
lost = CSLA04General;
template = CSLA04General.Eden;
};
class CSLA05Durras: MissionDefault
{
end1 = CSLA06Sabotaz;
end2 = CSLA05Durras;
end3 = CSLA05Durras;
end4 = CSLA05Durras;
end5 = CSLA05Durras;
end6 = CSLA06Sabotaz;
lost = CSLA05Durras;
template = CSLA05Durras.Eden;
};
class CSLA06Sabotaz: MissionDefault
{
end1 = CSLA07Regina;
end2 = CSLA06Sabotaz;
end3 = CSLA06Sabotaz;
end4 = CSLA06Sabotaz;
end5 = CSLA06Sabotaz;
end6 = CSLA07Regina;
lost = CSLA06Sabotaz;
template = CSLA06Sabotaz.Eden;
};
class CSLA07Regina: MissionDefault
{
end1 = CSLA07W5Evakuace;
end2 = CSLA07Regina;
end3 = CSLA07Regina;
end4 = CSLA07Regina;
end5 = CSLA07Regina;
end6 = CSLA07W5Evakuace;
lost = CSLA07Regina;
template = CSLA07Regina.Eden;
};
class CSLA07W5Evakuace: MissionDefault
{
end1 = CSLA08Utek;
end2 = CSLA08Utek;
end3 = CSLA07W5Evakuace;
end4 = CSLA07W5Evakuace;
end5 = CSLA07W5Evakuace;
end6 = CSLA08Utek;
lost = CSLA07W5Evakuace;
template = CSLA07W5Evakuace.Eden;
};
class CSLA08Utek: MissionDefault
{
end1 = CSLA09Piloti;
end2 = CSLA08Utek;
end3 = CSLA08Utek;
end4 = CSLA08Utek;
end5 = CSLA08Utek;
end6 = CSLA09Piloti;
lost = CSLA08Utek;
template = CSLA08Utek.Eden;
};
class CSLA09Piloti: MissionDefault
{
end1 = CSLA10Oates;
end2 = CSLA10Oates;
end3 = CSLA10Oates;
end4 = CSLA09Piloti;
end5 = CSLA10Oates;
end6 = CSLA10Oates;
lost = CSLA09Piloti;
template = CSLA09Piloti.Eden;
};
class CSLA10Oates: MissionDefault
{
end1 = CSLA11Opevneni;
end2 = CSLA10Oates;
end3 = CSLA10Oates;
end4 = CSLA10Oates;
end5 = CSLA10Oates;
end6 = CSLA11Opevneni;
lost = CSLA10Oates;
template = CSLA10Oates.Eden;
};
class CSLA11Opevneni: MissionDefault
{
end1 = CSLA12Snimky;
end2 = CSLA11Opevneni;
end3 = CSLA11Opevneni;
end4 = CSLA11Opevneni;
end5 = CSLA11Opevneni;
end6 = CSLA12Snimky;
lost = CSLA11Opevneni;
template = CSLA11Opevneni.Eden;
};
class CSLA12Snimky: MissionDefault
{
end1 = CSLA13Hindy;
end2 = CSLA12Snimky;
end3 = CSLA12Snimky;
end4 = CSLA12Snimky;
end5 = CSLA12Snimky;
end6 = CSLA13Hindy;
lost = CSLA12Snimky;
template = CSLA12Snimky.Eden;
};
class CSLA13Hindy: MissionDefault
{
end1 = CSLA14Morton;
end2 = CSLA13Hindy;
end3 = CSLA13Hindy;
end4 = CSLA13Hindy;
end5 = CSLA13Hindy;
end6 = CSLA14Morton;
lost = CSLA13Hindy;
template = CSLA13Hindy.Eden;
};
class CSLA14Morton: MissionDefault
{
end1 = CSLA15Konvoj;
end2 = CSLA14Morton;
end3 = CSLA14Morton;
end4 = CSLA14Morton;
end5 = CSLA14Morton;
end6 = CSLA15Konvoj;
lost =CSLA14Morton ;
template = CSLA14Morton.Eden;
};
class CSLA15Konvoj: MissionDefault
{
end1 = CSLA16MortonBack;
end2 = CSLA15Konvoj;
end3 = CSLA15Konvoj;
end4 = CSLA15Konvoj;
end5 = CSLA15Konvoj;
end6 = CSLA16MortonBack;
lost = CSLA15Konvoj;
template = CSLA15Konvoj.Eden;
};
class CSLA16MortonBack: MissionDefault
{
end1 = CSLA17ReginaBack;
end2 = CSLA16MortonBack;
end3 = CSLA16MortonBack;
end4 = CSLA16MortonBack;
end5 = CSLA16MortonBack;
end6 = CSLA17ReginaBack;
lost = CSLA16MortonBack;
template = CSLA16MortonBack.Eden;
};
class CSLA17ReginaBack: MissionDefault
{
end1 = CSLA18Zajatci;
end2 = CSLA17ReginaBack;
end3 = CSLA17ReginaBack;
end4 = CSLA17ReginaBack;
end5 = CSLA17ReginaBack;
end6 = CSLA18Zajatci;
lost = CSLA17ReginaBack;
template = CSLA17ReginaBack.Eden;
};
class CSLA18Zajatci: MissionDefault
{
end1 = CSLA19Exit;
end2 = CSLA18Zajatci;
end3 = CSLA18Zajatci;
end4 = CSLA18Zajatci;
end5 = CSLA18Zajatci;
end6 = CSLA19Exit;
lost = CSLA18Zajatci;
template = CSLA18Zajatci.Eden;
};
class CSLA19Exit: MissionDefault
{
end1 = CSLA20End;
end2 = CSLA19Exit;
end3 = CSLA19Exit;
end4 = CSLA19Exit;
end5 = CSLA19Exit;
end6 = CSLA20End;
lost = CSLA19Exit;
template = CSLA19Exit.Eden;
};
class CSLA20End: MissionDefault
{
end1 = ;
end2 = ;
end3 = ;
end4 = ;
end5 = ;
end6 = ;
lost = CSLA20End;
template = CSLA20End.Eden;
};
};

};

class CfgSounds
{
sounds[]={};
};

class CfgRadio
{
sounds[]={};
};

class CfgMusic
{
tracks[]={};

class doors
{
name="Doors";
sound[]={\music\doors.ogg,db+10,1.0};
};
class tenyears
{
name="Ten years";
sound[]={\music\tenyears.ogg,db+10,1.0};
};
class apocalyptica
{
name="Apocalyptica";
sound[]={\music\apocalyptica.ogg,db+10,1.0};
};
class sheep
{
name="Sheep";
sound[]={\music\sheep.ogg,db+10,1.0};
};
class cream
{
name="cream";
sound[]={\music\cream.ogg,db+10,1.0};
};
};

Na začátku je dobré si definovat identity hlavních aktérů kampaně, což se dělá podobně jako u misí. Podotýkám, že vše, co máte definováno v description.ext pro kampaň, by nemělo být uvedeno v description.ext u samotných misí. Týká se to nejen identit, ale také zvuků a hudby.

Pak jsou definovány třídy Awards a Penalties, o kterých už jsem psal minule. Jak vidíte, nevyužil jsem jich. To proto, že by bylo třeba pořádně otestovat, jak se vyvíjí skóre během kampaně a podle toho pak eventuálně dávat vyznamenání. Raději jsem od toho upustil, než abych dával vyznamenání za nic. Vy sami tak samozřejmě můžete udělat, pokud chcete zabránit udělení vyznamenání u některé mise, stačí do její třídy zadefinovat

noaward=true;

Nejpodstatnější je třída Campaign, kde se definují její jednotlivé mise a přechod mezi nimi. Jak vidíte, na začátku je uvedeno jméno kampaně, pak následuje rozdělení do částí kampaně. Minimálně jedna část je vyžadována, můžete to samozřejmě rozdělit do více, ale nemá to vliv na nic. Pak následují třídy jednotlivých misí. Tam je několik podstatných věcí. V definici template, např.

template = CSLA01Intro.Eden;

musí být bezpodmínečně uveden odkaz na adresář mise včetně přípony ostrova. V položkách jednotlivých end a lost je pak uvedeno, na jakou misi se přejde, když taková situace nastane. Podotýkám, že je jen na vás, na jakou to bude - nemusí to být na následující, čímž se dá kampaň větvit. Lost značí obvykle smrt vojáka, takže by poté mělo následovat hraní stejné mise - v těchto případech se již neuvádí jméno adresáře s příponou ostrova, ale zadefinovaná třída mise (kvůli přehledu jen nejlepší mít stejná jména, jen bez přípony). V případě úspěšného ukončení mise - záleži na endech v samotné misi - by měl následovat přechod na další misi, eventuálně na jinou - pak nastává větvení. Jen nezapomeňte se z větve zase nějak dostat na hlavní linii. Jinak end samozřejmě může být i neúspěšný - pak by mělo následovat vrácení na začátek stejné mise. Tímto navazováním misí na sebe byste se měli dostat až na konec kampaně.

Pozn.: end6 v mém případě značí přechod na novou misi proto, že je to ukončení díky cheatu.

Na závěr jsou definované třídy CfgSounds, CfgRadio a CfgMusic. To funguje podobně jako u jednotlivých misí, zde je rozdíl jen v tom, že takto definové zvuky či hudba jdou volat z jakékoliv mise, aniž by bylo nutné je mít pokaždé definované (a především znovu uložené). Jedinou otázkou tak zůstává, kam s těmito soubory. Pro tohle je určen speciální adresář DtaExt v adresáři s kampaní, kde je třeba si vytvořit adresáře Sound a Music a do nich zvukové soubory ve formátu ogg umístit. Do description se to pak definuje stejně jako u mise - zvuky se linkují přímo na soubor, hudba musí mít definovanou i cestu \music\.

Tím bychom měli za sebou description. Vedle description je dobré mít i overview.html, kam není na škodu dát nějaký obrázek - ten se zobrazí jak při startu kampaně, tak pokaždé z nějaké pokračovací pozice v menu kampaně. Když už jsme u těch overview - není třeba se dělat s vícejazyčnými overview u misí - kampaň s tím nepočítá a hledá jen overview.html. U briefingu to naopak udělat můžete.

Posledním souborem hromadným pro celou kampaň je stringtable.csv. Tady si nejsme zcela jist, co by se sem mělo zadávat. Jak jsem koukal, v BI tam definují stringy názvů misí ve všech jazycích, ale jak jsem zjistil, ze stringtablů u misí to také funguje.

Poslední věc, o které bych se ještě rád zmínil, je adresářová struktura kampaně. Celá kampaň by měla být v jednom adresáři, např. CSLA - bez přípony ostrova, jak to dělá například OFP Campaign Editor (o tom se ještě zmíním). V tomto adresáři se nacházejí soubory description.ext, stringtable.csv a overview.html (plus obrázek). To jsou ty společné soubory pro kampaň. Dále by tam měly být dva adresáře DtaExt (pro zvuky a hudbu) a Missions, ve kterém musí být uloženy adresáře (s příponou ostrova!) s jednotlivými mise. To je celé:)

Pokud si netroufáte na ruční tvorbu kampaně, je pro vás určen program OFP Campaign Editor (ke stáhnutí na naší download stránce), o kterém už jsem také psal v tom starším tutoriále. Nemá cenu ho příliš popisovat, protože po chvilce by se v něm měl vyznat každý. Spíše bych chtěl upozornit na jednu věc. Tento program mi tvrdošíjně odmítal přijmout změny, které jsem dělal v description.ext ručně. Když jsem tam dopsal definice hudby, takto upravený description nahrál do programu a uložil, definice zmizely. Takže pozor na to.

Poslední věc se týká balení kampaně do pbo. Balí se celý adresář s kampaní (v našem případě CSLA) a výsledný soubor MUSÍ mít stejný název jako adresář, tzn. csla.pbo. Pro balení i dekompilaci pbo doporučuji skvělý prográmek PBOEditor (také u nás v sekci download), ale lze to samozřejmě i jinými.

Nevím, co bych mohl o tvorbě kampaně ještě napsat. Myslím, že nejlepší studijní materiál budou zdrojáky celé ČSLA kampaně, kde si vše potřebné můžete najít. Zdrojáky jsou to kompletní (tomu odpovídá i velikost), tedy i se všemi zvuky, hudbou i namluvením. Pokud něco z této kampaně použijete pro svou tvorbu, neměli byste zapomenout to uvést do credits.

Zdrojové scripty kampaně si můžete stáhnout z :

http://games.tiscali.cz/clanek/patche.asp?id=3441


Tutorial 28

Tutorial 28 - O zdrojích

Autor : Leon

Velký dík patří: DevilDawn & Lord Nausea
za jejich skvělý tutoriál na Ofp-editing.de

Zdrojem definovaným v Description.ext je myšlen komplexní zápis, sloužící ke zobrazení textů nebo externích obrázků. Možná si říkáte, že texty můžete zobrazovat i pomocí TitleText, ale ve Zdroji můžete definovat jakoukoli polohu textu na obrazovce, jeho barvu, stín, průsvitnost a vybrat si můžete z několika stylů písma ; ). Zdroje toho ale umožňují ještě víc a vše v tomto tutoriálu probereme. Možná se vám to bude ze začátku zdát poněkud zamotané, ale postupně si uvedeme několik příkladů, které zakončíme uceleným Zdrojem.

Zdroje jsou, jak už bylo řečeno, definovány v description.ext a to pod třídou RscTitles. Každý Zdroj má pak svou Podtřídu. Tedy jeden Zdroj může být složen z více dílů, zde si je nazveme Komponenty. Každý Komponent je tedy jedna Podtřída Zdroje.
_______________________________________________________________________
class RscTitles
{
&nbsp;[...]
class Zdroj1
{
[...]
class Komponent1
{
[...]
};
};
};
_______________________________________________________________________

Pro ulehčení práce se Zdroji nám pomáhají tzv. Základní třídy, kterými zavádíme určitá důležitá "Přednastavení". Komponenty pak rozšiřují tato Přednastavení a zavedou dále už jen ty hodnoty, které jsou mimo rámec Přednastavení.
Rozšíření znamená, že tyto nové (rozšířené) třídy "dědí" všechny hodnoty Základní třídy. Tyto hodnoty potom můžete dále přepisovat a k tomu definovat nové.
Základní třídy můžete pojmenovávat libovolně (samozřejmě kromě názvů již definovaných tříd). Například pro různá přednastavení textů a obrázků si můžete Základní třídy definovat jako RscObraz a RscText.
Nyní si ale vytvoříme první jednoduchý, kompletní Zdroj a k Základní třídě se vrátíme později.
_______________________________________________________________________
class RscTitles
{
titles[]={"MujText"}; //seznam použitých Zdrojů
class MujText
{
idd=-1; //interní
movingEnable=0;//interní
duration=20; //čas zobrazení
fadein=3; //čas pro zobrazování
name="MyText";//jméno Zdroje v menu efektů v editoru
controls[]={"MujText1"};//seznam Komponentů
class MujText1
{
type=0; //interní
idc=-1; //interní
style=82; //styl vzhledu Komponentu
colorBackground[]={0,0.5,1,1}; //barevnost pozadí
text=" NAZDAR OFP MANIACI :-) "; //samotný text
//barevnost popředí (textu nebo obrázku)
colorText[]={0.1,0.4,0.8,1};
font="AudreysHandI48"; //typ písma
size=1; //velikost písma
x=0.26; //posice Komponentu na obrazovce
y=0.05;
w=0.49;
h=0.1;
};
};
};
_______________________________________________________________________
Př.1: kompletní jednoduchý Zdroj

Třída RscTitles pouze zavede titles[]. titles[] obsahuje seznam všech Zdrojů. Zde je to jen "MujText". Zdroj MujText pak bude definován jako Podtřída.Ta má následující vlastnosti:
_______________________________________________________________________
idd Interní hodnota. Vždy nechávat 0. Účinek neznámý.
_______________________________________________________________________
movingEnable Interní hodnotat.Vždy nechávat 0. Účinek neznámý.
_______________________________________________________________________
duration Čas v sekundách, po který bude Zdroj zobrazen.
_______________________________________________________________________
fadein Čas v sekundách, ve kterém se Zdroj zobrazuje.
_______________________________________________________________________
name Název Zdroje, pod kterým je uveden v menu efektů v editoru (spínač,WP).
_______________________________________________________________________
controls[] Seznam všech Komponentů (tedy Podtříd Zdroje), ze kterých se Zdroj skládá. Zde je jen "MujText1".
_______________________________________________________________________

Nyní definujeme Komponenty. V tomto případě máme uveden jen jeden, ale
Zdroj jich může mít samozřejmě více, např. dva obrázky uprostřed, jeden text nahoře a jeden text dole...
Komponenty mají následující vlastnosti:
_______________________________________________________________________
type Typ Komponentu. Vždy nechávat 0.
_______________________________________________________________________
idc Interní hodnota. Vždy nechávat na -1.
_______________________________________________________________________
style Definovaný vzhled, typ a umělecké znázornění Komponentů. Níže budou uvedeny přesné typy a možnosti stylů.
_______________________________________________________________________
colorBackground[] Barevnost a prúsvitnosti pozadí. První tři hodnoty jsou: červená, zelená a modrá hodnota barvy. Čtvrtá hodnota je průsvitnost (0=neviditelný, 1=zcela viditelný)
_______________________________________________________________________
colorText[] Jako u colorBackground[], ale pro barvy popředí (texty a obrázky).
_______________________________________________________________________
font Použitelné typy písma.

AudreysHandB48
AudreysHandI48
CourierNewB64
GaramondB64
SteelfishB128
SteelfishB64
TahomaB24
TahomaB36
TahomaB48
_______________________________________________________________________
size Velikost písma. Normální velikost je 1.
_______________________________________________________________________
text Vlastní text, který bude zobrazen.
_______________________________________________________________________
x,
y,
w,
h
Poziční data na obrazovce. x a y definují levý horní roh Komponentu, w šířku (width) a h výšku (height). Pro x znamená 0 levý okraj, 1 pravý okraj, 0.5 střed obrazovky. Pro y znamená 0 horní okraj, 1 spodní okraj. Pro w znamená 1 plnou šířku obrazovky, 0.5 poloviční šířku obrazovky. Pro h přesně jako u w, ale samozřejmě pro výšku obrazovky. příklad 1 ukazuje Komponent, který začíná blíže levé straně a téměř na horním okraji (x=0.26, y=0.05) a zabírá 50% šířky obrazovky a výška je 10% výšky obrazovky (w=0.49, h=0.1). Pokud by se vám text, který napíšete nevešel do vámi vymezeného pole (zvolíteli prostě větší text), bude tak "ostříhaný". Jednoduše pak upravte x,y,w,h.
_______________________________________________________________________

Je tu ještě jedna vlastnost - lineSpacing. Toto se použije, když si někdo zvolí jako styl víceřádkový text. lineSpacing=1 je normální odstup. Při 0 budou všechny řádky napsané jedna na druhé. Při 2 bude mezi řádky jedna prázdná řádka navíc.

Tímto by byl Zdroj hotov. K jeho zobrazení existují dva postupy. První je menu Efekty v editoru OFP. Zdroj bude pak zobrazen, jakmile se příslušný spínač nebo waypoint spustí.
Druhá možnost jsou příkazy cutRSC nebo titleRSC:

cutRSC["MujText","PLAIN"]
titleRSC["MujText","PLAIN"]
Zde bude použit "MujText", tedy jméno třídy Zdroje.
Rozdíl mezi cutRSC a titleRSC je v úrovni pro kterou je Zdroj použit.
cutRSC umisťuje Zdroj jako pozadí. Pak tedy můžete navrch ještě umístit přes titleText nějaký text.
Oproti tomu titleRSC umisťuje Zdroj na stejnou rovinu jako titleText. Tyto dva příkazy tedy nemohou být použity současně. titleText použitý po titleRSC Zdroj "přepíše" a naopak.

Nyní tedy můžete text vložit jako Zdroj. O výhodách už jsem psal na začátku a teď přichází na řadu také již zmiňované styly Komponentů. Předesílám, že dva z těchto stylů také umožňují zobrazování obrázků jako Zdroj, což předpokládám bude používáno také často :)
Styl - efekt, který může být složený až ze tří čísel, která musí být sečtena. Tato tři čísla upřesňují výsledný vzhled Zdroje.
Několik stylů bude také uvedeno v závěrečném Zdroji.

Umístění
_______________________________________________________________________
ST_LEFT vázáno nalevo 0
_______________________________________________________________________
ST_RIGHT vázáno napravo 1
_______________________________________________________________________
ST_CENTER vycentrováno 2
_______________________________________________________________________
ST_UP nahoře 3
_______________________________________________________________________
ST_DOWN dole 4
_______________________________________________________________________
ST_VCENTER centrický/svislý 5
_______________________________________________________________________

Styl
_______________________________________________________________________
ST_SINGLE jednořádkový text 0
_______________________________________________________________________
ST_MULTI* víceřádkový text 16
_______________________________________________________________________
ST_TITLE_BAR titulní lišta 32
_______________________________________________________________________
ST_PICTURE** obrázek 48
_______________________________________________________________________
ST_FRAME orámování 64
_______________________________________________________________________
ST_BACKGROUND pozadí 80
_______________________________________________________________________
ST_GROUP_BOX box 96
_______________________________________________________________________
ST_GROUP_BOX2 box 2 112
_______________________________________________________________________
ST_HUD_BACKGROUND HUD-pozadí 128
_______________________________________________________________________
ST_TILE_PICTURE** dělený obraz 144 (ve skutečnosti jsem nenašel žádný viditelný rozdíl mezi styly 48 a 144)
_______________________________________________________________________
ST_WITH_RECT s obdélníkem 160
_______________________________________________________________________
ST_LINE šikmá linka 176
_______________________________________________________________________

Umělecké zobrazení
_______________________________________________________________________
ST_SHADOW*** text se stínem 256
_______________________________________________________________________
ST_NO_RECT*** bez obdélníku 512
_______________________________________________________________________
* : potřebná extra-vlastnost lineSpacing=; při víceřádkovém textu
_______________________________________________________________________
** : styl - obraz. Do Text="" se zadá místo textu název obrázku.
_______________________________________________________________________
***: Tyto hodnoty můžou být použity společně s dalšími styly.
_______________________________________________________________________

Pokud chce tedy někdo například vytvořit víceřádkový text se stínem a vycentrovaný, sečte tato čísla:
2 (vycentrovaný) + 16 (výceřádkový text) + 256 (stín) = 274
Dá se také použít "\n" jako znaménko pro zalomení řádku. Komponent musí mít vlastnost lineSpacing. Je-li 0, budou všechny řádky ležet jedna na druhé. Číslo 1 je normální textový odstup. Více jak 1 znamená přiměřené zvětšování odstupů k zadanému číslu.

                Pro styly 48 a 144 to vypadá trochu jinak. text="" zde není pro
                psaný text, ale pro název obrázku. Obrázek musí být v .paa
                formátu s odpovídajícími úpravami, jak je popsáno v readme pro
                nástroj TextView; rozlišení musí být mocninou čísla 2 (např.
                16x64, 128x32, 256x256). Je možno použít i formát .jpg, ale
                nefunguje pak efekt průsvitnosti.
Pokud budete chtít použít Zdroj, který bude obsahovat pouze
                jeden Komponent - obrázek, můžete Zdoj zapsat takto:
_______________________________________________________________________
class RscTitles
{
titles[]={"MujObraz"};
class MujObraz
{
idd=-1;
movingEnable=0;
duration=20;
fadein=3;
name="MyPicture";
controls[]={"romance"};
class romance
{
type=0;
idc=-1;
style=48;
colorBackground[]={0,0,0,0};
text="romance.paa";//místo textu název obrázku
colorText[]={1,1,1,1};
font="AudreysHandI48";
size=1;
x=0.25;
y=0.22;
w=0.515;
h=0.35;
};
};
};
_______________________________________________________________________
Př.2: Zdroj - obrázek

To je opravdu vše co musíte do description.ext zapsat, aby se vám váš obrázek objevil na obrazovce. Pokud se použije více Zdrojů v description.ext, měly by se, jak už jsem uvedl, použít Základní třídy. Sám bych ale doporučoval psát Základní třídy vždy. Když totiž porovnáte tento zápis s komplexním zápisem dole, tak zjistíte, že všechny hodnoty, které Základní třída obsahuje stejně musíte v podstatě vměstnat do každého Zdroje. Nebude to tedy žádná zbytečná práce, zvláště pokud by jste se rozhodli přidat Zdroji další Komponent. Teď si ukážeme jak Základní třída vlastně funguje.
Dejme tomu, že někdo použije hodně textu. Tento text má všechen shodný styl, stejnou sazbu, ale rozdílné barvy. Většina textu je ovšem bílá. Definuje se tedy Základní třída:
_______________________________________________________________________
class RscNormalText
{
type=0;
idc=-1;
style=2;
colorBackground[]={0,0,0,0};
colorText[]={1,1,1,1};
font="TahomaB36";
size=1;
};
_______________________________________________________________________
Př.3: Základní třída

V této Základní třídě jsou přednastavení, která se textu normálně zadávají. Ta pak můžete Komponentům ponechat tím, že napíšete
_______________________________________________________________________
class Komponent1: RscNormalText
{
t ext="Jaká je Základní třída, takový je tento Komponent";
x=0.2;
y=0.25;
w=0.6;
h=0.25;
};
_______________________________________________________________________
Př.4: Dědičnost třídy

Tímto zápisem "zdědí" Komponent všechna nastavení Základní třídy RscNormalText.
Přídavným "přepsáním" pak můžete hodnoty jednoduše změnit.
Komponent2 v následujícím příkladu má mít např. červené, poloprůhledné písmo, jiné sazby.
_______________________________________________________________________
class Komponent2: RscNormalText
{
text="Tento Komponent získává nové vastnosti";
colorText[]={1,0,0,0.5};
font="SteelFishB64";
x=0.2;
y=0.25;
w=0.6;
h=0.25;
};
_______________________________________________________________________
Př.5: Dědičnost třídy s přepsáním

Komponent2 každopádně "dědí" všechny hodnoty z RscNormalText, mimo to ale změní colorText[] a fonty.
S těmito poznatky si ušetříte dost zbytečného psaní a descripton.ext bude menší. Budete tak moci jednodušeji provádět změny Přednastavení.

Nyní se dostáváme ke komplexnímu příkladu.
Vypadá to vcelku jednoduše a přitom se skládá z 5 Komponentů.
Zcela vespod bude prázdný obdélník s modrým pozadím. Pak následuje Komponent obrázku. Dále je Komponent s orámováním. Uvnitř orámování je umístěn další textový Komponent a nakonci je ještě jeden text v normálním rámečku, který se zobrazí níže pod ostatními.
V takovýchto Zdrojích s větším počtem Komponentů je důležité dbát na pořadí v jakém jsou v controls[] zapsány. Přesně v tomto pořadí budou také zobrazeny. Když by bylo zapsáno jako poslední v controls[] tmavé pozadí, byl by jím také text nebo obrázek překryt. Pokud máte obrázek ve formátu .paa, tak si můžete pohrát s jeho barevností a průsvitností. Také přes colorText[]={1,1,1,1}; Takto například bude zobrazen normálně. Pokud začnete s hodnotami laborovat dostaví se zajímavé efekty. Pokud třeba budete chtít obrázek připomínající pohled přes noční vidění, tak asi takhle: colorText[]={0,1,0,1}; prostě zvýrazníte druhou hodnotou (zelená).

//definování Základní třídy
class RscStdText
{
type=0;
idc=-1;
style=2;
colorBackground[]={0,0,0,0}; //žádné pozadí
colorText[]={1,1,1,1}; //bílý text
font="TahomaB24";
size=1;
};

                //definování samotného Zdroje
class RscTitles
{
titles[]={"NGA"}; //Seznam Zdrojů. Název pro cutRsc a titleRsc.
class NGA
{
idd=-1;
movingEnable=0;
duration=20; //zdroj bude zobrazen 20sec.
fadein=3; //3 sec pro zobrazování
name="Nogova"; //jméno Zdroje v menu efektů)
//seznam Komponentů. POZOR na zmiňované dodržování posloupnosti.
                První je zde barevné pozadí, aby nepřekrývalo obrázek. Pak
                následuje obrázek a dále texty. Ty mohou být v libovolném
                pořadí.
controls[]={"NGABack","romance","NGAFrame","NGAText1","NGAText2"};
//Komponent1 - pozadí
class NGABack: RscStdText
{
style=0; //žádný zvláštní styl
colorBackground[]={0,0.1,0.4,0.7};//pozadí(modrá)
text="";
x=0.21;
y=0.18;
w=0.59;
h=0.53;
};

//Komponent2 - obrázek
class romance: RscStdText
{
style=48; //styl obrázku
text="romance.paa";//název obrázku v adresáři mise
colortext[]={1,1,1,1};//normální zobrazení
x=0.25;
y=0.22;
w=0.515;
h=0.35;
};

//Komponent3 - text
class NGAFrame: RscStdText
{
style=64; //styl orámování s textem
text=" NOGOVA ";//v barvě Základní třídy (bílá)
font="AudreysHandB48";
x=0.23;
y=0.18;
w=0.55;
h=0.5;
};

//Komponent4 - text
class NGAText1: RscStdText
{
style=256; //styl textu se stínem
text="OPERACE FLASHPOINT RESISTANCE";
colorText[]={1,0.1,0.4,1};//nová barva textu
size=2.1 //zvětšení textu
x=0.26;
y=0.595;
w=0.49;
h=0.06;
};

//komponent5 - text
class NGAText2: RscStdText
{
style=160; //styl textu v rámečku
text="THE BEST GAME EVER";
colorText[]={0.6,0.2,0,1};
size=3
x=0.28;
y=0.8;
w=0.45;
h=0.06;
};
};
};

Tak to bychom měli. Jestli se divíte, že přesto nekončím, tak je to proto, že vám chci ještě ukázat rozšíření o jeden Zdroj. Rozšířením myslím to, že do Description.ext připíšeme ještě jeden Zdroj, který pak v misi budeme moci zobrazit zvlášť. Nebudu vymýšlet nějaký úplně nový a pro ukázku nám zcela postačí náš př.1 kompletního jednoduchého Zdroje, ke kterému přidám ještě jeden textový Komponent.
Jde jen o to, abychom si definovali náš další Zdroj v classRscTitles a ten pak zapsali za první Zdroj NGA.
Tak tedy jěště jednou :)

class RscStdText
{
type=0;
idc=-1;
style=2;
colorBackground[]={0,0,0,0};
colorText[]={1,1,1,1};
font="TahomaB24";
size=1;
};

                class RscTitles
{
titles[]={"NGA","MujText"};//přidáme název dalšího Zdroje
                "MujText"
class NGA //definování Zdroje č.1
{
idd=-1;
movingEnable=0;
duration=20;
fadein=3;
name="Nogova";
controls[]={"NGABack","romance","NGAFrame","NGAText1","NGAText2"};

class NGABack: RscStdText
{
style=0;
colorBackground[]={0,0.1,0.4,0.7};
text="";
x=0.21;
y=0.18;
w=0.59;
h=0.53;
};

class romance: RscStdText
{
style=48;
text="romance.paa";
colorText[]={1,1,1,1};
x=0.25;
y=0.22;
w=0.515;
h=0.35;
};

class NGAFrame: RscStdText
{
style=64;
text=" NOGOVA ";
font="AudreysHandB48";
x=0.23;
y=0.18;
w=0.55;
h=0.5;
};

class NGAText1: RscStdText
{
style=256;
text="OPERACE FLASHPOINT RESISTANCE";
colorText[]={1,0.1,0.4,1};
size=2.1
x=0.26;
y=0.595;
w=0.49;
h=0.06;
};

class NGAText2: RscStdText
{
style=160;
text="THE BEST GAME EVER";
colorText[]={0.6,0.2,0,1};
size=3
x=0.28;
y=0.8;
w=0.45;
h=0.06;
};
}; //při přechodu na další Zdroj jsou jen 2 uzavírací závorky

                class MujText //definování Zdroje č.2
{
idd=-1;
movingEnable=0;
duration=20;
fadein=3;
name="MyText";
controls[]={"MujText1","MujText2"};//Zdroj se skládá ze dvou
                Komponentů

//komponent1 - text
class Mujtext1: RscStdText
{
style=82;//styl textu v textur. pozadí v rámu
colorBackground[]={0,0.5,1,1};
text=" NAZDAR OFP MANIACI :-) "//mezi uvozovkami a textem
                může být mezera (odstup textu od rámu)
colorText[]={0.1,0.4,0.8,1};
font="AudreysHandB48"
size=1
x=0.26;
y=0.05;
w=0.49;
h=0.1;
};
//komponent2 - text
class Mujtext2: RscStdText
{
style=528;//styl 16 (víceřádkový text) + styl 512 (bez
                rámečku)
text="Doufám, že vám tento tutorial pomůže,\na že se budu v
                misích setkávat s novými a pěknými Zdroji.\nSvé dotazy směřujte
                do diskuse na flashpoint.Tiscali.cz"
colorText[]={1,1,0,1};
lineSpacing=1;//normální mezery mezi řádky
size=2
x=0.26;
y=0.30;
w=0.4;
h=0.4;
};
};
};
________________________________________________________________________________
Zde nekopírujte! Mohlo by to způsobit chybovou hlášku. Použijte
                description.ext v přiložené misi.
Každému Komponentu jsem zadal jiný styl a tak si jich budete
                moci v ukázkové misi (která je ke stažení z :

                http://games.tiscali.cz/flashpoint/tutorials/ofptutorial28/Zdroje.Noe.zip
                ) prohlédnout 7.
Nyní už je to opravdu vše. Doufám, že vám to pomůže a
                "okořeníte" své mise zajímavými Zdroji.


Tutorial #30

Tutoriál o podmínkách
Autor : Didymos
Download = Tento tutorial + ukázka

Muttley nás požádal o napsání tutoriálu, který by se zabýval podmínkami. Toto je ale velmi těžký úkol, protože podmínek může být opravdu mnoho. Z E-mailu, který Muttley napsal, jsem pochopil, že mu jde o podmínku, kterou vyskočí z nějaké smyčky. Na začátek bychom si mohli slovo podmínka nějakým způsobem definovat. Podmínka je v podstatě věc, která podmiňuje něco jiného, tudíž je na něčem jiném závislá. Bez toho něčeho, co podmínka podmiňuje, by byla podmínka zbytečná. Jednoduše řečeno se nestane daná věc, dokud se nenaplní určitá podmínka nebo naopak se bude jistá věc dít, dokud se nenaplní podmínka pro její skončení. Co se ale editace v OFP týče, tak tady bychom našli opravdu velmi mnoho podmínek a v podstatě by se dalo říct, že celá hra je na podmínkách založená, protože dokud nesplníte úkol (což je také podmínka), tak se např. neukončí mise. Teď bych mohl do nekonečna pokračovat ve výčtu podmínek. Jak jsem ale psal na začátku, tak dotaz, který byl vznešen se týká nějaké určité podmínky. Já bych to převedl na kamerové podmínky, kde se to dá alespoň trochu ukázat. V této souvislosti mě napadá asi ta nejjednodušší podmínka, kterou je podmínka časová, vytvoříme si kameru, která bude z pozice objekt1 sledovat objekt2:

_CameraPos = getpos objekt1
_cmx = (_CameraPos select 0)
_cmy = (_CameraPos select 1)
_cmz = (_CameraPos select 2) + 1
_cam = "camera" CamCreate [_cmx,_cmy,_cmz]
_cam CameraEffect ["Internal","back"]
_cam CamCommit 0
_cam CamSetTarget objekt2
_cam CamSetFov 0.5
_cam CamCommit 0
@camCommitted _cam
~4

To celé bude probíhat po dobu 4 sec. Což je právě podmínka úplně na konci v posledním řádku. (~4)
Budeme pokračovat dál, kdy kamera sleduje vozidlo (pojmenované vozidlo, z pozice hacko1) a chcete, aby ho sledovala tak dlouho, dokud ho neopustí (v tomto případě) vojak. Když hned pod to přidáte podmínku časovou (~3), tak tam kamera vydrží ještě další tři vteřiny. Hned máte jistotu, že se kamera nepředběhne a že tam vydrží opravdu do doby, než se nenaplní podmínka opuštění vozidla a následně ještě pak 3 sec. jak je vidět tady:

_CameraPos = GetPos hacko1
_cmx = (_CameraPos select 0) - 50
_cmy = (_CameraPos select 1) + 30
_cmz = (_CameraPos select 2) + 1.7
_cam CamSetPos [_cmx,_cmy,_cmz]
_cam CamSetTarget boing1
_cam CamSetFov 0.4
_cam CamCommit 0
@camCommitted _cam
@not (vojak in vozidlo)

Můžete zadat do posledního řádku kamery např.:

@neco

kde neco je proměnná, která dokud nenabude hodnoty true, nebude vytvořena podmínka pro pokračování. Jakým způsobem, jestli do spínače nebo scriptu nebo kamkoli jinam hodnotu něco=true zadáte záleží už jen na Vás. Důležité ale je někde na začátku zadat hodnotu neco na false. (neco=false) Nejlépe do "init.sqs".
Jestliže napíšete do posledního řádku tuto podmínku:

@not alive vojak

Kamera bude sledovat zadaný objekt do doby, dokud bude žít vojak. (not alive vojak) Dalším jednoduchým příkladem je podmínka, kdy bude kamera sledovat jednotku dem1 z pozice objekt do doby, než splní nějaký dříve zadaný příkaz. Přímo tady jsem zadal jednotce dem1 příkaz k položení nálože (dem1 fire ["put", "pipebomb"] ), až to dokončí (@unitready dem1) pokračuje dalším příkazem a to přesunem k nějakému objektu v editoru podle čísla ID. (dem1 move [GetPOs object 137398 select 0, GetPOs object 137398 select 1]) Poté tam kamera vydrží ještě další dvě vteřiny, (~2) než bude pokračovat.

_CameraPos = GetPos objekt
_cmx = (_CameraPos select 0) + 5
_cmy = (_CameraPos select 1) - 5
_cmz = (_CameraPos select 2) + 1
_cam CamSetPos [_cmx,_cmy,_cmz]
_cam CamSetTarget dem1
_cam CamSetFov 0.7
_cam CamCommit 0
@camCommitted _cam
dem1 fire ["put", "pipebomb"]
@unitready dem1
dem1 move [GetPOs object 137398 select 0, GetPOs object 137398 select 1]
~2

Dalším příkladem je ukončení kamery zachycené za vozidlo:

#let _CameraPos = getpos ah
_cmx = (_CameraPos select 0) +2
_cmy = (_CameraPos select 1) - 5
_cmz = (_CameraPos select 2) + 1.7
_cam = "camera" CamCreate [_cmx,_cmy,_cmz]
_cam CameraEffect ["Internal","back"]
_cam CamSetTarget ah
_cam CamSetFov 0.7
_cam CamCommit 0
~0.01
? NOT (zrus) : goto "let"

Kamera bude sledovat vozidlo ah do doby, než se proměnná zrus nenaplní na true. Nesmíme opět zapomenout někde na začátku skriptu zanést: zrus=false! (init.sqs)
Na další ukázky podmínek použiji jednu starší Ruprtovu ukázkovou misi, na které je to zcela zřejmé. Máme tu tři vozidla: hummer, motorku a letadlo. Kamera začíná zavěšená za hummrem (v1) a to takto:

_CameraPos = getpos v1
_cmx = _CameraPos select 0
_cmy = _CameraPos select 1
_cmz = _CameraPos select 2
_cam = "camera" CamCreate [_cmx - 20,_cmy - 200, 1.5]
_cam CameraEffect ["Internal","Front"]
_cam CamSetTarget v1
_cam CamSetFov 0.5
_cam CamCommit 0
@CamCommitted _cam

#Jizda1
_cam CamSetRelPos [0, -10, 1.5]
_cam CamCommit 0
~0.01
? (v1 Distance v2) > 35 : GoTo "Jizda1"

Jak je vidět, tato kamera bude následovat hummer a to do doby, než se podmínka naplní. Tady ta doba nastane, když se vozidlo v1 (hummer) přiblíží k vozidlu v2 a to na vzdálenost 35m. Po naplnění této podmínky bude kamera sledovat vozidlo v2 v našem případě motorku.

_cam CamSetRelPos [0, 9, 1.5]
_cam CamSetTarget v2
_cam CamCommit 1
@CamCommitted _cam

_mytime = _time
#Jizda2
_cam CamSetRelPos [0, 10, 1.5]
_cam CamCommit 0
~0.01
? _time < (_mytime + 15): GoTo "Jizda2"

Zde se podmínka naplní po uplynutí času 15 sec. Po té následuje pomalé a plynulé přiblížení k letadlu a1:

_cam CamSetTarget a1
_cam CamCommit 4
@CamCommitted _cam

dive = 0
_dy = - 300
_dz = 0 - (GetPos a1 Select 2) + 1.5
#Approach
_cam CamSetRelPos [-20, _dy, _dz]
_cam CamCommit 0
@CamCommitted _cam
~0.01
_dy = _dy + 1
_dz = _dz + 1
? _dz >= 0: _dz = 0
? _dy < -20 : GoTo "Approach"

#Loop1
_cam CamSetRelPos [-20, -20, 0]
_cam CamCommit 0
~0.01
? dive == 0 : GoTo "Loop1"

Tady ukázková mise končí. Tímto jsem chtěl naznačit, že opravdu záleží na vaší fantazii, kolik podmínek tady vytvoříte. Je doufám jasné, že se podmínky nevztahují pouze na kamery, už v samotném spínači je kolonka s názvem podmínka, která je řekl bych hodně podobná s těmito podmínkami pro kameru. Když si třeba vytvoříte spínač, který bude mít v kolonce Podmínka:

west1 distance east1<20

a do pole Pří aktivaci zadáte:

[west1, east1] exec "poplach.sqs"

pak se stane to, že v případě, kdy se přiblíží west1 k east1 na vzdálenost 20m., spustí se skript s názvem poplach. Co zadáte do tohoto skriptu, už záleží na vás. Může to být třeba pouhý text, ale s trochou důvtipu přidají podmínky tohoto typu na kvalitě celé mise. Pozor ale na to, aby se vám jednotlivé podmínky neprolínaly a především na to, aby nebyla nějaká podmínka závislá na dokončení celé mise!!! Naopak, jestliže je dokončení mise závislé na životě nějaké jiné osoby, zadáte do pole Podmínka ve spínači:

not alive vip

a do pole Typ zadáte Prohra. Tady se stane to, že v případě ztráty vip se mise ukončí prohrou. Pak už stačí vytvořit scutscénu Outro - prohra.
Tohle je o podmínkách ode mě vše. Teď tu mám ještě doplněk Ruprta o strukturovaných podmínkách, které jsou od verze 1.75.

Strukturovaná podmínka

S verzí hry 1.75 a vyšší nám BIStudio dalo do rukou nový nástroj na vytváření podmínek a to strukturovanou funkci If… Then …Else a While … Do.

Každý skriptovací příkaz nebo funkce v souborech skriptů *.SQS (v to počítaje i podmínky) je vykonán pouze v případě, že příkaz včetně jeho parametrů a argumentů je umístěn na jednom řádku, případně může být uvedeno na jednom řádku více příkazů, musí však být odděleny středníkem. Nelze tedy vykonat jeden příkaz zapsaný v jednom řádku s parametrem uvedeným v jiném řádku. Tento způsob programového zpracování příkazů se nazývá "řádkově založený skript" (Line Based Skript). Tento způsob však do značné míry omezuje programovací možnosti daného jazyka.
Oproti tomu výše uvedené strukturované funkce If… Then … Else a While… Do mohou být vykonány i když jsou zapsány na neomezeném počtu řádků. Toto se nazývá "víceřádkově založený script" (Multiline Based Skript) V tomto případě však je nutné funkce umístit do souboru s příponou SQF nikoli SQS. Zároveň berte na vědomí, že ne všechny výrazy skriptovacího jazyka hry OFP mohou být ve skriptech funkcí vykonány, např. nelze v nich použít prodlevu (~číslo nebo &číslo), neboť funkce je vždy vykonána jako celek, nikoli jako soubor několika příkazů.
Tyto funkce pak mají poněkud odlišnou syntaxi :

If (podmínka) Then {výraz1} Else {výraz2}
| podmínka ->| | tělo funkce -------------->|

Přeloženo do češtiny to znamená:
Pokud (podmínka) vrátí TRUE pak(THEN) udělej {výraz1}, jinak (ELSE) udělej {výraz2}. Výrazy 1 i 2 musí být uzavřeny v kudrnatých závorkách (správně) nebo v uvozovkách (nedoporučuji).

While "podmínka" Do {výraz} | podmínka ------>| | tělo funkce->|

Přeloženo do češtiny to znamená :
Pokud "podmínka" vrací TRUE vykonávej pořád dokola {výraz}. Maximální počet opakování je stanoven na 10.000. Pokud se smyčka zopakuje 10.000x a podmínka stále vrací TRUE, smyčka se ukončí a je zobrazena chybová zpráva.

Příklad #1 - Funkce If … Then…Else umístěná v souboru *.SQS.
Pokud je tato podmínková funkce umístěná v souboru .SQS chová se naprosto identicky jako dosud známé ? výraz : výraz .

_query = 5
_zk = 0
_zk1 = 5
_zk2 = 10
If (_query = = 5) Then {_zk = _zk1 + _zk2} Else {_zk = _zk2 - _zk1}

Výsledkem je že : _zk = 15

Naprosto stejného výsledku však dosáhnete i použitím starého dobrého :

? _query = = 5: _zk = _zk1 + _zk2; Goto "Skip"
_zk = _zk2 - _zk1
#Skip
Příklad #2 - Funkce If … Then…Else umístěná v souboru *.SQF.

Soubor funkcí *.SQF nelze spouštět pomocí příkazu Exec. Pro vykonání kódu zapsaného do souboru *.SQF je nutno použít též nově implemtované příkazy PreprocessFile nebo LoadFile, který na své místo v souboru *.SQS dosadí obsah volaného souboru *.SQF, anebo příkaz Call v kombinaci s PreprocessFile nebo LoadFile, který rovnou kód v souboru *.SQF vykoná.

Kód souboru *.SQS
_query = 5
_zk = 0
_zk1 = 5
_zk2 = 10
[] Call PreprocessFile "zkouska.sqf"

Kód souboru ZKOUSKA.SQF

If (_query = = 5) Then
{
_zk = zk1 + zk2
}
Else
{
_zk = _zk2 - _zk1
}
Výsledkem je že : _zk = 15

Protože v souborech funkcí *.SQF nemá konec řádku žádný speciální význam, musíte, pokud bude výraz obsahovat více příkazů, každý řádek výrazu ukončit středníkem, např. takto :

If (_query = = 5) Then
{
_zk = zk1 + zk2;
Player SetDamage 0
}
Else
{
_zk = _zk2 - _zk1
}
Výsledkem je že : _zk = 15 a hráč bude mít hodnotu poškození 0.

Vše co je zpracováno v souboru *.SQF je zpracováno jako řetězec. Nelze proto použít příkaz PreprocessFile nebo LoadFile jako samostatný příkaz v souboru scriptu, ale pouze jako část (výraz) funkce If … Then … Else nebo While … Do, nebo jako tělo příkazu Call. Naopak vše co je uvedeno v souboru *.SQF lze použít jako řetězcový parametr nebo argument jakékoli skriptovací funkce nebo příkazu, který takový argument podporuje. Jinými slovy, pokud by jste ve svém souboru skriptu uvedli např. :

TitleText [PreprocessFile "zkouska.sqf", "PLAIN"]

Pak se vám podle předchozího příkazu vypíše na obrazovku :

If (_query = = 5) Then{ _zk = zk1 + zk2}Else{ _zk = _zk2 - _zk1}

Příklad #3 - Funkce While… Do umístěná do souboru *.SQF.
Tento příklad doplní do hráčovi skupiny tolik vojáků, aby jich celkem celá skupina obsahovala 10.

Kód souboru *.SQS :
[] Call PreprocessFile "zkouska1.sqf"

Kód souboru ZKOUSKA1.SQF :
While "(Count Units Group Player) < 10" Do
{
"SoldierWB" CreateUnit
[
[
(Position Player Select 0) + Random 5,
(Position Player Select 1) + Random 5,
Position Player Select 2
],
Group Player
]
}

Tolik tedy od Ruprta. Jeslti pochopíte tohle, tak si myslím, že už není potřeba pokračovat a mě už stačí vám jen popřát hodně trpělivosti. Na závěr snad ještě poslední podmínku:

Abyste pochopili co tady píšu, musíte si to celé přečíst a zřejmě to nebude stačit jednou. (věta účelová, ne podmínková)

Didymos


Tutorial 29 - Konverze zvuků

Konverze zvuků
Autor : Ruprt
Download = Tento tutorial + ukázka

Poslední dobou se na mě obrací stalé více lidí s dotazem jak správně vytvořit zvuk do mise. Nejčastějším problémem s kterým jsem se v těchto dotazech setkal je, že zvuk ve formátu *.WAV vytvořený prostřednictvím standardního widnowsovského programu "Záznam zvuku" překonvertovaný do formátu *.OGG nelze ve Flashpointu přehrát (někdy nelze přehrát ani v jiných přehrávačích zvuku pro windows podporujících formáty OGG).

Zde je tedy několik rad a postupů jak správně zvuk vytvořit a konvertovat, které jsem odzkoušel na verzi hry OFP Cold War Crisis verze 1.46 a OFP Resistance verze 1.75. Verze hry by však neměla být ovlivňujícím faktorem, neboť příkazy pracující se zvukem jsou ve scriptovacím jazyku OFP obsaženy od samého začátku, tzn. od verze hry 1.0 a nebyly v průběhu vývoje hry nikterak měněny.

Nejdříve trochu teorie

OGG soubory lze rozdělit na 2 kategorie.

1. Kategorie - Konstantní bitový poměr kódování - Constant Bit Rate (tuto doporučuji používat)

Zvuk je kódaván neměnným bitovým poměrem (Constant Bit Rate), kdy po celou dobu konverze je zvuk chápán jako jediný celek a je mu tedy přiřazen jeden bitový poměr (např.86Kbps) (určený autorem)

2. Kategorie - Proměnný bitový poměr - Variable Bit Rate

Při kódování proměnným bitovým poměrem (Variable Bit Rate) dochází při ukládání do souboru na rozdělení zvuku na tisíce malých částeček (Frames), přičemž každé jedné z nich je přiřazena různá hodnota Bit Rate, a to v rozsahu od Min Bit Rate do Max Bit Rate(Maximální a minimální hodnota je určena autorem zvuku). Kódovací program pak sám rozhoduje o tom, které částečce přiřadí určitou hodnotu Bit Rate. Prakticky se jedná o to, že program se rozhodne sám, kdy daná částečka může být uložena s nižším Bit Rate a ještě neztratí určitou kvalitu a kdy je zapotřebí uložit více dat pro dosažení dané kvality. Tímto způsobem lze dosáhnout menší velikosti výsledného souboru (na úkor kvality), avšak během tohoto procesu může docházet k chybám (musím konstatovat, že mě se to ještě nestalo a je to zřejmě zřídkavý jev, ale OFP je velmi citlivý na přehrávání zvuků, a proto tento fakt nelze ignorovat).

Co je to Bitový poměr - Bit Rate

Bitový poměr je množství dat (v 1000 bitech za sekundu - 1000 Bits per second - 1Kbps), která budou přehrávačem zvuku zpracována za jednu sekundu. Je tedy zřejmé, že čím nižší hodnota Bit Rate, tím nižší je výsledná kvalita zvuku, neboť aby bylo dosaženo tvůrcem zvuku požadované délky zvuku (nikoli souboru), musí se uložit do souboru méně dat, což způsobuje ztrátu kvality, na druhou stranu se tím zase zmenšuje velikost souboru. Každý datový bit zvukového souboru totiž musíte chápat jako jednu charakterovou vlastnost daného zvuku, z čehož pak vyplývá, že čím méně charakterových vlastností určíte, tím horší a nepřesnější je výsledný obraz (toto pravidlo platí i ve všech jiných naprosto běžných oblastech života :o))

A teď již k praxi

1) Nejdříve je nutné mít nějaký program na nahrávání zvuků *.WAV (bohatě postačí standardní windowsovský "Záznam zvuku" - nabídka START-PROGRAMY-PŘÍSLUŠENSTVÍ-ZÁBAVA). Dále je nezbytné mít nainstalovaný nějaký program pro konverzi zvuků z formátu WAV do formátu OGG. Zde vřele doporučuji vyzkoušený dbPowerAmp Music Converter, který si můžete stáhnout z http://www.dbpoweramp.com/ . Tento program jsem také použil pro tento tutoriál.

2) Za použití programu "Záznam zvuku" nahrajte požadovaný zvuk WAV, a to ve formátu PCM 44100KHz 16Bitů Stereo 172kb/s (může být samozřejmě i jiný, tento navrhuji proto, že se jedná o CD kvalitu. Nepoužívejte však hodnotou frekvence nižší než 24000Hz). Následně si ho uložte např. jako "zkouska.wav".

3) V průzkumníku Windows pak najděte Váš soubor zkouska.wav a klikněte na něj pravým tlačítkem myši. Měla by se Vám objevit místní nabídka mezi jejímiž položkami by se měla objevit i položka Convert To(samozřejmě pokud máte nainstalovaný dbPowerAmp Music Converter). Kliknutím zvolte tuto položku. Následně se vám objeví další nabídka s možností výběru formátu [image], do kterého chcete soubor zkouska.wav zkonvertovat. Vyberte Ogg Vorbis a objeví se Vám dialogové okno programu dbPowerAmp Music Converter.

Pokud jsou hodnoty v okně nastaveny jinak než v tomto obrázku, změňte je tak aby tomuto obrázku odpovídaly. Poté klikněte na tlačítko Convert. Následně se vám objeví lišta zobrazující průběh konverze, přičemž po dokončení procesu stiskněte tlačítko Finished. Zkonertovaný soubor "zkouska.ogg" by jstte měli najít ve stejném adresáři jako je soubor "zkouska.wav".

No a to je vše co s týče konverze. Doporučuji si s nastavením tohoto programu trochu pohrát, aby jste pochopili závislost kvality zvuku a velikosti souboru na zadaném nastavení. Uvědomte si totiž, že pokud si má Vaše mise na internetu někdo stáhnout tak jistě nebude mít zájem downloadovat nějaký 10MB balík. Vaše mise by pak nemusel nikdo hrát, přestože by byly technicky i herně skvělé.

Teď je ještě nutné soubor zkouska.ogg zkopírovat do adresáře Vaší mise, ve kterém si pro přehlednost vytvořte ještě podadresář "Sounds" a do tohoto podadresáře soubor zkopírujte. Následně musíte správně zvuk definovat v souboru description.ext.

Příklad description.ext pro použití zvuku v radiové hlášce :

class CfgRadio
{
sounds[]={zkouska};
class zkouska
{
name = "";
sound[] = {"\Sounds\zkouska.ogg", db+0, 1.0};
title =;
};
};

Zvuk pak v misi spusťte příkazem např. voják SideRadio "zkouska"

Příklad description.ext pro použití zvuku s příkazem PlaySound :

class CfgSounds
{
sounds[] = {zkouska};
class zkouska
{
name = "";
sound[] = {"\Sounds\zkouska.ogg", db+0, 1.0};
titles[] = {};
};
};

Pozor na rozdíl v zápisu vlastnosti Title (u CfgRadio) a Titles[] (u CfgSounds).

Zvuk pak v misi spusťte příkazem např. PlaySound "zkouska"

No a to je vše. Pokud jste postupovali správně a program dbPowerAmp Music Converter máte správně nainstalovaný, měl by se zvuk v misi bez problému přehrát. A zde si můžete stáhnout ukázku s oběma formáta zvuku WAV i OGG.


Tutorial #6

Práce s kamerou - #1
Autor : MAA

Práce s kamerou
V tomto tutoriale si vysvetlíme základné práce s kamerou použitím scriptu. Vytvoríme si malú scénku, kde bude ruský vojak cez ďalekohľad sledovať dianie v nepriateľskom tábore. Na konci tohoto tutoriálu nájdete odkaz na download scriptu aj misie.

Tak úvod máme za sebou a je na čase vysvetliť si, čo je to vlastne script.
Script je externý súbor (vytvorený mimo prostredia editoru OFP), ktorý je napísaný v programovacom jazyku, ktorému engine hry rozumie. V OFP sa na jeho programovanie používajú špeciálne príkazy, ktorých význam a použitie nájdete na našej stránke v sekcii PRÍKAZY.
Teraz, keď už viete (aspoň dúfam) čo je to script, tak pristúpime k vytvoreniu misie, v ktorej script použijeme. Najskôr si na ostrove EVERON, severne od Montignacu vytvoríme kúsok od stromov vojaka:

STRANA [SIDE]: VÝCHOD [EAST]
TRIDA [CLASS]: MEN
OVLADANI [CONTROL]: HRÁČ [PLAYER]
HODNOST [RANK]: VOJÍN [PRIVATE]
JEDNOTKA [UNIT]: VOJÁK [SOLDIER]
NAZEV [NAME]: Hrac
AZIMUT: 180

Do políčka PŘI AKTIVACI zadáme:

this SetBehaviour "AWARE"; this AddWeapon "BINOCULAR"

Potom si pri budove na okraji vytvoríme dvoch amerických vojakov:

STRANA [SIDE]: ZÁPAD [WEST]
OVLADANI [CONTROL]: NEMUŽE HRÁT HRÁČ [NOT PLAYABLE]
HODNOST [RANK]: ČETAŘ [SERGEANT]
JEDNOTKA [UNIT]: DUSTOJNÍK [OFFICER]
NAZEV [NAME]: WEST1

STRANA [SIDE]: ZÁPAD [WEST]
TRIDA [CLASS]: MEN
OVLADANI [CONTROL]: NEMUŽE HRÁT HRÁČ [NOT PLAYABLE]
HODNOST [RANK]: VOJÍN [PRIVATE]
JEDNOTKA [UNIT]: VOJÁK [SOLDIER]
NAZEV [NAME]: WEST2

Nastavíme im AZIMUT tak, aby boli otočený ako na obrázkoch a do políčka PŘI AKTIVACI obom zadáme:

this SetBehaviour "SAFE"

A neďaleko od nich si dáme tank M-60:

STRANA [SIDE]: ZÁPAD [WEST]
TRÍDA [CLASS]: ARMORED
HODNOST [RANK]: VOJÍN [PRIVATE]
JEDNOTKA [UNIT]: M60
NAZEV [NAME]: WEST_TANK

Tanku do políčka PŘI AKTIVACI zadáme:

this SetBehaviour "SAFE"; this SetSpeedMode "LIMITED"

Pomocou F2 ich všetkých "odgrupujeme"

Význam jednotlivých nastavení a použitých príkazov by ste už mali poznať z predchádzajúcich tutoriálov okrem príkazu SetSpeedMode. Týmto príkazom nastavujeme počiatočnú rýchlosť jednotky. Tu sme ju pre lepśí efekt nastavili na najpomalšiu hodnotu.

Ešte tanku vytvoríme dva waypointy:

Prvý:

TYP: PRESUN [MOVE]
TIMEOUT MIN:5 a MAX:10

Druhý:

TYP: ZACYKLENÍ [CYCLE]
TIMEOUT MIN:5 a MAX:10

Všetko by malo vizerať ako na obrázcích.
Teraz si misiu uložíme pod názov test3 a vyskúšame pomocou tlačítka ZKUSIT. Hráč by mal stáť pri stromoch. Americký vojaci by mali v pokoji stáť a tank by sa mal pomaly pohybovať po svojich waypointoch.

A nastal čas dostať sa k samotnému scriptu. Jeho úplné znenie nájdete na konci tohoto tutoriálu. My si teraz postupne vysvetlíme jednotlivé príkazy. Pomocou windowsáckej kombinácie ALT+TAB sa prepneme z OFP do Windowsu a spustíme si program NOTEPAD, WRITE alebo podobný software na editáciu textových súborov (POZOR ! nedoporučujem WORD, ADOBE ACROBAT a podobné programy). Po skončení editácie si súbor uložíme s názvom camera.sqs do adresára, kde máme uloženú misiu: OPERATIONFLASHPOINT\USERS\vaše meno\MISSIONS\TEST3.EDEN

Popredu upozorňujem programátorsky zdatných jedincov, že som pre čo najjednoduchšie vysvetlenie pre menej zdatných jedincov použil nie presné výrazy na pomenovanie niektorych akcií. Preto ma prosím, za to nekameňujte.

Teraz už teda môžeme pristúpiť k samotnému vytváraniu scriptu. Najskôr vypíśem časť scriptu a potom k nej napíšem svoj komentár.

; priklad na vytvorenie cutsceny pomocou scriptu
_CameraMan = Hrac
_Actor1 = WEST_TANK
_Actor2 = WEST2
_Actor3 = WEST1

Tu sme si určili do lokálnych premenných (začínaju sa "_") objekty kameramana a hercov. Keby sme nepoužili podtrhovník, tak by hra chápala tieto premenné ako globálne, ktoré sú prístupné počas celej misie a zbytočne by nám zaťažovali celý systém, keď ich už viac nepotrebujeme.
Ja si premenné označujem anglickými názvami, vy si ich tak nazvite tiež, aby nevznikli neskôr problémy. Hercov (Actor) si určím jednotky WEST_TANK, WEST2 a WEST1. Kameraman (CameraMan) bude náš Hrac.
Znaky za bodkočiarkou (středníkom) sú ignorované a slúžia nám na robenie poznámok v scripte.

_CameraPos = getpos _CameraMan
_cmx = _CameraPos select 0
_cmy = _CameraPos select 1
_cmz = _CameraPos select 2

Týmto sme si určili východziu pozíciu na vytvorenie kamery. Získali sme ju pomocou príkazu GetPos , ktorý nám zistí aktuálnu pozíciu hráča (CameraMana). Keďže tento príkaz nám vráti údaje v takzvanom poli, musíme si ich z neho nejako vybrať. Čo je to pole, sme si vysvetlili v jednom z predchádzajúcim tutoriálov. Pole má asi takýto tvar: [údajX, údajY, údajZ]. Na výber údajov z poľa nám poslúži príkaz select. Jeho pomocou sme si z tohto poľa vytiahli X, Y a Z súradnice. Kto pozná aspoň troška určovaie pozície v priestore vie, že sa na to používajú tieto 3 súradnice.
Tak a ideme ďalej.

_cam = "camera" CamCreate [_cmx,_cmy,_cmz+2]

Premenná _cam je vlastne niečo ako názov našej kamery. Príkazom CamCreate si ju vytvoríme na určených súradniciach (k Z súradnici si pridáme 2 metre, aby sme mali pohľad zhruba vo výške očí). Na výber máme ešte druh kamery. Sú iba dva, a to " camera" ako normálna kamera a "seagull" ako pták čajka (racek).

_cam CamSetTarget _Actor1
_cam CameraEffect ["Internal","Back"]

Tu sme si určili objekt nášho záujmu (čiže herca) a dali pohľad do kamery.

_cam CamCommit 0

V tejto časťi je asi najdôleźitejší príkaz. CamCommit nám aplikuje všetky nastavenia alebo zmeny na našu kameru (0 znamena aplikovať zmeny ihneď). Bez neho by sa nám neudialo absolutne nič, takže si ho dobre zapamätajte.

CutRSC ["Binocular","Plain Down",100]
_zoom = 0.7

CutRSC slúži na výber efektu priamo zo zdrojov hry. Nám dobre poslúži pohľad cez ďalekohľad. Jeho priblíženie nestavujeme od 0 po 1. Premennej _zoom sme dali hodnotu 0.7.

#ZoomIn
_zoom = _zoom - 0.01
_cam CamSetFov _zoom
_cam CamCommit 0
~0.01
? _zoom < 0.1 : goto "Cakaj"
goto "ZoomIn"

Tuto máme prvý príklad procedúry. Kde #ZoomIn je jej názov na ktorý sa môźeme (ako na nejakú zarážku) odvolávať. Na preskoky medzi jednotlivými procedúrami slúźi goto. Cez CamSetFov si nastavíme priblíženie pohľadu kamery. Za ? píšeme podmienku, po ktorej splnení sa nám spustí príkaz za ":". U nás zisťujeme hodnotu premennej _zoom, a ak tá bude menšia ako 0.1, tak prejdeme na procedúru Cakaj.

#Cakaj
TitleText ["Vidim nepriatelsky tank", "plain down"]
~13
goto "Klikovanie"

Touto procedúrou si nastavíme, koľko budeme čakať než sa spustí ďalšia procedúra. Za "~" dáme časový údaj v sekundách. Pomocou TitleText si urobíme výpis textu na obrazovku.

#ZoomOut
_zoom = _zoom + 0.01
_cam CamSetFov _zoom
_cam CamCommit 0
~0.01
? _zoom > 0.7 : goto "Koniec"
goto "ZoomOut"

Táto procedúra nám slúži na oddialenie pohľadu. Používame v nej už vysvetlené príkazy.

#Klikovanie
_cam CamSetTarget _Actor2
_cam CamCommit 2
@CamCommitted _cam
_Actor2 PlayMove "EffectStandSalute"
_Actor3 PlayMove "EffectStandSaluteEnd"
_Actor2 PlayMove "FXStandDip"
~10
goto "ZoomOut"

V tejto zase najskôr nastavíme ako herca jednotku WEST2. Cez CamCommit nastavíme aplikovať zmeny kamery plynulým prechodom na WEST2 v trvaní dvoch sekúnd. Na príkaze @CamCommitted čakáme až sa nám kamera dostane do určenej pozície. Príkazom PlayMove si spustíme animáciu salutovania a klikovania. Herec2 nám urobí na kameru zopár klikov.
Všetky animácie nájdete postupne medzi príkazmi (v dodatkoch) na našej stránke.

#Koniec
~2
CutRSC ["Default","Plain Down",100]
_cam CameraEffect ["Terminate","Back"]
CamDestroy _cam
Exit

Na záver scriptu si vrátime pohľad naspäť do nášho vojaka. Na odstránenie pohľadu cez ďalekohľad použijeme parameter "Default" v príkaze CutRSC a na vrátenie pohľadu do vojaka zase parameter "Terminate" v príkaze CameraEffect. Potom nám už stačí iba kameru úplne odstrániť pomocou CamDestroy.

Teraz už nám zostáva iba tento script spustiť. Robí sa to pridaním príkazu exec do políčka PŘI AKTIVACI. Scripty môžeme spúštať aj z ktoréhokoľvek waypointu alebo triggeru. Celý výraz v políčku nášho vojaka bude nasledovný:

this SetBehaviour "AWARE"; this AddWeapon "BINOCULAR"; [] exec "camera.sqs"

Toto by bolo o používaní kamery v scriptoch na začiatok asi všetko. Ešte sme nevyčerpali všetky prostriedky na vytváranie vlastných cutscén, preto sa budeme v niektorom z ďaších tutoriálov zaoberať príkazmi na používanie mimiky a zvuku v dialógoch a pokúsime sa vytvoriť si INTRO a OUTRO k nejakej jednoduchej misii.
Dúfam, že ste používanie kamier aspoň trocha z tohoto tutoriálu pochopili a v nasledujúcich tutoriáloch tak nebudete mať problémy pochopiť používanie ďaľších príkazov.

Zdroják scriptů si můžete stáhnout na http://games.worldonline.cz/flashpoint/tutorials/ofptutorial6/test3.Eden.zip


Tutorial #32 - Práce s kamerou

Práce s kamerou - #2
Autor : Didymos
Download = Tento tutorial + ukázka

Málokdo tuší, že samotný editor v sobě ukrývá kameru, se kterou se dá velmi dobře pracovat. Jen mě opravdu překvapuje, že o tom za celou éru OFP ještě nikdo nenapsal ani čárku. Buď to bylo velmi dobře střežené tajemství, protože jak se brzy dočtete, má to určitý ochranný prvek nebo to je prostě jen náhoda. Nebýt Paladina, asi by ještě pár dní trvalo, než bych se o tom dozvěděl, nicméně to někde prasklo, protože už mi o tom psali i jiní. Já se tu nebudu dále udivovat nad tím, proč to už dávno není na světě a nebudu ani přemýšlet, kolik hodin práce by mi to ušetřilo [image] a přejdu k samotnému vysvětlení.

Jediné co potřebujete, je vytvořit si v editoru nějaký objekt, může to být klidně přímo hráč. Já osobně používám imaginární jednotu pro lepší mobilitu. Poté si vytvoříte spínač s nějakou rozlohou a spojíte ho přes F2 s hráčem. Pak už stačí do pole při aktivaci spínače napsat:

cam Exec "camera.sqs" (kde cam je jméno imaginární jednotky)

pak stačí zapnout misi a kamera se vám objeví 2 metry nad touto jednotkou. V případě, že místo cam napíšete jméno jiného objektu, objeví se vám kamera nad tímto objektem. Jak jednoduché a prosté. Pozor ale na to, abyste v adresáři s vaší misí neměli skript se jménem camera.sqs, protože v tomto případě to nefunguje!!! (zajímavé [image] ) Teď se můžete volně pohybovat v celém prostředí OFP pomocí těchto kláves:

šipky = dopředu, dozadu, doprava, doleva
šipky na numerické klávesnici (8, 2, 6, 4) = vám umožní otáčení nahoru, dolů, doprava a doleva
+ a - na numerické klávesnici = přiblížení a oddálení
E nebo to, jak máte nastavený sprint při hraní = rychlé posunutí dopředu
X = rychlý pohyb doleva
C = rychlý pohyb doprava
Q = pohyb nahoru
Y (na české klávesnici) = pohyb dolů
L = vypne středový záměrný kříž
mezerník = kamera zaměří cíl, na kterém je záměrný středový kříž
V = vypne kameru a vrátí vás do hry

Teď už jen stačí nastavit polohu kamery tak, jak si přejete a zmáčknout klávesu: levé Ctrl. Tímto jste právě uložili pozici kamery. Tuto pozici najdete ve složce OFP, která je standardně: "C:\Program Files\Codemasters\OperationFlashpoint..". Tady najdete soubor:

clipboard.txt

V tomto textovém souboru bude vámi právě uložená pozice ve formátu např.:

;=== 16:42:30
_camera camSetTarget [9986.08,114134.09,27.64]
_camera camSetPos [9986.08,4134.09,2.00]
_camera camSetFOV 0.700
_camera camCommit 0
@camCommitted _camera

Tím máte definovanou pozici kamery na těchto souřadnicích:

_camera camSetPos [9986.08,4134.09,2.00]

cíl kamery je na souřadnicích:

_camera camSetTarget [9986.08,114134.09,27.64]

Další řádek udává přiblížení:

_camera camSetFOV 0.700

Implicitní nastavení je 0.700 a přiblížit můžete podle libosti. Za jak dlouho se přiblížení provede, je definované v dalším řádku:

_camera camCommit 0

je to hodnota v sec. a tady je 0. Toto číslo neudává pouze přiblížení, ale i přesun kamery v sec. na další pozici. Další pozici kamery získáte opět stisknutím klávesy Ctrl. Poslední řádek chápu jako jakousi kontrolu ukončení kamery, jestliže na další řádek napíšete:

~5

kamera vydrží na určeném místě ještě dalších pět sekund. Zde se dají zadávat samozřejmě i jiné hodnoty viz tutoriál o podmínkách.

Co to celé znamená? Vám stačí nastavit v editoru pozici kamery tak, jak si přejete. Tuto pozici uložíte ( levé Ctrl) a můžete přejet pomocí šipek na další pozici kamery. Opět uložíte aktuální pozici. Přepnete se do souboru clipboard.txt a obě pozice kamery tady najdete s příslušným časem vašeho uložení. Teď už záleží pouze na vás samotných a především na vaší fantazii, jestli to budou dvě samostatné pozice nebo jestli kamera plynule přejde z první pozice na pozici druhou v době, jakou zadáte do řádku:

_camera camCommit 0

Můžete provést přiblížení, které provedete pomocí + a - na numerické klávesnici. Opět je potřeba místo 0 v tom samém řádku nastavit dobu přiblížení, jak jsem psal výše. Pokud se přiblížíte zaměřovacím křížkem uprostřed monitoru k nějakému vámi vytvořenému a pojmenovanému objektu a zmáčknete mezerník, kamera se automaticky na tento objekt zaměří a vy uvidíte jakýsi čtvereček. Když tuto polohu uložíte, uvidíte, že se vám neuložil cíl v podobě souřadnic, ale bude tam jméno právě tohoto objektu.

Tak to by bylo ve stručnosti k práci s kamerou. Teď vás bude zřejmě zajímat, jak se na ten filmeček podíváte. Předně musíte dostat hráče z dosahu spínače, který spouští kameru, pak si buď vytvoříte soubor init.sqs v adresáři s vaší misí anebo jakýkoli jiný skript, který ovšem musíte nějakým způsobem vyvolat. Soubor init.sqs se spouští sám okamžitě po spuštění mise. Nefunguje ale v intru, tady funguje jiný a to s názvem: initIntro.sqs ten se vám spustí okamžitě po spuštění intra. Teď už vám zbývá pouze kameru vytvořit, což musíte udělat na samotném začátku skriptu. Založení kamery vypadá takto:

_camera = "camera" camcreate [0,0,0]
_camera cameraEffect ["internal","back"]

a poté už můžete zadávat samotné pozice kamery. Na konci vaší práce je zase potřeba kameru zrušit, což se dělá takto:

player cameraEffect ["terminate","back"]
camDestroy _camera

Pro lepší efekt je lepší ještě nad tyto řádky obraz plynule ztmavit takto:

titleCut ["","BLACK OUT",3] (ta trojka na konci udává hodntou v sec. za jakou dobu se obraz plynule ztmaví)

Už toto samotné vám umožní vytvořit v OFP videa, jaká si přejete, teď vám ještě předám některé mé praktické zkušenosti, jak tuto práci co nejvíce urychlit. Aby bylo možné v OFP skriptovat kameru, je za potřebí, abyste neustále sledovali a kontrolovali, co jste právě vytvořili. To znamená napsat něco do skriptu, přepnout se do hry a podívat se, jak a co jste vlastně vytvořili. Přepínání do operačního systému a zpět do hry se dá pomocí klávesové zkraty Alt + Tab., tady vlastně můžete listovat mezi spuštěnými aplikacemi. Tento způsob přepínání ale moc nedoporučuji, protože je to velmi pomalý způsob. Mnohem lepší je spustit hru OFP přímo ve win. okně (pokud používáte Windows). K tomu, abyste to dokázali, vám poslouží velmi jednoduchá utilita, kterých najdete asi víc. Já osobně používám OFP Launcher od Kegetyse, kde si zaškrtnete tyto položky:

  • Skip splash screens - přeskočí reklamy na začátku, při spuštění hry
  • Run in a Windows - spustí hru ve win. okně

Pak už jen stačí zadat dolů cestu k exe souboru OFP, popřípadě Resistance. Tím zajistíte, že můžete v klidu skriptovat a okamžitě se dívat, jak se to chová. Klávesové zkratky Ctrl + A, Ctrl + C, Ctrl + X a Ctrl + V tu opravu popisovat nebudu. Pokusil jsem se jasně a srozumitelně vysvětlit, jak co nejjednodušeji pracovat s kamerou v editoru OFP. Pro ještě větší zřetelnost přikládám ukázkovou misi, na které to musí pochopi snad už opravdu každý. Proto, abyste vytvořili kvalitní scutscénu, ale nestačí pouze umět pracovat s kamerou, ale musíte mít určitou představivost. Musíte vytvořit a naskriptovat scény, které budete chtít natočit. Musíte tam zadat podmínky, aby se to nespustilo dříve, než vy sami budete chtít. Tohle už je ale zase věc jiná, kterou se můžeme zabývat někdy jindy, někde jinde. Pokud je celá scéna delší, rozdělte si ji na více na sobě nezávislých scén, protože asi nikoho nebude bavit dívat se na stále stejný film stále dokola jen proto, abyste na konci zjistili, kde ta kamera vlastně stojí. Proto si vytvořte na začátku kameru a pak už jen měňte její pozici s tím, že právě tvořenou scénu přesunete na začátek skriptu a až ji doděláte, umístíte ji tam, kam potřebujete. Vyhnete se tím nekonečnému sledování toho samého stále dokola.

Na závěr mi ještě dovolte, abych poděkoval Paladinovi za informace o tajemství přímo v srdci editoru a pak Ruprtovi, bez kterého si editaci už ani neumím představit.

Didymos


Práce s kamerou - Celoush

Práce s kamerou v OFP - #3

v1.0

Created by Celoush 2003

http://www.mujweb.cz/www/ofp.celoush
celoush@seznam.cz
ICQ:144701758

Obsah:

1. Kamera
2. Střihová skladba
3. Práce s herci
4. Hudba

Jelikož se často na fórech objevují lidé, kteří teprve nyní flashpoint objevují a jejich otázky se často točí kolem intro scén a hlavně kolem kamery, rozhodl jsem se napsat tento tutoriál, který by měl podrobně popsat tento postup od začátku do konce. Je tedy určen i začátečníkům. Přesto však při práci s ním předpokládám alespoň základní zvládnutí editoru. Čtenář by měl například vědět, co je to spínač, jak funguje a k čemu sou určeny její parametry.

Kamera

Jak vytvořit kameru?
Je to dosti jednoduché. První možností je využít spínačů. Toto se mi však nezdá příliš dobré, protože takové intro již v dnešní době je dosti nevzhledné a spíše ukazuje na to, že člověk, který toto intro vytvořil, je začátečník a teprve se učí. Přesto se najdou lidé, kteří dělají mise jen pomocí těchto spínačů (F3 – Efekty – Kamera).
Já se však zaměřím na jinou možnost a to možnost:

Skriptem vytvořená kamera

Co je to skript?
Skripty jsou externí soubory, které vytváříme většinou v adresáři mise (většinou c:\program files\codemasters\operationflashpoint\Users\jméno hráče\missions\název mise.ostrov\) a mají koncovku sqs.
Jsou umístěny u souboru mission.sqm, který obsahuje vlastnosti námi vytvořené mise (kde jsou jednotky, jejich názvy, spínače apod).
Jak se vyvářejí skripty?
Já je píší v klasickém poznámkovém bloku (Notepadu), ale existují i programy, které jsou určeny přímo na skripty flashpointu.
Jak se spouštějí?
Každý skript se spouští pomocí příkazu Exec. Nebudu vysvětlovat jeho syntaxi, ale uvedu příklady, ze kterých to bude určitě hned jasné.

[] exec "vybuch.sqs" ; spustí se soubor vybuch.sqs
[tank1,tank2] exec "vybuch.sqs" ; spustí se soubor vybuch.sqs a předají se mu dva parametry a to tank1 a tank2, což mohou být například jména tanků.

This exec "vybuch.sqs" ; spustí se soubor vybuch.sqs a předá se mu parametr toho, kdo tento spínač (pokud je to umístěno ve spínači) spustil.
Je myslím jasné, jak se skripty spouštějí a proto bych rád upozornil na několik významných skriptů.
InitIntro.sqs – soubor příkazů, který hra načte před spuštěním Intra.
Init.sqs – soubor příkazů, který hra načte před spuštěním samotné mise.
Exit.sqs - soubor příkazů, který se volá bezrostředně po ukončení mise, ještě před debrífingem. Volací argument je [end #], kde # je číslo konce hry shodné s nastavením spínače TYP -> KONEC č.#
Dále je možné využít i soubory onPlayerKilled.sqe a onFlare.sqs, ale pro tento tutoriál asi nejsou tak důležité. Přesto pokud je chcete využít tak si je najděte v OFPEditorHelpu od Ruprta.

Takže teď už víte co je to skript, jak ho spustit a jaké jsou významné skripty.
Uvedeme si malý příklad. Předpokládám, že chcete vytvořit intro k misi. Vytvoříte v notepadu soubor intro.sqs a otevřete si ho k editaci.
Na každý řádek pak umisťujete jeden příkaz, který chcete, aby skript udělal.
A právě sem budu umisťovat příkazy jež slouží k vytvoření kamery a její inicializaci. Postupně pak k zaměřování a přesouvání.
Na začátku doporučuji dát tyto tři příkazy, abyste si zajistili, že pokaždé bude skript bude vypadat co nejvíce podobně tomu, jak jste ho vytvořili sami.
setviewdistance 700 ; nastaví maximální viditelnou vzdálenost v metrech
0 setfog 0 ; nastaví změnu mlhy ve hře (první parametr před příkazem je za kolik sekund má ke změně dojít a druhý je intenzita mlhy 0-jasno, 1-úplná mlha)
0 setOvercast 0 ; nastaví úroveň počastí (parametry jsou téměř shodné s předchozím příkazem, ale 0 je slunečno a 1 je zataženo)
Speciálně, pokud chcete déšť, je dobré použít příkaz SetRain (zase podobné, např. 60 SetRain 1 ; do 60 sekund bude silně pršet nebo 30 SetRain 0 ; do 30 sekund přestane pršet).

A nyní k samotné kameře.
K počátečnímu vytvoření kamery budeme potřebovat tyto příkazy
_camera = "camera" camCreate [5158.67,10428.86,1.63] ; vytvoří kameru na zadaných souřadnicích
_camera camSetTarget [102281.24,33846.35,4370.48] ; Kamera se bude dívat na zadané souřadnice (zde je možné zadat název jednotky a tu bude kamera sledovat)
_camera CameraEffect ["Internal","Back"] ; nastavení kamery (bez tohoto se kamera neobjeví, stačí dát jen začátku)
_camera camSetFOV 0.700 ; nastaví zaměření kamery - 0.700 je standard. Čím méně tím více jde zaměřit na detaily, čím více tím se obraz roztáhne.
_camera camCommit 0 ; kamera přesune na zadanou pozici v zadaném čase. V našem případě se vlastně vytvoří na zadaných pozicích.

Pokud se nyní divíte, jak si může někdo tyto příkazy zapamatovat, tak vězte, že to pravděpodobně nikdo nedělá zcela z paměti. Většinou se používá klasické Označit a vložit.
Rád bych ale upozornil na to, že kamera se jmenuje _camera a jedná se tedy o lokální proměnou vytvořenou pouze pro tento skript. Proto ji nejde nijak přesouvat či rušit v jiných skriptech či v samotném editoru. V tom případě bychom neměli psát to podtržítko. Doporučuji však mít kameru vytvořenou a ukončenou v jednom skriptu. Spíše pro přehlednost.
Další příkazy, které budete potřebovat jsou:
_camera camSetPos [4856.90,10429.66,19.50] ; nastaví a jen nastaví novou pozici pro kameru. Kamera bude neustále stát na svém místě.
_camera camCommit 3 ; tento příkaz tu již byl, a právě jím dojde k přesunu na nové pozice zadané předchozím příkazem. Uvedl jsem ho jen, aby bylo jasné jak se přesun provede.
@camCommitted _camera ; pomocí tohoto příkazu se čeká, až dojde ke splnění podmínky zadané za zavináčem. V našem případě se čeká, až kamera dojede na určené pozice.

Pro neznalé uvedu hodně používaný příkaz a to:
~5 ; což znamená, že editor 5 sekund vyčká.

A nakonec jak vlastně kameru ukončíme?
K tomu slouží tyto tři příkazy, stačí je tedy překopírovat a vložit.
CutRSC ["Default","Plain Down",100]
_camera CameraEffect ["Terminate","Back"]
CamDestroy _camera

Teď byste byli schopni napsat skript pro vytvoření kamery, její přesuny a ukončení, ale jde o to, kde tyto kamery mít a jak to zjistit?
Těch postupů je několik.
První, který se dříve hojně využíval a dá se využít i dnes (viz příklad) je použitím příkazu GetPos, který vrací souřadnice objektu.
(např. pozice_traktoru = GetPos traktor. Výsledkem bude, že pozice_traktoru bude tvaru například [12510.1,2551.2,0.3])
Tento parametr se pak předá místo závorek. Tohoto postupu se dá využít například proto, aby kamera byla neustále zafixovaná na nějakém objektu a třeba se jen nepatrně přesouvala. Uvedu příklad:

_i = 0 ; nastavím si pro lokální proměnou
_camera CamSetTarget m2a2 ; nastavím cíl kamery, je vhodné ji uvést před symbolickým odkazem
_camera CamSetFOV 0.700 ; také vhodné nastavit předem
#loop1 ; název symbolického odkazu (použiji později pro návrat na tento řádek v skriptu)
_CameraPos = getpos m2a2 ; do lokální proměnné si nastavím aktuální pozici objektu
_cmx = _CameraPos select 0 ; do této proměnné si dám její první parametr
_cmy = _CameraPos select 1 ; do této proměnné si dám její druhý parametr
_cmz = _CameraPos select 2 ; do této proměnné si dám její třetí parametr
_camera CamSetPos [_cmx-3.5,_cmy+25-(_i*0.05),_cmz+0.9+(_i*0.026)] ; nastavím novou pozici se zadaným odstupem a posunem. Jde to však udělat i jinak:
_camera CamSetPos [(GetPos m2a2 select 0) – 3.5, (GetPos m2a2 select 1)+25-(_i*0.05),(GetPos m2a2 select 2)+0.9+(_i*0.026)] ; což je stejné, jako předchozích 5 řádků, ale nepřehledné.
_camera CamCommit 0 ; okamžitě přesunu kameru na tuto pozici
@CamCommitted _camera ; a raději se ujistím, že tam je.
~0.01 ; počkám setinu sekundy. Je důležité ji tam mít, jinak by mohlo dojít ke zmrazení či jiným nežádoucím stavům.
_i = _i + 1 ; zvětším proměnou o jedna
?(_i<200): goto "loop1" ; a zkontroluji, zda nedosáhla určité výše (200), a pokud ne vrátím se na symbolický odkaz. Jde vlastně o příkaz if.

Tento postup se dříve dělal s tím, že se k určování pozic používalo neviditelné háčko (pro přistání vrtulníku). To však občas dělalo problémy, když jich bylo více a chtěli jsme nechat přistát vrtulník na určeném místě, kousek od kamery. Proto se dala použít i někteří používali Imaginární jednotku, což bylo vhodnější. Další problém byl cíl kamery, který musel být nastaven a to také tímto stylem. Problém byl v tom, že jak to bude nakonec vypadat se zjistilo, až po spuštění intra a pak se muselo jenom zkoušet a měnit, dokud se nenašlo požadované nastavení kamery. Byl to dosti zdlouhavý proces.

Pak se však objevil jiný systém. A to skript camera.sqs
A jak funguje? Stačí si v editoru v misi vytvořit například imaginární jednotku a pojmenovat ji například kam. Do její inicializace se pak vloží příkaz
kam exec "camera.sqs"
Je nutné aby kamera mělo jméno a to bylo pak uvedeno i v inicializace. Pokud v ní nebylo a bylo tam pouze this byli s tím občas problémy.
A co je ten camera.sqs vlastně zač?
Jde o speciální skript, který má v sobě flashpoint zabudován. Je tedy nutné, aby tento skript ve vašem adresáři neexistoval, jinak se bude spouštět on a ne námi požadovaný.
Pak po spuštění mise se nám vlastně objeví pohled kamery. Přesně tento pohled pak bude hra vytvářet. S kamerou jde klasicky otáčet (W,S,A,D,E), přibližovat (+,-), zvyšovat a snižovat (Q,Y či Z).
Takto si stačí nastavit přesnou polohu kamery a pak stisknout tlačítko CTRL.
V adresáři flashpointu (c:\program files\codemasters\operationflashpoint\) se objeví soubor clipboard.txt
A právě v tomto souboru naleznete požadované souřadnice kamery, cíle a zaměření. Stačí je tedy pouze překopírovat a použít. Dále bych rád upozornil, že pokud budete posouvat kameru a nastavovat její pozici a ukládat si ji, budou se řadit za sebe a nemusíte se tak obávat, že se vám předchozí nastavení smaže. Navíc se uloží i s časem vytvoření.
Všechny příkazy byli již uvedny, ale opakování je matka moudrosti

Např.
;=== 13:43:09 ; za středníkem se nachází poznámka, která je ignorována až do konce řádku
_camera camSetTarget [104055.88,23135.09,41.03] ; nastavení cíle kamery
_camera camSetPos [4866.27,10429.88,2.00] ; nastavení pozice kamery (musí se vytvořit počáteční nastavení)
_camera camSetFOV 0.700 ; nastavení přiblížení
_camera camCommit 0 ; přesun kamery na danou pozici v zadaném čase (nyní okamžitě)
@camCommitted _camera ; vyčkání na dokončení přesunu

Nyní bychom měli být schopni vytvořit přesnou scénu s přesuny a nastavením kamer. Doporučuji však nyní, než budete pokračovat, vyzkoušet si hrát si trochu s kamerou. Zkuste si například vytvořit jenom pár pohledů ve stylu přírodovědného dokumentu. Udělejte nějaké zajímavé pohledy na specifická místa na Nogově. Jde jen o cvičení.

Toto by mohlo pro základy stačit, ale já chci uvést i další často opomíjenou stránku Video sekvencí. Tato část je určena všem, protože se zde nachází základní filmové postupy.

Střihová skladba

Pro dokonalou vazbu dvou záběrů bude podstatné zachování jednoty prostoru; divák musí mít dojem, že oba záběry se odehrávají v témž prostoru. Zdůrazňuji, že jde o dojem diváka, protože víme, že jednotný prostor můžeme ve filmu složit z několika reálných prostorů vzájemně nesouvisejících. Podstatou zachování jednoty je, aby oba záběry obsahovaly buď jeden markantní společný prvek, nebo prvky typické pro dané prostředí nebo jednající postavy. Podstatně může pomoci zvuk a osvětlení, které jsou ovšem důležité rovněž pro zachování jednoty atmosféry. Jestliže v jednom záběru svítí slunce, nemůže v následujícím pršet,je-li v jednom záběru ulice rušná a přeplněná, nemůže být v následujícím poloprázdná. Poslední dvě věty nejsou tak podstatné, protože engine hry nám toto dokáže zajistit sám, ale je vhodné uvést si tato pravidla.
Díky enginu nám také odpadne problém jednoty rekvizit, barevné jednoty, jednoty optického vyjádření.
Spíš jako neobratnost se ve skladbě projevují kompoziční nedostatky.V okamžiku, kdy postava tvořící kompoziční těžiště je uprostřed celkového záběru, přestřihneme na jiný celek navazující v pohybu přesně na předchozí, ale postava je komponována asi ve 3/5 obrazu. Těžiště se přesunulo jen nepatrně, ve střihu nastane nepříjemný skok. Podobně střihneme-li na sebe dva detailní pohledy na týž obličej, jeden čelní, druhý tříčtvrteční profil, navíc kompozičně posunuté, není střih čistý.
Obecněji platí:pro návaznost záběrů je velice nepříjemné, jestliže se jejich náplň změní jen nepatrně. A tedy v jednom prostředí na sebe navazujeme dva stejně velké záběry dosti obtížně.

Připomeňme si, že velikost záběru zpravidla hodnotíme ve vztahu k postavě a k funkci prostředí:
VC -velký celek orientace v prostředí, jednotlivec málo registrovatelný, ztracen v krajině.Masové scény.
C - celek zachycuje přehledně místo akce, člověk je situován ve vzájemném vztahu k prostředí, podstatná je akce,nikoliv mimika -viz klasické grotesky.
PC - polocelek postava je ukázána celá, prostředí hraje druhořadou roli (ev.jako partner), možnost plného využití gestikulace „vnější hra" herce
AZ - americký záběr postava je ukázána asi po kolena, prostředí vnímáme jen prostřednictvím její akce, jinak okrajově. Běžný při dialogu několika osob.
PD - polodetail poprsí postavy, tedy obtížná gestikulace rukou, zachycuje zřetelně mimiku, prostředí vyeliminované (neostré).
D - detail většinu plátna zabírá obličej, markantní akcent na protagonistu, zpravidla pronikání „dovnitř"postavy.
VD - velký detail zachycuje podstatnou podrobnost části lidské postavy (oči,ruka), nebo podobně jako D zdůrazňuje důležitou rekvizitu.

Vrátíme-li se v souvislosti s tímto rozdělením ke konstatováni, že malé změny v obsahu záběru jsou nežádoucí, vidíme, že nebude působit dobře, když změnou přiblížením ve směru pohledu kamery změníme velikost záběru z C na AZ nebo PC na PD (tzv.skok po ose). Střih bude zbytečným přerušením akce a navíc každá nepřesnost v návaznosti hereckého projevu (například ukončením příkazu switchmove) či jiné porušení jednot bude velice markantní. Funkční může být taková změna např.z C na PD, podle uvedených definic tak ze skupiny protagonistů vybíráme a akcentujeme jednu postavu, místo její akce sledujeme její mimiku, přenášíme se do jejího myšlení a cítění, které může smysl akce zvýraznit nebo naopak kontrapunktem ironizovat atd. V těchto případech se také často používá prudkého

nájezdu.

Pravidlo osy

Divákovu orientaci v prostoru, rekvizitách, osobách a vztazích nám zajišťuje pravidlo osy.V nejjednodušším příkladě, dialogu dvou osob, rozumíme osou směr jejich vzájemného pohledu a pravidlo osy říká, že všechny záběry jejich rozhovoru mají být natáčeny z prostoru na jedné straně této osy, tedy A se divá vždy zleva doprava, B naopak. Optická osa objektivu může pochopitelně svírat s osou libovolný úhel. Je-li ostrý,blížíme se k čelnímu záběru (ev.přes rameno partnera), blíží-li se k úhlu pravému, vidíme profil. Pro vzájemný kontakt obou osob je však důležité, aby úhly, které tvoří osa mezi A a B s osou kamery, byly přibližně stejné. Střídáme-li čelný záběr A s profilem B, nebude mít divák dojem, že osoby mluví tváří v tvář. Postavení kamery musí odpovídat i pohled postavy, při ostrém úhlu se aktér dívá na hranu kamery bližší k partnerovi, při tupém úhlu mimo kameru, v polodetailech a detailech se dívají „falešným pohledem", tj.ne na spoluhráče, ale blíže na kameru (pozor při nájezdech z C na PD, aby se v konci nedíval mimo !).
Podobná situace vznikne při sledování jednoduchého pohybu jedním směrem. Jde-li nám o honičku dvou aut, je osa tvořena směrem jejich pohybu. Kamera opět zůstává na jedné straně osy (pohyb např.zleva doprava), překročení osy by vyvolalo dojem návratu jednoho vozu. Má-li se však vůz opravdu vracet, musí divák otočení vidět.
Stejné pravidlo platí pro vycházení a vcházení do záběru. Osoba, která vyjde z obrazu napravo, musí v dalším záběru vyjít zleva. Směřuje-li osoba proti kameře a vyjde po její pravé straně (po pravé straně diváka), vchází v protipohledu z levé strany kamery a odchází od ní atd. Samotné pravidlo osy pochopitelně k zachování kontinuity nestačí, je třeba zachovávat i další uvedené jednoty.
Ve skutečnosti ovšem máme řadu variant, které umožňují překročení osy a pohyb kamery na druhé straně. Klasickým způsobem je záběr z osy. Do honičky aut střihneme záběr přes přední sklo ve směru jízdy nebo na řidiče, v dalším záběru mohou auta pokračovat opačným směrem.
Stejně nám pomůže i frontální PD obličeje s pohledem do objektivu, ale v dialogové scéně máme i další možnosti. Jestliže jeden z herců vstane a změní místo, změnila se i osa a v dalším záběru mohu postavit kameru i do té části pokoje, která pro nás zatím byla "tabu". Jinou možností je příchod třetí osoby, která vytvoří novou osu. V případě více osob, které se na sebe navzájem obracejí a pohybují se po celé scéně, je ovšem celá situace složitější a jednoduché pravidlo osy nám již nevystačí. Pro zachováni divákovy orientace je v podstatě nejdůležitější, aby všechny přesuny a změny jednajících osob byly v obraze zachyceny nebo aspoň naznačeny. Sedí-li osoba C na židli, neměla by po prostřihu na B stát u okna. Nemusí ovšem v obraze absolvovat celou cestu od židle k oknu, stačí, když na konci prvního záběru vstane a naznačí pohyb, v mírném pohybu je i po prostřihu u okna. Často pomůže k divákově orientaci zvuk (který engine udělá za vás) a odpovídající hra B v prostřihu (sleduje přechod Č očima přes záběr, nejlépe pomocí příkazu B dowatch C).

Pravidlo hlavního směru

Jindy nám v orientaci pomůže pravidlo hlavního směru. Známe-li prostor dialogu, za jednou osobou je charakteristické pozadí nebo rekvizita (vlajka, strom), můžeme se s kamerou pohybovat po obou stranách osy. Při zachování hlavního směru (proti známému pozadí) nám k chybě v orientaci nedojde. Typickým příkladem je rozmluva řidiče automobilu se spolujezdcem. Můžeme zachovávat směr jízdy zleva doprava a stříhat pravé profily obou protagonistů, ale právě tak dobře váže levý profil řidiče a pravý partnera, i když automobil jede v jednom záběru zleva doprava a v druhém zprava doleva. Dodržujeme totiž hlavní směr pohledu:přes přední sklo, zadní stěna kabiny tvoři zřetelné pozadí.

Délka záběru

Tato věc je často opomíjená a ve videosekvencích flashpointu velmi podceňovaná.
Uvažujme nejprve záběr sám o sobě bez ohledu na jeho vazbu k záběrům sousedním.Pak je rozhodujícím kritériem pro místo střihu, tedy pro určeni správné délky záběru, požadavek,
aby byl záběr čitelný. Má trvat tak dlouho, aby divák „přečetl" právě to, co je třeba. Je-li kratší, může divákovi uniknout jeho smysl, nějaká důležitá informace a některý motiv, nebo dokonce smysl videa se stane nejasným. Divák zneklidní pocitem, že něco přehlédl, a jeho soustředění je narušeno. Naopak je-li záběr příliš dlouhý, sleduje divák i nepodstatné věci, objevuje nepřesnosti a chyby, jeho pozornost se tříští, nebo se divák prostě nudí. Čitelnost záběru je však ovlivněna mnoha faktory. Nezávisí jen na jeho délce, ale i na jeho pořadí v sekvenci, dramaturgickém významu, obrazových hodnotách (velikost, kompozice), spojení se zvukem atd.
Právě toto pravidlo nám však dokumentuje zásadu, že znalost řemeslných principů umožňuje jejich vědomé porušování za účelem obohaceni výrazových možností filmu. Například:příliš dlouhý záběr, který zpravidla rozptyluje nebo nudí, může za jistých okolnosti zvyšovat napětí. Právě tak příliš krátký „nedočtený" záběr může vést diváka ke zdání, že před nim něco ukrýváme, k vyvolání pocitu tajemství, nejistoty, uspěchanosti atd.

Tempo a rytmus

Dostáváme se k pojmům tempo a rytmus, aplikovaným na střihovou skladbu z oboru hudby. Tempo je rychlost, ve které je skladba provedena (largo, moderato, presto). Analogicky ve klipu je tedy tempo určeno rychlostí akce, pohybu herců, kadence dialogů, ale také rychlostí pohybů kamery (nájezdů, panoram), a to jak uvnitř jednoho záběru, tak průběžně v záběrových řadách. Obecněji je pak určeno způsobem vyprávění děje (baladicky, dramaticky apod.). Rytmus je v hudbě definován jako pravidelné střídání přízvučných a nepřízvučných dob. U videa jim nejčastěji rozumíme frekvenci střídání záběrů, ale toto hledisko je zcela povrchní. Sledujeme-li jediný záběr, můžeme v něm objevit pravidelné změny v pohybu herců, v obsahu předního či zadního plánu apod. Tyto pravidelné výrazné změny kompozice patři k tzv.vnitřnímu rytmu záběru. Řekli jsme si, jak se s různými činiteli mění čitelnost záběru, po určité době divák pochopí smysl záběru a jeho zájem pak ochabuje. Představíme-li si v grafickém znázorněni křivku divákova zájmu, můžeme rytmus střihu určovat také podle toho, stříháme-li pravidelně v okamžiku kulminace křivky, před ním nebo po něm. Přesněji tedy rytmus pojímáme jako vzájemné vztahy délek jednotlivých záběrů. Je pochopitelné, že ke změnám vnějšího i vnitřního rytmu dochází v rámci celého filmu i jednotlivých sekvencí a tyto změny ovlivňují i nadřazené tempo vyprávěni, které je globálně určeno žánrem filmu, letorou programátora atd.
Na začátku hudebních i dramatických útvarů bývá expozice, která podá nezbytné úvodní informace, představí hlavní osobu nebo základní hudební motiv. Také ve filmu bývá někdy již před titulky expozice seznamující s hrdinou nebo s atmosférou příběhu. Může být podána v několika záběrech, ale i v jednom záběru, který na začátku chvíli trvá, než začne vlastní děj. Tomuto trvání říkáme rozezněni a jeho hlavním úkolem je především emotivně připravit diváka na následující vyprávění. Ve spojení s výtvarnou a zvukovou složkou může navodit pocit nostalgického pastorále, hrůzostrašného očekáváni apod. Záběry rozezníváme nejen na začátku videa, ale často i v úvodu některých sekvencí. Ještě důležitější je, aby záběry na konci sekvencí a zejména na konci filmu doznívaly. Ustřihneme-li záběr s ukončením akce, podtrhli jsme jeho informativní charakter (zobrazením akce splnil svůj úkol, nic víc se od něj nežádá). Prodloužíme-li jej za trváni akce (hrdina odešel, místnost je prázdná), nebo sledujeme-li akci i poté, kdy se dál nerozvíjí (hrdina odchází od kamery), dáváme záběru širší smysl, začleňujeme hrdinovu individualitu do obecnějších souvislostí, necháváme divákovi čas k filozofickému shrnutí, vlastně ho k tomu vybízíme. A stejně tak v závěrech sekvencí je dozněni potřebné k uvolnění napětí, k uklidnění smíchu, k vychutnávání předchozí atmosféry. Je pochopitelně na režisérovi, aby takový záběr natočil v dostatečné délce a aby jeho obrazová náplň oné atmosféře či myšlence odpovídala. Jestliže příběh mladé dvojice zakončíme tím, že oba hrdinové ve velkém celku odcházejí rozkvetlou alejí k prosluněnému horizontu, bude závěrečný smysl jiný, než když jdou zablácenou cestou do bezútěšného sídliště. Tvůrce videa pak ovšem musí odhadnout správnou míru rozeznění a doznění, aby divák nebyl předčasným střihem vyrušen, nebo naopak aby záběr nevypadal jako samostatný snímek nebo dokonce jako potenciální začátek dalších událostí.
Rozeznění a doznění záběru někdy bývá doplněno roztmívačkou a zatmívačkou, tedy filmovou interpunkci, která ještě zdůrazní předěl mezi sekvencemi. Často se však naopak používá ostrých přechodů z jednoho děje do druhého, někdy podpořeného obrazovou či zvukovou souvislostí.
Velitel řekne vojákovi: „Tak zítra v pět!" - střih - hodiny ukazují pět hodin, záběr na oba pod nimi. Takové střihy se běžně používají jako časová zkratka či elipsa
Ostrý střih je však také specifický výrazový prostředek sloužící především ke zdůrazněni kontrastu dvou situaci či atmosfér, k nečekanému zvratu či pointě. K přechodu z klidu můžeme navíc použit i nárazu ve zvuku, nápadného pohybu v obraze apod. Představme si dvojici uprchlíků, kteří zabloudí a zachrání se v opuštěné stodole. Mírné doznění záběru spících uprchlíků zvýší pocit bezpečí. Tu nastřihneme detail hlavně kulometu a současně ohlušující palbu, zběhové jsou v ohnisku ranní bitvy. Podstatou ostrého střihu je tedy překvapivá změna situace konfrontující kontrast dvou sekvencí a provedená v nečekaný okamžik s maximální přesností a výrazností.
Rozeznění, doznění, ostrý střih, změny rytmu a tempa jsou samozřejmě v úzké souvislosti s dramaturgickou linkou. Jakékoliv okrasy budou ryze formální a neúčelné, nebudou-li odpovídat obsahu scénáře. Najít korespondující celkový i dílčí rytmus střihu, jeho změnami se vyhnout monotónní rozvláčnosti, podpořit smysl díla a vytvořit promyšlenou agogiku filmu - to je asi nejtěžší, ale velice důležitá složka střihu.

Návaznost záběrů

Soustředíme se nyní na vazbu dvou záběrů bezprostředně následujících v jedné sekvenci, splňujících tři klasické jednoty místa, času, děje. Předpoklady k jejich plynulému spojení jsou dány. Jak je tedy nejlépe vázat, aby dramatická akce plynula hladce z jednoho záběru do dalšího? Velice jednoduše a výstižně to formuloval již v r.1927 G.W.Pabst:„Stříhat je třeba v tom záběru, kde je postava v pohybu, a jako následující připojit záběr, ve kterém pokračuje buď tentýž pohyb, nebo trvá pohyb jiný."(Podle § 5 s.180) Tato zásada plynulosti pohybu je velice užitečná a směřuje k plynulému vývoji akce, k dynamickému způsobu vyprávění.
Pro naše účely je však poněkud jednostranná a povrchní. Působí např.velice nepříjemně, jestliže krátce před koncem záběru dochází ke změně ustálené situace, objevuje se náznak nového pohybu nebo nový element. Toto upozornění pochopitelně neplatí, jestliže jde o pohyb pokračující v následujícím záběru. Ve flashpointu je navíc o to těžší, že ujistit se o přesnosti pohybu je velmi těžké. Ne vždy běží voják stejně či vrtulník přistává ve stejném úhlu.
Prázdný záběr, do kterého postava vejde, může být informaci o prostředí, vyjádřením atmosféry, přípravou šoku (do záběru se vsune ruka s pistolí, vjede hlaveň od tanku). V obou případech také může jít o expozici nebo doznění sekvence, o přípravu časového skoku. Uprostřed děje však prázdný záběr brzdí akci. Snažme se hrdinu sledovat v obou záběrech:jde např.zleva doprava, střihneme v pravém okraji, ve druhém záběru v levém okraji odchází od kamery apod.
Není-li jeho pohyb přesně natočen a střih vypadá špatně, necháme plný pohyb ve středu kompozice a ve druhém záběru hned po střihu postava vejde, nebo naopak hned jak v prvním záběru opustí obraz, střihne na druhý, kde je akce v plném proudu. Velice rušivě působí prázdný záběr (postava vyšla) na prázdný záběr (postava vejde). Při přecházení pohybu z jednoho záběru do druhého však není podstatné jenom prodloužení či zkrácení pohybu, důležité je i místo přesného střihu. To musíme v enginu odhadnout spíše z praxe. Znovu upozorňuji, že jedním z nejdůležitějších úkolů střihu je volba správného tempa, které je zpravidla určeno již žánrem a obsahem filmu, režisérovým rukopisem a konkrétně pak vnitřním tempem jednotlivých záběrů a rytmem dialogu.
Zachování spádu akce bez hluchých pauz je daleko důležitější než problematické tříbeni „čistého střihu". Prozkoumejme teď případ, kdy máme v dostatečné délce dva záběry s naprosto stejnou akcí.
Platí totiž zásada, že divák je upoután právě prudkým pohybem a přestává vnímat ostatní komponenty obrazu. Kromě výjimečných, dramaturgicky připravených momentů jsou výše uvedené teorie poněkud spekulativní. V praxi záleží především na kontextu děje, na rytmu střihu, zejména pak na způsobu, jakým jsou záběry snímány.

Výrazným střihovým postupem, který můžeme využít při našem střihu je rapidmontáž. Je to spíš kratší sekvence složená z krátkých záběrů, které na sebe nemusí vázat ani obsahově,
ani pohybově, naopak jejich předmětná náplň se markantně liší. Tyto záběry pak ve své konglomeraci sdělují divákovi určitý dojem nebo pocit: panika, karneval, dopravní zácpa, předtucha aj. Při výběru a řazení záběrů není rozhodující vzájemná vazba, výhodnější je naopak jejich vzájemná srážka. Jediným formálním hlediskem pro řazení je snaha, aby následující záběry příliš nedisharmonovaly v kompozici a zejména v tonalitě,aby divákovo oko nebylo šokováno a neztrácelo tak schopnost vnímat (zařadíme-li po jasném záběru zasněžené pláně krátký záběr tmavého interiéru,divák nerozpozná jeho obsah). Při vhodném dramaturgickém zařazení, promyšleném výběru jednotlivých komponent hlavně z hlediska lapidární sdělnosti a průhledné symboliky a při citlivém rytmickém zpracování můžeme pomocí rapidmontáže vytvořit atraktivní, markantní dramatický akcent.

Dialogy

Především bychom měli rozlišovat „rozhlasové"sekvence,ve kterých je divákovi řečeno dialogem beze zbytku všechno, od dialogových sekvencí rozehraných nápaditěji, ve kterých hraje obraz přibližně rovnocennou roli. Náročnější režisér se totiž snaží rozehrát scénu tak, aby aranžování herců, pohyb kamery, prostředí, rekvizity nejen dotvářely atmosféru dialogu, ale měly i svou dramatickou funkci, aby vizuální působivost převládala nad slovním sdělením. Střídavé „křížové pohledy" (blízké záběry na jednoho z protagonistů ev.přes rameno jeho protihráče) umožňuji pohled do plnějšího „en face" postav, tedy přehlednější mimiku obličeje (pomocí příkazu SetMimic), staví dvě osoby do náležité opozice a dávají střihačovi možnost, aby vhodným střídáním pohledů a zkracováním či prodlužováním pauz pomáhal rytmizování scény a akcentoval důležité momenty a reakce.
Musí sledovat především smysl, dynamiku a tempo dialogu. Po jejich náležitém zhodnoceni může silná místa zdůraznit. Zkušený střihač pečlivě dodržující tempo videa. Je-li situace konfliktní, bývá vhodnější volit ostrý střih, navazovat záběry mezi replikami tak, že v obraze vidíme herce, který právě mluví. Shodným střihem dialogu a obrazu zdůrazňujeme opozici obou partnerů, záběry na sebe narážejí tvrději. V plynulejší a volnější pasáži naopak pomáhá přetahování dialogů: odpovídající osobu ukážeme dříve, než začne mluvit, tedy poslední slova z prvního záběru přeznívají do záběru druhého. Přetaženi zvuku dopředu je na místě zejména ve speciálních případech, například když druhá osoba vstupuje do dialogu nečekaně, s nádechem tajemství, na konci prvního záběru ještě zaznamenáváme nápadnou a důležitou reakci na její vstup, tedy v dramaturgicky připravených momentech. Střihač musí často rozhodnout, je-li podstatnější rozehrát nebo dohrát hercovu akci za cenu delší pauzy, nebo střihnout nečistě, nedokončit zajímavou hru, aby byl dodržen spád řeči. V dialogových sekvencích je většinou nutno podřídit se kadenci řeči, tedy například rozhořčená replika musí následovat bezprostředně po urážce. Tempo scény (tedy i střih,délky pauz) bude pochopitelně jiné, říkají-li dialog nepohyblivé hlavy v detailu, pohybují-li se osoby v celku, nebo když kamera panorámuje, najíždí, chodí mezi protagonisty, prostě udržuje-li svůj vlastní kompoziční rytmus.

Zvuková skladba

Vztahy mezi obrazem a hudbou tedy mohou být na různém stupni závislosti. V některých případech je to velice volná asociace, podpoření či dotvořeni pocitu, zdůraznění nebo zrychlení tempa akce. V této oblasti také nejčastěji dochází k používání konvenčních a obehraných postupů (viz. sladké unisono smyčců při milostné scéně, šestiosminové rytmy typu „Lehká kavalerie" při jezdeckých přehlídkách). Podobně jako ruchy může i hudba svým motivem charakterizovat a doprovázet jako motiv určitou osobu, může ji i zastoupit (dívka vzpomíná na chlapce, kterého nevidíme, ale slyšíme jeho hudební motiv). Může také parafrázovat, ironizovat nebo komentovat obraz svým charakterem nebo použitím známých motivů (nesmělý chlapec přichází s koktáním na zásnuby, hudba hraje Bizetův „Pochod toreadorů"z Carmen). Dochází ovšem k problémům s délkou hudby, protože málokdy lze přizpůsobit rozsah střižené sekvence ucelené hudební větě nebo motivu. Je třeba se rozhodnout, je-li důležitější nástup hudby, která se pak v konci zeslabí a vytratí v ruchu či dialogu (řidčeji a zejména obtížněji v jiné hudbě), nebo jestli je naopak podstatné finále hudby, korespondující s důležitým momentem obrazu nebo s koncem filmu, pak naopak hudba vyjíždí z jiných zvuků, aniž by měla výrazný začátek."Jen málokdy pomůže zkrácení hudby pomocí vystřižení části skladby, např.repetice opakovaného motivu nebo jen několik taktů. Protože hodně autorů opírá zvukovou skladbu svého filmu především nebo výlučně o hudbu, a nemůže tedy volně pracovat se ztrácením a objevováním hudby v ruchových atmosférách, setkáváme se i u poměrně zdařilých filmů se dvěma hrubými chybami. Především navazují jednu hudbu (skladbu,píseň) bezprostředně po skončení předchozí, třeba uprostřed záběru, takže jeden obrazový logický nebo pocitový celek je rozbit dvěma hudebními motivy často navzájem disharmonickými (a naopak dvě dějově či emocionálně odlišné obrazové sekvence jsou pokračující hudbou spojeny). Za druhé pak nechávají hudbu pokračovat po skončení filmu, nebo ji drsně utrhnou uprostřed motivu či taktu. Závěrečná pointa nebo gag je tím značně oslaben, daleko častěji však ve spojení s nepropracovanou dramaturgickou koncepcí film vůbec žádný konec nemá. Menší chybou je případ, kdy se autor chce těmto chybám vyhnout a znovu a znovu opakuje všechny natočené záběry,jen aby s obrazem vydržel až do konce skladby.

Tolik teorie.

Práce s herci

Musíme si uvědomit, že pro nás je práce vlastně práce s herci ničím jiným než najitím správného pohybu a nastavení ai. Správné nastavení postavy, jeho pozice, jeho chování. K jeho nastavení doporučuji těchto několik základních příkazů.

SetBehaviour – který slouží k nastavení chování jednotce či vojákovi.
Např. this setbehaviour "SAFE"
Možnosti chování jsou: CARELESS, SAFE, AWARE, COMBAT, STEALTH
Tento nám napomůže k nastavení, zda má mít voják v ruce zbraň či ne.

SetUnitPos – nastaví postavení vojáka
Př. This setUnitPos "DOWN"
Možnosti: Auto, UP, DOWN
Umístí vojáka případně na zem, pokud chceme aby ležel.

DisableAI – vypne vojákovi některé možnosti, což je vhodné, pokud chceme zamezit
neustálému otáčení hlavou apod. Pozor, tyto schopnosti pak již nejdou zapnout.
this DisableAI "AUTOTARGET"
Možnosti: AUTOTARGET, TARGET, MOVE

Stop – zastaví jednotku
This stop true
Možnosti: true,false

Příklad jak umístit vojáka do pokleku, aby mířil před sebe a neotáčel hlavou po ostatních cílech. Samotný cíl mu můžeme nastavit přes DoWatch.
Př.
this setBehaviour "COMBAT"
this switchMove "Crouch"
this setUnitPos "UP"
this disableai "AUTOTARGET"
this disableai "MOVE"
A nakonec třeba příklad pro ležícího člověka, otáčejícího se kolem své osy.
Vytvořil sem si skript pro otáčení, který sem nazval posun.sqs, jeho obsah:

_on = _this select 0 ; do lokální proměnné uloží první předaný parametr, nyní jméno.
_on stop true ; zastavíme ho
_i = 0
_uh = getdir _on ; zjistím úhel jeho natočení
#loop
_on setdir (_uh + _i) ; a zvětším ho
~0.05 ; chvíli vyčkám
_i = _i + 1
?(_i<180): goto "loop"
_on stop false ; a po posunu o 180 stupňů zase ho pustím
exit ; ukončí skript

Výsledkem bude voják co se zastaví, otočí se a pak bude dělat dál, co měl. Je to vhodné například pro náznak krytí před kamerou. Stačí jen zavolat přes this exec "posun.sqs"

Hodně významným příkazem je příkazy SwitchMove a PlayMove, které přehrají definovaná pohyby. Například:
This switchmove ”EffectStandSalute” ; postava zasulutuje.
Seznam všech pohybů naleznete v OFPEditorHelpu. Doporučuji si přečíst Tutorial18.

Hudba

Při práci s flashpointem máme k dispozici všechny základní songy, které ve hře jsou.
Jak je spustit? Jde to klasicky přes spínač, nebo pomocí příkazu:
Playmusic[“Track13”,30] ; které pustí 13 píseň od 30 sekundy.
Dále je vhodné znát příkaz Fademusic, pomocí kterého můžeme vytvářet náběhy hudby či její postupné zmírnění.
5 fademusic 0 ; v 5 sekundách jde hudba na nulu – 1 je standardni hodnota.
A jaké jsou názvy hudeb ve flashpointu?
Je to Track1 až Track16, pak Frost, 7thDecide, 7thIamGonaFly, 7thLifeless (hojně používaná), 7thOverDose, ze základního flashpointu.
No a dále je to z Resistance:
Rtrack1a, Rtrack1b, Rtrack2 až Rtrack 10, 7thDarken a 7thMylife.

Není však problém si k misi přidat misi svou.
Stačí si vytvořit soubor description.ext a do něj napsat například:

class CfgMusic
{
tracks[]=
{
hudba
};

class hudba
{
name="hudba";
sound[]={\music\hudba.ogg, db+40, 1.0};
};

};
 a v podadresáři music mít uloženou tuto hudbu ve formátu ogg, pak jen příkazem playmusic "hudba", ji spustit. Více se dozvíte v OFPEditorHelpu.
Podobná práce je se zvuky.
V podadresáři Sound budou zase ogg soubory se zvuky (například externí výkřik, zahřmění apod.)
A pak zase do description.ext napíšete:

class CfgSounds
{
sounds[] =
{
Pv01, Pv02
};
class Pv02

{
name = "Pv02";
sound[] = {"Pv02.ogg", 10, 1.0};
titles[] = { };
};
class Pv01

{
name = "Pv01";
sound[] = {"Pv01.ogg", 10, 1.0};
titles[] = { };
};
};
Ale pozor, zde se již podadresář nepíše.
Takto podobně za použítí stringtable.csv se vytvářejí titulky, ale o tom více v OFPEditorHelpu.

Zdroje:

OFPEditorHelp v1.2 (Created by Ruprt) – http://www.koflex.cz/ruprt
Základy střihové skladby – Josef Vaculík (1980)


O programu

Nápověda verze 1.31 pro editaci misí hry OPERATION FLASHPOINT
Autor | Ruprt
Spojení na autora | ruprtovo@ruprt.cz http://ofp.ruprt.cz
Počet funkcí a příkazů | 333
Počet matematických funkcí a operátorů | 48
Počet témat | 475
Počet lokálních odkazů | 3347
Počet internetových odkazů (je nezbytné připojení k internetu) | 34
Počet obrázků | 22
Velikost souboru nápovědy | 2.033 KB
Poděkování | Všem co pomohli


HISTORIE

* * * Verze 1.31 * * *
Tato nápověda obsahuje všechny příkazy a funkce do verze hry 1.96
Doplněno
Příkazy a funkce | Behaviour
Tipy & Triky | Animace v pozadí hlavní nabídky
Opraveno
Příkazy a Funkce | AddAction, List, Localize, Private, TitleRsc Doplněn seznam zbraní a munice (nyní by měl být zcela kompletní až do verze 1.96 - pouze oficiální)
Datum vydání | 24.12.2004

* * * Verze 1.3 * * *
Tato nápověda obsahuje všechny příkazy a funkce do verze hry 1.94b
Doplněno
Program | Přidána karta s abecedním rejstříkem všech témat nápovědy. Seznamy akcí, EventHandlerů, pohybů a hudebních skladeb přístupné z levého panelu -> karta Obsah -> sekce Skupiny příkazů, seznamy.
Příkazy a funkce | RemoveAction, DoStop, True / False, _this, AddEventHandler, Call, Comment, Dialog, Formation, Fuel, LoadFile,If...Then...Else, MissionName, MissionStart, OnMapSingleClick, PlayersNumber, PreprocessFile, Private, RemovevAllEventHandlers, RemoveEventHandler, Set, SetVelocity, SideEnemy, SideFriendly, SliderPosition, SliderRange, SliderSetPosition, SliderSetRange, SliderSetSpeed, SliderSpeed, TypeOf, Velocity, While...Do , Seznam EventHandlerů. Popis značky ~Delay a @Podmínka
Tutoriály | Práce s dialogy - #2, Práce s kamerou - #2 & #3, Podmínky, Konverze zvuků, Příklad práce s EventHandlery.
Opraveno
Příkazy a Funkce | Gunner, Dammage, Score, SetOvercast, SetBehaviour, WaypointPosition, List (ThisList), Drop, SetGroupID, NearestObject, Seznam akcí funkce Action, a další ne příliš podstané opravy. Doplněn seznam pohybů (nyní by měl být zcela kompletní až do verze 1.94b)
Datum vydání | 15.12.2003

* * * Verze 1.21 * * *
Tato verze nápovědy pouze opravuje chyby, které se vyskytly ve verzi Helpu 1.2
Doplněno
Program | V seznamu témat (levý panel) sekce "Skupiny příkazů, seznamy" byl doplněn do seznamu "Vyhrazených názvů souborů" odkaz na zazipovaný soubor config.bin k verzi hry 1.75.
Opraveno
Popis | GrpNull ( v Příkladu použití argument voj1 nebyl v hranatých závorkách)
 | Přidán opravený seznam s výčtem akcí příkazu Action . Ve verzi 1.2 nedopatřením zůstal seznam z verze 1.1 , i když jsem uváděl, že již obsahuje nový. (Na tuto chybu mě upozornil Munch, za což mu děkuji.)
Datum vydání | 22.11.2002

* * * Verze 1.2 * * *
Tato nápověda zahrnuje pouze příkazy a funkce do verze hry 1.75.
Doplněno

Program

Křížové odkazy na související témata.

Příkazy

Které přišly s datadiskem Resistance a jsou uvedeny v oficiálním "Scripting Commands" manuálu pro verzi 1.75:

Animate, AnimationPhase, ButtonAction, ButtonSetAction , CloseDialog , CtrlEnable , CtrlEnabled , CtrlSetText , CtrlShow , CtrlText , CtrlVisible , Damage , DeleteIdentity , DeleteStatus , Direction , Drop , FillWeaponsFromPool , LbAdd , LbClear , LbColor , LbCurSel , LbData , LbDelete , LbPicture , LbSetColor , LbSetCurSel , LbSetData , LbSetPicture , LbSetValue , LbSize , LbText , LbValue , LoadIdentity , LoadStatus , Magazines , MarkerColor, MarkerPos, MarkerSize, MarkerType , Object, OnBriefingGear, OnBriefingGroup , OnBriefingNotes , OnBriefingPlan , Position , PrimaryWeapon , Resize , SaveIdentity , SaveStatus , SecondaryWeapon , SetDamage , SetObjectTexture , SetRain , SetSkill , SetTerrainGrid , WaypointPosition , Weapons

Které přišly s datadiskem Resistance a nejsou uvedeny v oficiálním "Scripting Commands" manuálu pro verzi 1.75:

AddMagazinePool, AddWeaponPool, ClearMagazinePool, ClearWeaponPool, PickWeaponPool, PutWeaponPool, QueryMagazinePool, QueryWeaponPool

Příkazy opomenuté v předchozích verzích této nápovědy a existující již ve verzích hry nižších než 1.5:

EstimatedTimeLeft, Fire, Player

Tutoriály

Tutoriál 28 - O zdrojích
Tutoriál 29 - Práce s dialogy
Tipy a Triky | Doplněny všechny příspěvky z Leonova Editačního okénka až do 17.10.2002
Opraveno
Popis

Alive, CutObj, CutRSC, DebugLog, DisableAI, Format, GrpNull, KnowsAbout, LockWP, PlayMusic, PlaySound, Say, SelectWeapon, Stop a některé další ne příliš podstatné změny popisu některých příkazů.
Seznam zbraní a munice - doplněny všechny zbraně a munice ve verzi 1.75.
U příkazu PlayMusic doplněn seznam všech předdefinovaných názvů skladeb z CWC i Resistance.
Upraven seznam akcí příkazu Action.
Datum vydání | 24.10.2002

* * * Verze 1.1 * * *
Doplněno
Program | Karty "Vyhledávat" a "Oblíbené položky"
Příkazy | DeleteVehicle
 | CreateUnit
 | CreateVehicle
Tutoriály | Tutorial 24 - Tvorba AddOnu - Díl #3
 | Tutorial 25 - Tvorba pokročilejšího scriptu
 | Tutorial 26 - Dodatek ke tvorbě kampaně
Tipy a triky | Doplněny všechny Leonovy příspěvky z jeho Editačního okénka až do 12.5.2002
Opraveno
Popis | AddAction - vrací ID zadané akce
 | CamCreate - doplněn popis o možnost způsobení výbuchu na daných souřadnicích
 | CamSetRelPos - opraven popis příkazu
 | FadeMusic - doplněn popis argumentů
 | FadeSound - doplněn popis argumentů
 | ForceMap - doplněn parametr + poznámka
 | MapAnim - popis příkazu lépe vysvětlen
 | OrderGetIn - opraven a doplněn popis příkazu
 | Reveal - doplněn popis argumentů
 | SetMarkerPos - doplněny uvozovky u názvu značky
 | SideChat, SideRadio, GlobalChat, GlobalRadio, GroupChat, GroupRadio,VehicleChat, VehicleRadio - doplněny barvy textů
 | ShowRadio, ShowPad, ShowCompass, ShowGPS, ShowWatch - doplněno info, že funguje i ve scriptu s parametry Boolean
 | SwitchMove - opravena chyba v Příkladu použití
 | Seznam zbraní - opraven a doplněn seznam a popis některých zbraní a munice
 | Tutoriál #10 o description.ext - Opraven popis CfgRadio, část "Title = string;" namísto "Title[] = string;"
 | Vyhrazené názvy souborů - doplněn soubor scriptu "onFlare.sqs".
 | Tipy a Triky - Kamera za vozidlem - doplněn popis a script
Datum vydání | 09.07.2002

* * * Verze 1.0 * * *
Úvodní vydání Nápovědy - 10.03.2002


Civilian
Popis | Vrátí název strany civilistů
Syntaxe | Civilian
Vrací hodnotu | strana
Příklad použití | Civilian
Další |


CommandFire

Popis: | Velitel vydá rozkaz jednotce ke střelbě na zadaný cíl. Rozkaz je vydán prostřednictvím radiové hlášky.
Syntaxe: | NázevJednotky CommandFire osoba NázevJednotky je název jednotky, pro kterou platí rozkaz. Pro více jednotek může být použito pole. osoba - je jednotka, na kterou se má střílet.
Vrací hodnotu: | žádnou
Příklad použití: | MujHrac CommandFire rus1
Další: | Na vydání rozkazu více různým jednotkám najednou se používá pole obsahující výčet jednotek. Rozkaz bude platný pouze pro jednotky ve skupině, do které patří prvně jmenovaná jednotka.


East
Popis | Vrátí název strany východu
Syntaxe | East
Vrací hodnotu | strana
Příklad použití | East
Další |


Fuel
Popis: | Vrací stav paliva zadaného vozidla.
Syntaxe: | Fuel vozidlo
Vrací hodnotu: | číslo (0 -> prázdná nádrž, 1 - plná nádrž)
Příklad použití: | Fuel tank1
Poznámka: | Související témata : SetFuel, Seznam správců událostí


Šablona příloh

Příloha příkazu PlayMove a SwitchMove - seznam typů pohybu
FXStandDip | Osoba provede klik.
EffectStandSalute | Osoba zasalutuje.
EffectStandTalk | Osoba mluví.
FXStandShowTable | Osoba ukazuje u stolu.
OnChair | Osoba sedí na židli.
FXAngel | Ženský postoj.
FXStandUnivTable | Osoba sedí jako ve škole.
FXStandFromTable | Osoba vstane od stolu.

Kompletní seznam parametrů příkazů PlayMove a SwitchMove

Poznámka

Jednotlivé pohyby lze též vyhledat v přiloženém dekódovaném souboru config.cpp k verzi hry 1.75 v sekci CfgMovesMC, přičemž jako parametr příkazu použijete název konkrétní třídy, např.:

u třídy

class FXStandhip: FXBase
{
file="rucevbok.rtm";
speed=-5.000000;
};

použijete příkaz

vojak SwitchMove "FXStandhip"

a voják si dá ruce v bok.


~ (Prodleva)

Popis: | Programová prodleva (v sekundách) při vykonávání scriptu.
Syntaxe: | ~Time
Vrací hodnotu: | žádnou
Příklad použití: | ~5
Další: | Prodleva může být i zlomek sekundy, respektive jakékoli desetinné místo. Smysl ale má zadáva hodnoty maximálně v řádech tisícin sekundy, neboť menší hodnoty již nemají žádný patrný vliv na vývoj scriptu. Tato funkce musí být na řádku scritpu jedinná.


@ (Logické pozastavení scriptu)

Popis: | Programové pozastavení vykonávání scriptu. Vykonání scriptu je pozastaveno do doby než výraz za znakem "@" nemá hodnutu True. Jinými slovy se čeká na vyhodnocení podmínky s výsledkem Pravda.
Syntaxe: | @Vyraz (vracející logickou hodnotu)
Vrací hodnotu: | žádnou
Příklad použití: | @(Units Group Player < 3 && Alive Player)
Další: | Tato funkce musí být umístěna na řádku scriptu samotná a nelze ji použít jinde než v souborech scriptu *.SQS (teda ani v souborech *.SQF).