Archief - custom voice engine

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

-=PIKMOF=-XceL

Legacy Member
Blanco, ik wil met een random tussenpauze tussen 3 en 10 seconden in een script een random unit een random phrase laten zeggen. Ik heb dit al gevonden, maar hoe lees ik een willekeurig element uit een array, en hoe bepaal ik wie nog in leven is? (dode units laten spreken is wat stom)
---
----

;?alive player : goto znova
#znova
~5
hint "script initiated!"
_rnd = random 12.5

? _rnd > 10 : goto "t5"
? _rnd > 7.5 : goto "t4"
? _rnd > 5 : goto "t3"
? _rnd > 2.5 : goto "t2"
? _rnd > 0 : goto "t1"

;pick a unit that is still alive and let him say a random phrase
;"_x in thislist" count [truck1,truck2... ] == "alive _x" count [ ;truck1,truck2... ]
_example = [unit1, unit2, unit3, unit4, unit5, unit6, unit7, unit8, unit9, unit10]

_rnd2 = random 10
_speaker = _example select _rnd2

#t1
_speaker say "BA_Ger_A_05_FallBack"
goto "znova"

#t2
_speaker say "ES_Ger_B_008_alt2_EnemySighted"
goto "znova"

#t3
_speaker say "BA_Ger_A_1alt_DieAmerikanerES_Ger_B_006_alt_ItsThem"
goto "znova"

#t4
_speaker say "MeleeCharg_Ger_Stirb_B_001"
goto "znova"

#t5
_speaker say "UNS_Ger_B_002alt2_TakeCover"
goto "znova"

Blanco

Legacy Member
Een dode unit zal zowiezo niks zeggen als je "say" gebruikt, op zich kan het geen kwaad alleen zal het script één keer onnodig loopen.

[naam van de group] exec "script.sqs"
_grp = _this select 0

_phrases = ["phrase1","phrase2","phrase3","phrase4"]
_phrasecount = count _phrases

#start
~(3 + random 7)
;pick a random dude, make sure he's alive

#randomunit
_Cgrp = count units _grp
_rdm = random _cgrp
_rdm = _rdm - _rdm %1
_speaker = units _grp select _rnd
~0.1
?!alive _speaker : goto "randomunit"

#sayrandomphrase
_rdm2 = random _phrasecount
_rdm2 = _rdm2 - _rdm2 %1

_phrase = _phrases select _rdm2

_speaker say _phrase

goto "start"

In de _phrases array zet je alle namen van de sounds (voices) die je gedefinieerd hebt in de description.ext. Elke naam tussen quotes en gescheiden door een komma. Je kan er zoveel inzetten als je wil.

_phrasecount telt het aantal elementen in de array, in bovenstaand geval dus 4

~(3 + random 7)

Het script wacht minimum 3 seconden en maximum 10 seconden

in #randomunit wordt een randomunit geselecteerd uit de group

_Cgrp = count units _grp
_rdm = random _cgrp
_rdm = _rdm - _rdm %1
_speaker = units _grp select _rnd
~0.1
?!alive _speaker : goto "randomunit"

Je moet het getal eerst afronden, _rdm kan 1.54233541 zijn, in theorie kan je dat niet gebruiken met het select command
Als _speaker gesneuvelt is, keert het script terug, om een nieuwe te kiezen.
Het _cgrp variable zorgt er voor dat de unitcount geupdate wordt.

#sayrandomphrase
_rdm2 = random _phrasecount
_rdm2 = _rdm2 - _rdm2 %1

_phrase = _phrases select _rdm2

_speaker say _phrase

Identieke methode als het vorige, random element uit de _phrases array wordt geselecteerd en _speaker spreekt het uit.

Ik heb dit niet getest, maar ik denk wel dat het werkt.

Nu gaat dit wat artificieel overkomen vrees ik, om de zoveel tijd wordt er een zin geroepen, het houdt geen rekening met de situatie op dat moment.
Als er geen vijanden in de buurt zijn, kan dat belachelijk overkomen natuurlijk.
Ga je met triggers werken met condities (knowsabout misschien?) of ga je meerdere phrase arrays maken?

bv :

_Alertphrases = ["al1",al2","al3",...]
_idlephrases = ["idl1";"idl2","idl3",..]
_combatphrases = ["cmbt1","cmbt2","cmbt3",..]

En dan checken in welke situatie de group zich bevindt en dan de gepaste zin laten uitspreken.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan