ARMA2 MP OPTIONS OPAS - kelloaika & intro & vaikeusaste

Keskustelu Arma I-, II- ja III- sekä OFP-tehtävistä

Moderators: Kegetys, Broileri, Raunhofer

Post Reply
User avatar
Raunhofer
Personnel
Posts: 1520
Joined: Thu, 24.7.2008, 15.12
Location: Oulu
Contact:

Post by Raunhofer » Thu, 30.7.2009, 23.11

EDIT: HUOM. UUDEN PARAMETRIEN ESITTÄMISTAVAN MYÖTÄ MYÖS NIIDEN MÄÄRITTELY ON MUUTTUNUT ARMA2ssa.

Esimerkki init tiedostosta:

Code: Select all

switch (paramsarray select 0) do {

  case 1: {SKRIPTIT TÄHÄN};
  case 2: {SKRIPTIT TÄHÄN}; 

};
Esimerkin kohta vastaa param1:stä, sillä "paramit" menevät nyt järjestyksessä 0,1,2,3,4... Esimerkin 0 määrittelee mistä paramista puhutaan.

Esimerkki descriptionista:

Code: Select all

class Params
{

	class OMA_PARAMINI {
		title = "OMA OTSIKKO";
		values[] = {1, 2};
		texts[] = {"OMA TEKSTI", "OMA TEKSTI"};
		default = 2;
		};

};

Monissa tehtävissä on jo nähtävissä erinlaisia asetuksia tehtävää varten, kuten esimerkiksi kelloajan säätö, vaikeusaste, intro ja mitä mielikuvitus vain keksii, mutta kovinkaan moni ei niitä hyödynnä. Joten opas tähän on paikallaan:

KELLOAJAN VALITSEMINEN
Tarvitset 2 tiedostoa: description.ext ja init.sqf tehtäväsi kansioon (sama missä on mission.sqm)

Kelloajan muuttamisen logiikka on varsin simppeli. Ensin tehtävästä asetetaan kello aika 00:00 eli keskiyö. Seuraavaksi muutamalla pienellä skriptillä käytämme hyväksi skiptime komentoa, jolla voi skipata aikaa tunteina.
Teemme siis eräänlaisen vaihtoehdon, kuinka monta tuntia skippaamme eli mikä kelloaika peliin päätyy.

description.ext

Lisää seuraavat koodinpätkät vaikka description.ext:in loppupuolelle.

Code: Select all

titleParam1 = "Daytime";
valuesParam1[] = {5, 12, 15, 0};
defValueParam1 = 12;
textsParam1[] = {"Morning", "Day", "Evening", "Night"};

titleParam kohdassa määrittelemme otsikon valikolle
valuesParam[] kohdassa määrittelemme valintojen arvot (tässä kelloaika esimerkissä numerot viittaavat arvoon, kuinka monta tuntia kelloa siirretään eteenpäin 00:00:sta)
defValueParam kohdassa määrittelemme mikä vaihtoehto on valmiiksi valittuna
textsParam[] kohdassa annamme vaihtoehdoille nimet

Numerolla jokaisen parametrin päätteeksi määritämme jokaisen parametrin kuuluvan samaan DAYTIME valintaan. Jos tekisit toisen esimerkiksi intro on/off valintalaatikon, käyttäisit 1 sijaan 2.


******************

init.sqf

Lisää seuraavat koodinpätkät vaikka init.sqf:n loppuun.

Code: Select all

skiptime param1;
Eli nyt määritimme tilanteeksi 1 sen, että aikaa kelataan 5 tuntia eteenpäin (00:00+05:00) eli ajaksi tulee 0500 aamulla. Toisessa vaihtoehdossa tulee keskipäivä ja kolmannessa ilta seitsemän. Muissa tapauksissa aikaa kelataan aina automaattisesti 12 tuntia eteenpäin. Eli jos et koske koko valinta laatikkoon, on automaattisesti päivä, kun tehtävä alkaa.

Nyt ajanvalinta on valmis.


***************
***************

INTRO ON/OFF

Intron kytkemiseen ja poiskytkemiseen on monenlaisia keinoja. Opetan tässä oppaassa tavan, jota esimerkiksi käytän tehtävässä 'co 10 deadly deal'. Tätä tapaa voi myös mielikuvituksensa avulla soveltaa monin keinoin (esimerkiksi difficulty valikko)

Jälleen tarvitsemme init.sqf ja description.ext mission kansioon.

description.ext

titleParam1 = "Intro";
valuesParam1[] = {1, 2};
defValueParam1 = 1;
textsParam1[] = {"Yes", "No"};


titleParam kohdassa määrittelemme otsikon valikolle
valuesParam[] kohdassa määrittelemme valintojen arvot
defValueParam kohdassa määrittelemme mikä vaihtoehto on valmiiksi valittuna
textsParam[] kohdassa annamme vaihtoehdoille nimet

Numerolla jokaisen parametrin päätteeksi määritämme jokaisen parametrin kuuluvan samaan DAYTIME valintaan. Jos tekisit toisen esimerkiksi intro on/off valintalaatikon, käyttäisit 1 sijaan 2.


******************

init.sqf

Tämän toteuttamiseen on monenlaisia keinoja, itse päädyin tähän, monipuoliseen tapaan:

if (!isNil "param1") then {
switch (param1) do {


case 1: {[] exec "yesintro.sqs"};


case 2: {[] exec "nointro.sqs"};


};
} else {
[] exec "yesintro.sqs"
};

Lisää edeltävä koodinpätkät vaikka init.sqf:n loppuun.

Nyt määrittelimme, että tilanteessa 1, tehtävä aukaisee mission kansiosta yesintro.sqs tiedoston ja tilanteessa 2 nointro.sqs tiedoston. Default asetuksena intro näkyy eli yesintro.sqs

Seuraavaksi luomme 2 uutta tiedostoa samaiseen kansioon: nointro.sqs ja yesintro.sqs

yesintro.sqs

[] exec "intro.sqs";

Tallennus ja sulkeminen. intro.sqs on siis intro tiedostosi jonka olet aiemmin tehtävääsi tehnyt/tekemässä.

Vaihtoehtoisesti voit myös itse intro.sqs:n pistää tähän yesintro.sqs tiedostoon, mutta itse tykkään tehdä näin mutkan kautta sillä voin nyt määritellä myös muita asioita, esimerkiksi kun introissani on joskus kuvia niin käytän myös [] exec "pictures.sqs"; samassa tiedostossa (ilman introa en halua kuvienkaan tulevan).

nointro.sqs

~4
hint "Tehtävänäsi on tuhota vihollisen tukikohdasta rekka. Tukikohta on lähtöpisteestäsi pohjoiseen.";


Käytännössä nointro.sqs:n voi jättää tyhjäksi, mutta itse ilmoitan nointron valinneille hinttinä viestin, jossa tiivistän asiat jotka introssa näkyivät. Fiksua eikö totta :banana: (~4 tarkoittaa että peliä kuluu 4 sekuntia ennenkuin hint tulee)

Myös jos introssasi on esineitä/asioita joita itse pelissä ei kuuluisi olla, voit lisätä nointroon myös niiden poistamisesta parametrit, eli esimerkiksi deletevehicle introtavara1;


***************
***************

YKSINKERTAINEN VAIKEUSASTEEN LISÄÄJÄ

En halua tehdä tästä oppaasta liian monimutkaista, joten vain näytän mihin näillä valinnoilla voi esimerkkinä vaikuttaa.

1. Teen tehtävään 2X enemmän miehiä kuten alkuperäisessä suunnitelmassani ja nimeän puolet miehistäni periaatteella: hard1, hard2, hard3, hard4... jne jne.

Seuraavaksi aukaisen description.ext tiedoston ja lisään valikon:

titleParam1 = "Difficulty";
valuesParam1[] = {1, 2};
defValueParam1 = 1;
textsParam1[] = {"Normal", "Hard"};

Eli alkuperäisasetuksena missio on vaikeusasteltaan normal.

Sitten aukaisen init.sqf ja lisään:


if (!isNil "param1") then {
switch (param1) do {


case 1: {[] exec "normal.sqs"};


case 2: {[] exec "hard.sqs"};


};
} else {
[] exec "normal.sqs"
};


Eli jälleen defaulttina normaali ja vaihtoehtona hard.

Luon 2 uutta tiedostoa: normal.sqs ja hard.sqs

normal.sqs

deletevehicle hard1;
deletevehicle hard2;
deletevehicle hard3;
deletevehicle hard4;
deletevehicle hard5;


Tässä esimerkissä minulta normal asetuksilla poistetaan hard 1-5 nimiset asiat. Asiat voivat olla esimerkiksi sotilaita, joten kun valitaan normal vaikeusaste, ei pelissä löydy näitä 5:ttä extra sotilasta, jotka voivat olla skilleiltään vaikka 100%. Hardit voivat myös olla vaikkapa aselaatikoita!

hard.sqs

deletevehicle fuel1;
deletevehicle ammolaatikko1;


Hardi voisi olla ihan hyvin vaikka tyhjä, mutta tässä esimerkissä poistan pelaajilta ammuslaatikon ja bensarekan, jotta pelaajilla olisi vähemmän kuteja ja bensakin pitäisi noutaa kauempaa. Selvää vaikeutusta siis.

***

Tässä nyt oli yksinkertaisia esimerkkejä mihin ARMA2:n pool valikoilla pystyy. Mielikuvitusta jos riittää, voipi tehtävään vaikka tehdä kokonaan 2 eri stooryä jotka voi sitten valinta laatikosta valita. Täydellistä.

Muita esimerkkejä on esimerkiksi valintalaatikko josta saa JIP/Respawnin poissa.[/color]



Edited By Raunhofer on 1254254831
Luutnantti Raunhofer
Reserved Detachment CO
User avatar
Raunhofer
Personnel
Posts: 1520
Joined: Thu, 24.7.2008, 15.12
Location: Oulu
Contact:

Post by Raunhofer » Sat, 1.8.2009, 15.40

AIKARAJA TEHTÄVÄÄN

1. Aukaise description.ext ja lisää seuraavat:

Code: Select all

titleParam1 = "Timelimit";
valuesParam1[] = {1, 2, 3};
defValueParam1 = 3;
textsParam1[] = {"30 Minutes", "45 Minutes", "No time limit"};
2. Mene editoriin ja luo 3 triggeriä.

TRIGGER 1 - 30minuuttia

Pistät triggerin laukaisuun ajat 1800, 1800, 1800
(sekuntteja -> 1800s = 30min)
Text kohtaan vaikka 30minutes

TYPE: END#(numero)

Conditition

Code: Select all

param1 == 1
TRIGGER 2 - 45minuuttia

Pistät triggerin laukaisuun ajat 2700, 2700, 2700
Text kohtaan vaikka 45minutes

TYPE: END#(numero)

Conditition

Code: Select all

param1 == 2
TRIGGER 3 - Ei aikarajaa

Pistät triggerin laukaisuun ajat 10, 10, 10
Text kohtaan vaikka NoTimeLimit

Conditition

Code: Select all

param1 == 3
onAct

Code: Select all

hint "No timelimit"

3. Valmis





Lisämauste: Muistathan että on kiva tietää paljonko on jo pelattu, joten voisit lisätä esimerkiksi triggerin, joka ilmoittaa kun aikaa on jäljellä 10 minuuttia.

Esimerkkinä trigger 1:en 30minuuttia. 1800-600(10min) = 1200,
eli triggeriin ajat 1200, 1200, 1200.
Text kohtaan vaikka Timeleft

Conditition

Code: Select all

param1 == 1
onAct

Code: Select all

hint "timeleft 10 minutes"
Valmis.[/color]



Edited By Raunhofer on 1249131255
Luutnantti Raunhofer
Reserved Detachment CO
Shuko
Posts: 408
Joined: Sun, 12.7.2009, 21.09
Location: Forssa
Contact:

Post by Shuko » Mon, 3.8.2009, 21.34

Raunhofer wrote:normal.sqs

deletevehicle hard1;
deletevehicle hard2;
deletevehicle hard3;
deletevehicle hard4;
deletevehicle hard5;


Tässä esimerkissä minulta normal asetuksilla poistetaan hard 1-5 nimiset asiat. Asiat voivat olla esimerkiksi sotilaita, joten kun valitaan normal vaikeusaste, ei pelissä löydy näitä 5:ttä extra sotilasta, jotka voivat olla skilleiltään vaikka 100%. Hardit voivat myös olla vaikkapa aselaatikoita!

Niille, jotka ihmettelevät miksi poistetun vaunun yms alueella juoksentelee crewmaneja vaikka et sellaisia ole sinne laittanut. Deletevehicle poistaa vain sen annetun vaunun, mutta ei miehistöä. Ne saa pois käyttämällä crew komentoa:

Code: Select all

{deletevehicle _x} foreach crew vaunu1; deletevehicle vaunu1;
[/color]
User avatar
Raunhofer
Personnel
Posts: 1520
Joined: Thu, 24.7.2008, 15.12
Location: Oulu
Contact:

Post by Raunhofer » Tue, 4.8.2009, 22.12

Tai sitten nimeämällä myös vaunun kuskit, jos haluaa pitää miehistön ulkona ennen hälytystä ja sitten vasta pomppaamalla sisään ja sotimaan.

Hiano strateginen juttu antaa MYÖS JV:lle mahdollisuuden napsia tankin kuskit päiviltä ja parhaissa tapauksissa jopa varastamaan vihollisen vaunun.
Luutnantti Raunhofer
Reserved Detachment CO
Shuko
Posts: 408
Joined: Sun, 12.7.2009, 21.09
Location: Forssa
Contact:

Post by Shuko » Mon, 26.10.2009, 17.20

Viimeisin päivitys toi käyttöömme paramsarray muuttujan. Tämä mahdollisti useamman kuin kahden parametrin lisäyksen. Niiden määrä helposti karkaa käsistä ja joutuu alkaan miettiin mikä oli mikäkin. Joten tässä on pieni parametrien käyttöhelpotus.

Init.sqf tiedoston alkuun, paikan ei niin väliä, kunhan on ennen kuin mitään parametrin arvoa käytetään.

Code: Select all

for [{_i = 0},{_i < count(paramsArray)},{_i = _i + 1}] do { call compile format ["PARAMS_%1 = %2",(configName ((missionConfigFile >> "Params") select _i)),(paramsArray select _i)] };
Tämän jälkeen voidaan käyttää parametrien arvoja muuttujilla PARAMS_parametrinNimi.

Esimerkki:

Description.ext

Code: Select all

class Params
{
  class Hour {
    title = "Hour";
    values[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};
    texts[] = {"0000","0100","0200","0300","0400","0500","0600","0700","0800","0900","1000","1100","1200","1300","1400","1500","1600","1700","1800","1900","2000","2100","2200","2300"};
    default = 5;
  };
  class Rain {
    title = "Rain";
    values[] = {0,1,2,3};
    texts[] = {"None","Light","Moderate","Heavy"};
    default = 0;
  };
  class Fog {
    title = "Fog";
    values[] = {0,1,2,3};
    texts[] = {"None","Light","Moderate","Heavy"};
    default = 0;
  };
  class Viewdistance {
    title = "Viewdistance";
    values[] = {1000,1500,2000,2500,3000,3500,4000,5000,6000};
    texts[] = {"1000", "1500", "2000", "2500", "3000","3500","4000","5000","6000"};
    default = 2000;
  };
};
Tässä esimerkissä meillä on käytössä:

Code: Select all

PARAMS_Hour
PARAMS_Rain
PARAMS_Fog
PARAMS_Viewdistance
Eli voimme käyttää niitä tähän tapaan:

Code: Select all

switch PARAMS_Rain do {
  case 0: { 0 setOvercast 0; 0 setRain 0 };
  case 1: { 0 setOvercast 1; 0 setRain 0.2 };
  case 2: { 0 setOvercast 1; 0 setRain 0.4 };
  case 3: { 0 setOvercast 1; 0 setRain 0.6 };
  case 4: { 0 setOvercast 1; 0 setRain 0.8 };
  case 5: { 0 setOvercast 1; 0 setRain 1 };
};
switch PARAMS_Fog do {
  case 0: { 0 setFog 0 };
  case 1: { 0 setFog 0.2 };
  case 2: { 0 setFog 0.4 };
  case 3: { 0 setFog 0.6 };
  case 4: { 0 setFog 0.8 };
  case 5: { 0 setFog 1 };
};

skiptime ((PARAMS_Hour - daytime + 24) % 24);

setViewDistance PARAMS_ViewDistance;
[/color]



Edited By Shuko on 1261680743
Post Reply