Lipunryöstö
Viime kerralla käytiin läpi perusteet ja tehtiin yksinpelitehtävä. Tällä kerralla opetellaan miten tehdään moninpelitehtävä.
Oppaassa oletetaan että editorin perusasiat, kuten yksiköiden lisääminen on jo hallussa, joten kaikkea ei selvitetä perusteita myöten.
Lipunryöstöä varten tarvitaan vähän tavallisesta tehtävästä poikkeavia asioita.
- Kaksi lippua.
- Pelin aloittava triggeri.
- Pisteytysjärjestelmä, joka antaa yhden pisteen vihollisen lipun ryöstäneen ja sen omaan tukikohtaan vieneen tiimin jokaisella jäsenelle.
- Triggerit, jotka päättävät tehtävän kun joko aika- tai pisteraja on täyttynyt.
- Molempien lippujen tilaa seuraavat triggerit.
Karttana käytetään edellisestä oppaasta tuttua Everonia, mutta tällä kertaa Saint Philippen kaupungin ympäristöä.
Ennen mitään muuta pitää tehtävällä antaa muutamia määritelmiä. Luo niitä varten tehtävän hakemistoon Notepadilla tiedosto description.ext. Sisältö näyttää seuraavalta:
respawn=3
respawndelay=30
onLoadMission="Pelit harjoitus 2 - Capture the Flag"
titleParam1 = "Time:";
valuesParam1[] = {10000, 300, 600, 900, 1200, 1500, 1800, 2700, 3600, 7200};
defValueParam1 = 1800;
textsParam1[] = {"Unlimited", "5 min", "10 min", "15 min", "20 min", "25 min", "30 min", "45 min", "1 hour", "2 hours"};
titleParam2 = "Score to win:";
valuesParam2[] = {10000, 5, 7, 10, 15, 20, 25, 30};
defValueParam2 = 5;
textsParam2[] = {"Unlimited", 5, 7, 10, 15, 20, 25, 30};
};
Respawn=3 määrittelee, että pelaaja herää henkiin ennalta määrättyyn paikkaan ja respawndelay=30 laittaa heräämisen viiveeksi kolmekymmentä sekuntia.
OnLoadMission="Pelit harjoitus 2 - Capture the Flag" on teksti, joka näkyy ruudulla kun tehtävää ladataan.
Seuraavat rivit säätävät aika- ja pisterajat.
titleParam1 = "Time:"; kertoo hostille ensimmäiseksi muuttujaksi ajan.
Seuraavat rivit antavat valittavat aikarajat sekunneissa, niiden oletusarvon sekä selkokieliset tekstit, jossa aikarajat näkyvät minuutteina.
valuesParam1[] = {10000, 300, 600, 900, 1200, 1500, 1800, 2700, 3600, 7200};
defValueParam1 = 1800;
textsParam1[] = {"Unlimited", "5 min", "10 min", "15 min", "20 min", "25 min", "30 min", "45 min", "1 hour", "2 hours"};
Samat asiat pisteille, joilla peli päättyy tehdään seuraavasti:
titleParam2 = "Score to win:";
valuesParam2[] = {10000, 5, 7, 10, 15, 20, 25, 30};
defValueParam2 = 5;
textsParam2[] = {"Unlimited", 5, 7, 10, 15, 20, 25, 30};
Viimeinen rivi }; päättää tiedoston.
Tallenna tiedosto ja varmista, ettei notepad anna sille .txt-päätettä.
Description.ext-tiedostossa voi myös antaa pelille mahdolliset uudet, itse tehdyt äänet sekä muita pelin lisäherkkuja. Eri osiot on jaettu luokkiin, jotka täytyy laittaa tiedostoon tietyssä järjetyksessä. Tässä tehtävässä emme kuitenkaan lisää uusia ääniä, vaan keskitymme olennaiseen. Tarkka selostus description.ext-tiedoston sisällöstä löytyy pelit.fi:n tiedostoalueilta Flashpointin Open Source Guidesta (OpenSourceGuide.zip).
Seuraavaksi luodaan liput ja sijoitetaan ne oikeille paikoille.
NATO-tiimille hyvä lipun paikka löytyy Saint Philippen kylästä koordinaatista DG16.
Side: Empty
Class: Objects
Unit: Flag
Name: FlagW
Init: this setflagtexture "usa--vlajka.pac"; this setflagside west
Viimeinen rivi laittaa lipputankoon NATO:n lipun ja kertoo, että NATO-tiimi omistaa lipun.
Neukkujen lippu laitetaan bensa-asemalla koordinaatissa EB22.
Name: FlagE
Init: this setflagtexture "rus--vlajka.pac"; this setflagside east
Muut arvot ovat samat NATO-lipun kanssa.
Seuraavaksi tehdään pelin pisteytyksen ja lippujen statuksen lähtötilanteeseen palauttava triggeri.
Axis a: 0
Axis b: 0
Text: Init
Condition: true
On Activation: WScore=0; EScore=0; ownerW=objnull; ownerE=objnull; WFlagTaken=false; EFlagTaken=false; TimeEnd=0
Viimeinen rivi palauttaa kaikki muuttujat alkuun, varmistaa, ettei kukaan kanna lippuja ja laittaa pisteet nollille. Init-triggeri ajetaan aina heti tehtävän alussa.
Pisteytys
Pisteiden jakelu rakennetaan sarjalla triggereitä. Hyvä paikka niille on karkeasti kentän keskellä, eli lippupaikkojen puolessa välissä.
Trigger 1: Länsi ryöstää lipun
Axis a: 0
Axis b: 0
Set to Repeatedly
Text: FlagscoreW
Condition: (ownerE in list FlagSwitchW) and not WflagTaken
On activation: Flagcarrier=ownerE; ownerE=objNull; FlagE setFlagOwner objNull; WScore = WScore + 1; titletext[format ["Piste NATO:llenScore : NATO %1 - Neukut %2", WScore, EScore], "Plain down"]; EFlagTaken=false; "--x addScore 5" forEach units group Flagcarrier
Effects: Sounds: Anonymous: Russian: American Evils
Set to Repeatedly tarkkailee triggerin tilaa jatkuvasti.
Condition-rivi aktivoi triggerin vain, jos neukkujen lipunkantaja on tuonut lippunsa takaisin tälle alueelle ja jos kukaan ei kanna NATO-lippua.
On Activation -rivi tarkoittaa kirjaimellisen suomennoksena karkeasti, että neukkujen lipun kantajasta tehdään pelin logiikan mielestä "lipunkantaja", jota käytetään pisteytyksessä. Neukkulipun kantajaa ei enää ole. Neukkulippu ei ole kenenkään hallussa. NATO:lle annetaan yksi piste. Näytetään viesti "Piste NATO:lle" ja seuraavalla rivillä "Score: NATO 1 - Soviet 0". Neukkulippu ei ole enää ryöstetty. Kaikki lipunryöstäjän tiimissä saavat viisi pistettä, jotka näkyvät pelin loppuessa.
Yksinkertaistettuna rivi lisää NATO:lle pisteet lipunryöstöstä ja näyttää pistetilanteen kaikille.
Effects-osassa soitetaan aiheeseen sopiva ääni.
Trigger 2: Neukut ryöstävät lipun
Axis a: 0
Axis b: 0
Set to Repeatedly
Text: FlagscoreE
Condition: (ownerW in list FlagSwitchE) and not EflagTaken
On Activation: Flagcarrier=ownerW; ownerW=objNull; FlagW setFlagOwner objNull; EScore = EScore + 1; titletext[format ["One point for SovietnScore : NATO %1 - Soviet %2", WScore, EScore], "Plain down"]; WFlagTaken=false; "--x addScore 5" forEach units group Flagcarrier
Effects: Sounds: Anonymous: Bastards 1
Kakkostriggeri tutkii samanlaisilla komennoilla NATO-lipun statuksen ja jakaa tarvittaessa pisteet neukkutiimille.
Trigger 3: Pisteet radiolla
Axis a: 0
Axis b: 0
Activation: Radio Alpha
Set to Repeatedly
Text: Score
Condition: this
On Activation: titletext[format ["Score : NATO %1 - Soviet %2", WScore, EScore], "Plain down"]
Kolmostriggerin tehtävä on näyttää pistetilanne Alpha-radiokutsulla (radiovalikosta 0-0-1).
Trigger 4: Sijoitetaan NATO-lipun päälle
Axis a: 10
Axis b: 10
Activation: West
Set to Repeatedly
Text: West Flag Switch
Name: FlagSwitchW
Condition: this
Triggeri aktivoituu, jos yksikään NATO:n pelaaja on sen alueella. Triggeriä käytetään muuttujana toisessa triggerissä.
Trigger 5: Sijoitetaan neukkulipun päälle
Axis a: 10
Axis b: 10
Activation: East
Set to Repeatedly
Text: East Flag Switch
Name: FlagSwitchE
Condition: this
Trigger 6: NATO-lipun palautus
Axis a: 0
Axis b: 0
Set to Repeatedly
Text: NATO-lippu palautettu
Condition: (isnull flagowner flagW) and WflagTaken
On Activation: WFlagTaken = false; titletext["NATO:n lippu palautettu","Plain down"]
Kutostriggeri aktivoituu, jos NATO-lippu ei ole kellään mukana, mutta se ei myöskään ole omalla paikallaan.
Trigger 7: Neukkulipun palautus
Axis a: 0
Axis b: 0
Set to Repeatedly
Text: Neukkulippu palautettu
Condition: (isnull flagowner flagE) and EflagTaken
On Activation: EFlagTaken = false; titletext["Neukkulippu palautettu","Plain down"]
Seitsemäs triggeri aktivoituu, jos NATO-lippu ei ole kellään mukana, mutta se ei myöskään ole omalla paikallaan.
Trigger 8: NATO-lippu ryöstetty
Axis a: 0
Axis b: 0
Set to Repeatedly
Text: NATO-lippu ryostetty
Condition: (not isnull flagowner FlagW) and flagowner FlagW != ownerW
On Activation: ownerW = flagowner FlagW; titletext[format ["%1 vei NATO:n lipun", name ownerW], "Plain down"]; WFlagTaken=true
Kasitriggeri aktivoituu vain, jos NATO-lippu on omalla paikallaan, eikä kukaan kanna sitä.
Trigger 9: Neukkulippu ryöstetty
Axis a: 0
Axis b: 0
Set to Repeatedly
Text: Neukkulippu ryostetty
Condition: (not isnull flagowner FlagE) and flagowner FlagE != ownerE
On Activation: ownerE = flagowner FlagE; titletext[format ["%1 vei neukkulipun", name ownerE], "Plain down"]; EFlagTaken=true
Lopetustriggerit
Seuraavat triggerit seuraavat aika- ja pisterajojen täyttymistä.
Trigger 10: Kahden minuutin varoitus
Axis a: 0
Axis b: 0
Text: Time1
Condition: (Param1<10000) and (Param1>=120) and ((Param1-time)<=120)
On Activation: hint"aikaa jaljella 2 minuuttia"
Condition-rivi tutkii minkä verran aikaa on jäljellä. Se aktivoituu vain, jos aikarajaksi on laitettu joku muu kuin ääretön ja aikaa on jäljellä annettu aikaraja vähennettynä kuluneesta ajasta plus 120 sekuntia.
Activation-rivi varoittaa ruudulla, että aikaa on jäljellä vain kaksi minuuttia.
Trigger 11: Viiden minuutin varoitus
Axis a: 0
Axis b: 0
Text: Time2
Condition: (Param1<10000) and (Param1>=300) and ((Param1-time)<=300)
On Activation: hint"aikaa jaljella 5 minuuttia"
Trigger 12: Kymmenen minuutin
Axis a: 0
Axis b: 0
Text: Time3
Condition: (Param1<10000) and (Param1>=620) and ((Param1-time)<=600)
On Activation: hint"aikaa jaljella 10 minuuttia"
Trigger 13: Kahdenkymmenen minuutin varoitus
Axis a: 0
Axis b: 0
Text: Time4
Condition: (Param1<10000) and (Param1>=1200) and ((Param1-time)<=1200)
On Activation: hint"aikaa jaljella 20 minuuttia"
Trigger 14: Puolen tunnin varoitus
Axis a: 0
Axis b: 0
Text: Time5
Condition: (Param1<10000) and (Param1>=1800) and ((Param1-time)<=1800)
On Activation: hint"aikaa jaljella 30 minuuttia"
Trigger 15: Tunnin varoitus
Axis a: 0
Axis b: 0
Text: Time6
Condition: (Param1<10000) and (Param1>=3600) and ((Param1-time)<=3600)
On Activation: hint"aikaa jaljella 60 minuuttia"
Trigger 16: Lopetus 1
Axis a: 0
Axis b: 0
Type: End#1
Text: Lopetus ja Outro.sqs
Condition: TrueEnd
On Activation: ForceEnd
Ensimmäinen lopetus laukeaa kun muuttuja TrueEnd on voimassa. ForceEnd lopettaa tehtävän välittömästi.
Trigger 17: Lopetus ajan tai pisteiden takia
Axis a: 0
Axis b: 0
Text: Aika tai pisteet
Condition: (param1<10000 and ((time >= param1) or (TimeEnd >= param1))) or (param2<10000 and ((WScore>=param2) or (EScore>=param2)))
On Activation: TimeEnd=time; publicVariable "TimeEnd"; titletext[format ["Tehtava ohinPisteet : NATO %1 - Neukut %2", WScore, EScore], "Plain"]; player exec "Outro.sqs"
Condition-rivi tutkii täyttyikö piste- tai aikaraja.
Activation-rivi tutkii muuttujan TimeEnd-tilanteen, näyttää loppupisteet ja ajaa skriptin Outro.sqs.
Henkiin heränneet
Koska laitoimme alussa pelaajat heräämään henkiin ennalta määrätyistä paikoista, täytyy myös luoda sopivat paikat.
Aloituspaikat kannattaa laittaa sopivan matkan päähän lipuista, mutta kuitenkin niin etäälle, että kuoleman jälkeen ei synny heti lipun läheisyyteen ja ettei aloituspaikasta ole näköetäisyyttä lipulle.
NATO lähtee talojen luota Saint Philipen pohjoispuolella, koordinaatti DG-13.
Luodaan paikalle markeri.
Name: Respawn—west
Set to Ellipse
Color. Green
Fill: Grid Diagonal
Axis a: 20
Axis b: 20
Markerin nimen kanssa on syytä olla tarkkana. Peli määrittelee paikan, jossa pelaajat heräävät henkiin markerin nimen mukaan. Vaihtoehtoja ovat:
Respawn_west: NATO
Respawn_east: Neukut
Respawn_guerilla: Vastarinta
Respawn_civ: Siviilit
Neukkujen lähtöpaikka on mestän laita koordinaatissa EA24. Luodaan sinnekin markeri.
Name: Respawn_east
Set to Ellipse
Color: Red
Fill: Grid Diagonal
Axis a: 20
Axis b: 20
NATO-puolen markerin lähelle luodaan seitsemän sotilaan ryhmä.
Officer
Machine Gunner
Sniper
Soldier
2xLAW Soldier
Engineer
Kaikille laitetaan seuraavat arvot:
Control: playable
Init: GroupW = group this
Upseerille laitetaan muita korkeampi sotilasarvo. Muilla asetuksilla ei merkitystä. Tarkista että kaikki kuuluvat samaan ryhmään.
Neukkuryhmä tehdään samalla tavalla.
Officer
Machine Gunner
Sniper
Soldier
2xRPG Soldier
Engineer
Arvot:
Control: playable
Init: GroupE = group this
Molemmille ryhmille luodaan kolme Trabantia ja yksi PV3S Civil -kuorma-auto. Kaikki tyhjinä. Arvoiksi laitetaan
Side: Empty
Class: Car
Vehicle Lock: Default
Lisäksi kannattaa luoda molempiin aloituspaikkoihin muutama erilainen ammo crate. Niiden luominen ja aseiden lisääminen niihen käsiteltiin editointioppaan ekassa osassa.
Tehtävän testauksen aikana kannattaa laittaa yhden sotilaan Control-kohtaan "player", jolloin yksiköiden tarkkaa sijoitusta ja tehtävän toimintaa voi kokeilla. Samalla säästyy editorin jatkuvalta herjaamiselta siitä ettei tehtävässä ole pelaajaa.
Ruudussa EA 18 on tukikohta, jonne sijoitetaan kaksi T-55-tankkia ja kaksi Vulcan IT -vaunua. Nämäkin kaikki tyhjinä. Tehtävässä ei ole ilmavoimia, mutta Vulcan on uusi yksikkö, jota on mukava kokeilla. Tukikohta on karkeasti puolessa välissä ja sen idea on saada tiimit kisaamaan siitä kumpi saa ensin raskasta kalustoa käyttöönsä.
Samalla tukikohdan ympärille kehkeytyy heti toimintaa matsin alussa. T-55 ja Vulcan ovat vain esimerkkejä. Kalustoa voi laittaa kukin makunsa mukaan, mutta kannattaa välttää ripottelemasta liikaa roinaa, koska silloin herkästi lipunryöstö unohtuu ja liika kalusto hidastaa peliä kohtuuttomasti.
Näillekin laitetaan arvoiksi:
Side: Empty
Class: Armored
Vehicle Lock: Default
Waypointit AI-sotilaita varten
Jos tehtävää halutaan pelata yksin tietokoneen ohjaamien sotilaiden kanssa, on niille syytä luoda waypointit, koska muuten ne eivät osaa hakea lippua.
Tee molempien ryhmien komentajalle ensimmäinen waypoint noin puoleenväliin lippupaikkojen väliin seuraavilla arvoilla:
WP type: Move
Combat mode: Open fire, Engage at will
Molempien ryhmien toiset waypointit luodaan vastapuolen lipun päälle. Waypointin tarkoitus on käskeä tietokonepelaajan ryöstämään lippu.
NATO-ryhmän ryöstö-waypoint:
WP type: Move
Description: Ota lippu
Condition: (local this) and this != player and (this distance FlagE < 6)
On Activation: this action ["TAKE FLAG", FlagE]
Set to Show in Cadet mode
Condition-rivi tutkii onko tietokoneen pelaaja riittävän lähellä lippua. Aktivointirivi käskee ottamaan lipun. Distance-käskyllä voi mitata kahden paikan välistä etäisyyttä ja action-käskyllä voi suorittaa erilaisia toimintoja, kuten tässä tapauksessa lipun nappaamisen. Show in Cadet mode laittaa waypointit näkymään vain, jos pelaa cadet-vaikeusasteella.
Neukkujen ryöstö-waypoint on melkein samanlainen.
WP type: Move
Description: Ota lippu
Condition: (local this) and this != player and (this distance FlagW < 6)
On Activation: this action ["TAKE FLAG", FlagW]
Set to Show in Cadet mode
Molempien puolten kolmas waypoint on tavallista MOVE-tyyppiä ja se laitetaan tismalleen oman lipputangon kohdalle. Neljännet waypointit laitetaan taas kentän puoleenväliin ekojen waypointien viereen ja annetaan tyypiksi "CYCLE", jolloin pelaajat ryöstelevät iloisina lippuja hamaan loppuun asti.
Tee vielä markerit molempien lippupaikkojen päälle.
NATO-lipulle:
Name: FlagWest
Icon: Flag
Color: Green
Text: NATO-lippu
Neukkulipulle:
Name: FlagEast
Icon: Flag
Color: Red
Text: Neukkulippu
Briefingien tekeminen neuvotaan jutun loppuosassa. Voit käyttää tätä tehtävää harjoitustyönä, joten jätän tekstit ja selitykset muuten auki, mutta markereiden nimien kanssa kannattaa olla tarkkana:
Intro ja outro
Pelin alkuun ja loppuun tehdään hyvin yksinkertaiset kamerakikat.
Luo Notepadilla tekstitiedosto init.sqs ja tee sen sisälle vain yksi rivi:
titleCut ["","BLACK IN", 3]
Rivi tekee yksinkertaisen feidauksen pelin alkuun.
Outro.sqs pyöräytetään pelin lopussa. Tee sekin Notepadilla ja muista jälleen kerran tarkistaa ettei Windows tee turhia .txt-päätteitä.
enableRadio false
_camera = "camera" camCreate [1300.443237,5970.769540,10]
_camera cameraEffect ["internal","back"]
_camera camSetTarget FlagW
_camera camSetFOV 0.700
_camera camCommit 0
@camCommitted _camera
~5
TrueEnd=true
~2
player cameraEffect ["terminate","back"]
camDestroy _camera
Outrossa luodaan eräänlainen virtuaalikamera ja ohjataan sitä. EnableRadio false poistaa häiritsevät radiopölinät. --camera -rivit luovat kameran, määrittelevät kuvakulman oletusarvoon "internal ja back", laittavat kohteeksi NATO-lipun, laittavat kameran näkökentäksi 0.70, mikä on samalla kameran oletusarvo. CamCommit ja @camCommitted --camera kertovat miten pehmeästi kuvakulmasta toiseen siirrytään. ~5 luo viiden sekunnin viiveen. TrueEnd lopettaa Outron. Kaksi viimeistä riviä poistavat kameran.
Kameroilla ja efekteillä voisi kikkailla loputtomiin, mutta niistäkin saa listätietoa pelit.fi:n tiedostoalueilta löytyvistä oppaista. Parhaiten opeilee kikkailemalla ja kokeilemalla.
Kun kaikki on valmista, anna vielä tehtävällä säätila ja vuorokaudenaika oikeasta yläkulmasta. Tehtävä tallennetaan lopuksi valitsemalla "Save" ja "Export to multiplayer missions".
Kun lipunryöstön runko on kertaalteen tehty, sitä voi käyttää myös monenlaisten muunnelmien tekemiseen. Esimerkiksi lassoamalla hiirellä kaikki kartalla näkyvät yksiköt, markerit, triggerit ja muut sekä käyttämällä normaaleita leikkaa-, kopioi- ja liitä-näppäimiä (CTRL-X, CTRL-C, CTRL-V) voi kaiken siirtää uuteen paikkaan tai vaikka vaihtaa karttaa välissä ja liittää roinat sinne. Yksiköiden määrää, tyyppiä ja muita voi myös muutella suhteellisen vapaasti. Pitäkää kimppakivaa.
Valtaosa oppaan koodista on kylmäverisesti nyysitty osoitteesta www.3dactionplanet.com/flashpoint.