Forum MUGENATION: Chemical Artificial Intelligence - Forum MUGENATION

Salta al contenuto

Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

Chemical Artificial Intelligence La grande novitá in Mugen 1.0

#1 L   puffolotti 

  • Kohai
  • PuntoPunto
  • Gruppo: Membro
  • Messaggi: 267
  • Iscritto: 18-February 08

Inviato 15 February 2010 - 23:16

Nella nuova edizione di MUGEN sono stati introdotti due nuovi strumenti la cui potenza non deve passare inosservata: triggers di comando nei files CNS e restituzione del livello richiesto all´intelligenza artificiale.

Questi due strumenti combinati permettono di insegnare al computer ad avere reazioni che appaiono adrenaliniche o fobiche

In questo primo post parliamo dei comandi attivati dal file CNS.

Per utenti principianti.

La programmazione si avvicina sempre di piú al linguaggio umano, ed il linguaggio umano diventa lo strumento fondamentale per immedesimarsi nel personaggio che si sta creando-modificando.

é possibile dire al computer queste cose, in questo esatto ordine:

Quando una mossa é garantita dalla connessione della precedente
Quando é inopportuno usare una mossa
Quando é opportuno usarla

Per utenti esperti.

La prima questione si risolve (Questa é la grande novitá) nel CNS, se parliamo di concatenazioni.

Ad esempio, diciamo che l´ avversario é stato colpito dalla mossa 250

Quote

[StateDef 250]
type = S ; situazione: S sta in piedi C abbassato A aria L per terra.
Movetype = A ; Attacco Indifferente G = colpito.
trigger1 = time = 0
Physics = S ; Sta in piedi, aCcovacciato, Aria
juggle = 1
velset = 0,0 ;Velocità durante la mossa.
Ctrl = 0 ; Si può interrompere? 0 =no 1 = si
Anim = 250 ; quale sequenza del file AIR ?
Poweradd = 20 ; quanto fa crescere la furia?
Sprpriority = 1 ; viene disegnato davanti a sprpriority 1 o meno.

[state 250, 1]
type = hitdef ; colpisce
;[Omesso: se ti prende ti fa male]

[State 250, 7]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1


Possiamo usare l´AIlevel in vari modi, ecco un esempio:

Quote

[state 250, 1]
type = hitdef ; colpisce
;[Omesso: se ti prende ti fa male]

[State 250, 7]
type = ChangeState
trigger1 = AnimTime = 0
trigger1 = Ailevel > 0
trigger1 = random < AIlevel * 100
trigger1 = enemynear, movetype = H

value = 251
ctrl = 0

[State 250, 7]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1


Ora, con questa aggiunta, in accordo all´intelligenza artificiale, si crea una probabilitá che vedendo connettere una mossa il computer ne tiri un´altra destinata presumibilmente a concatenarsi.

Oppure é possibile insegnare al computer a fare stupidaggini dettate dal panico, invertendo la disequazione random.

Quote

[State 250, 7]
type = ChangeState
trigger1 = AnimTime = 0
trigger1 = Ailevel > 0
trigger1 = random < AIlevel * (1000/7) ; il "7" significa che a livello 8 (cioé >7) non la commetterá mai.
trigger1 = enemynear, movetype = H

value = 251
ctrl = 0


Passando al file CMD

Per utenti avanzati.

Nelle inversioni é possibile inserire un ritardo determinato dal livello dell´intelligenza artificiale

trigger[N] = Ailevel > 0; senza questa riga eseguirá sempre e comunque la mossa specificata, anche guidato da umani
trigger[N] = time = 9-AIlevel; Ad esempio.
0

#2 L   puffolotti 

  • Kohai
  • PuntoPunto
  • Gruppo: Membro
  • Messaggi: 267
  • Iscritto: 18-February 08

Inviato 01 March 2010 - 05:55

Template di pugno leggero.

Quote

[State -1, light punch]
type = changestate
value = 200
triggerall = statetype = S
triggerall = ctrl

;N-UP
trigger1 = AiLevel = 0
trigger1 = command = "x"

;CPU Cazzata
trigger2 = Ailevel > 0
Trigger2 = Ailevel < 7
trigger2 = p2bodydist X > 25
trigger2 = random > Ailevel*2

;CPU furbata
trigger3 = AiLevel > 0
trigger3 = p2bodydist X < 15 + (enemynear, vel X * 4) ; quando l´avversario é vicino
trigger3 = enemynear, stateno != 21; e non si risolve in una parata
;(li ti abbassi e lo spazzi via), ma questo é un altro discorso)
trigger3 = random < AiLevel * 20

;CPU tira un pugno leggero quando l´avversario sta tirando un colpo pesante o un assalto.
trigger4 = AiLevel > 2
trigger4 = AiLevel < 7
trigger4 = enemynear, movetype = A
trigger4 = random < Ailevel * 2 * (50 - p2bodydist X)
trigger4 = random < Ailevel * 2 * (enemynear, vel X)

trigger5 = AiLevel > 6
trigger5 = enemynear, movetype = A
trigger5 = P2bodydist X < 8 * enemynear, vel X + 20
trigger5 = random < Ailevel * 2 * (1 + (enemynear, vel X))

;CPU prova a tirartene un altro se vede che stai male e sei alla portata del colpo. (13 + 12)
trigger6 = Ailevel > 0
trigger6 = enemynear, movetype = H
trigger6 = enemynear, vel X < 3
trigger6 = p2bodydist X < 13
trigger6 = random < AiLevel * Ailevel

0

#3 L   puffolotti 

  • Kohai
  • PuntoPunto
  • Gruppo: Membro
  • Messaggi: 267
  • Iscritto: 18-February 08

Inviato 11 March 2010 - 05:06

Facciamo il punto della situazione.
Salvo la calibrazione destinata ad essere imperfetta, questo sistema sembra funzionare, solo che é piuttosto problematico metterci le mani sopra.

noterete che le mosse speciali di LadyKfm sono realizzate in paragrafi separati per umano e CPU, e questo sará il mio nuovo standard per Jerome e se non mi viene in mente qualcosa di meglio, per i personaggi successivi.

in un blocco quello che é dedicato all´essere umano e in un altro blocco quello che é richiesto al computer.
0

#4 L   Squall LionHeart™ 

  • Programmatore M.U.G.E.N.
  • Gruppo: Moderatore
  • Messaggi: 1097
  • Iscritto: 23-July 07

Inviato 11 March 2010 - 10:41

Mi sembra il modo migliore, più intuitivo e diretto per organizzare le AI, infatti.
Purtroppo il problema della difficoltà al metterci mano è una normale conseguenza, credo... Anche perché il sistema è abbastanza complesso da gestire.

Però ottimo lavoro :D L'AI così organizzata risulta decisamente forte (oddio, forse anche troppo XD)

Saluti

Squall
0

#5 L   puffolotti 

  • Kohai
  • PuntoPunto
  • Gruppo: Membro
  • Messaggi: 267
  • Iscritto: 18-February 08

Inviato 11 March 2010 - 14:06

La capacitá combattiva non é solo una questione di parametri, anche se certamente aggiustare i parametri cambia la difficoltá, ma anche di evoluzione.

I personaggi precedenti sono svantaggiati perché "non immaginano si possa fare certe cose"

Comunque per "é difficile metterci le mani" intendo dire che se raccolgo le istruzioni in un paragrafo, con i triggers che richiedono numeri naturali, se devo riparare un glitch mettendo un trigger sopra ad altri, poi devo rinominare tutti i trigger successivi.

Ad esempio:

Quote

value = prendi la macchina

triggerall= se c´é benzina.

trigger1 = se devi andare lontano
trigger2 = se devi portare pesi cospiqui
trigger3 = se c´é lo sciopero degli autobus


ora, mi sono dimenticato che devo dire anche quando non vale la pena "prendere la macchina", e devo metterlo sopra... quindi


Quote

value = prendi la macchina

triggerall= se c´é benzina.

trigger1 != se non vuoi far sapere che ne possiedi una.

trigger2 = se devi andare lontano
trigger3 = se devi portare pesi cospiqui
trigger4 = se c´é lo sciopero degli autobus


Lavoro quanto meno improbo.

dunque, scrivendo un paragrafo cns per ogni collezione di condizioni, so che l´ordine dei triggers non occorre toccarlo.

Non solo, diviene possibile separare a sandwich la preferenza di una mossa via ordine di lettura...

Nell´esempio a seguire.
Si immagina che il pugno potente basso sia un uppercut e il calcio potente colpisca alto:

Shoryuken1: se uno ti salta addosso
shoryuken2: se uno cerca di afferrarti.

Calcio potente1: se uno ti salta addosso
Calcio potente2: se uno ti ha mancato con un pugno medio.

pugno potente basso1: se uno cerca di afferrarti.
Pugno potente basso2: se uno ti ha mancato con un pugno medio (in quanto eri accosciato).

Qui il calcio potente non sará mai al posto giusto, e il pugno potente non verrá mai usata come punizione al salto avventato, in quanto sta sotto a calcio potente e shoryuken ed ha condizioni piú restrittive.

Ma separando i paragrafi se : preferirei che "in quella circostanza preferisse un´altra mossa" con il sistema di indicare ogni circostanza con un triggerall e un trigger1 posso separare le situazioni di una stessa mossa, nel caso una mossa sia un´eccellente anti aerea ma una pessima punizione, non avró l´imbarazzo di come indicare le due cose.

--------

pugno potente basso: se uno ti ha mancato con un pugno medio (in quanto eri accosciato).

Calcio potente: se uno ti salta addosso

Pugno potente basso: se uno ti salta addosso.

Shoryuken: se uno ti salta addosso

shoryuken: se uno cerca di afferrarti

Calcio potente: se uno ti ha mancato con un pugno medio.

Come vedi il calcio potente come risposta al ritorno di un pugno medio va in underride e prevaöe l´uppercut, ma resta in override sull´uppercut come difesa antiaerea.
0

#6 L   Squall LionHeart™ 

  • Programmatore M.U.G.E.N.
  • Gruppo: Moderatore
  • Messaggi: 1097
  • Iscritto: 23-July 07

Inviato 11 March 2010 - 19:39

Capito, però in questo caso non c'è rischio di "ripetività" dell'AI? cioè del tipo ogni volta che mi trovo a saltare lui mi fa lo shoryuken, o comunque la stragrande maggioranza delle volte.

Hai pensato a come prevenire questo effetto, magari impostando 5-6 colpi per ogni eventualità?

Saluti

Squall
0

#7 L   puffolotti 

  • Kohai
  • PuntoPunto
  • Gruppo: Membro
  • Messaggi: 267
  • Iscritto: 18-February 08

Inviato 11 March 2010 - 20:57

Ti é sfuggito un dettaglio, che appena te lo faccio presente, farai terrorismo per farmi avere tutti i nobel piú due nuovi per bodybuilding e pornografia.

Lo avevo giá detto sopra, ma ora lo spiego in tutta la sua fighezza:

Le definizioni di utilizzo di una mossa ora sono separate.

Le definizioni non appartengono al personaggio ma ad ogni singolo colpo.

Quindi non parliamo di "colpi che vanno bene in una situazione." che porta alla tua percezione di "5 o 6 colpi che vanno bene in questa situazione"

Ogni colpo avrá le sue definizioni di quando va bene, (e senza definizioni di quando non va bene verrá sempre usato a proposito dalla cpu)

Quindi il computer valuterá fra TUTTI i colpi che possiedono un paragrafo che indica tale colpo come efficace o semplicemente sensato in quella situazione, nell´ordine in cui trova le stringhe preposte.

Quindi non sono 5 o 6, sono tutti quelli sensati, piú eventuali stringhe "turluccanti" (calcio basso contro un avversario in aria, ad esempio)


Quindi l´esame del computer sul file cmd sará tipo:

Quote

über-shoryuken, si puó fare, tiriamo il dado
über hurricane kick... no perché poi mi piglia alle spalle ( ! = p2bodydist X < 25 && p2statetype = A && P2velX < -2)
über hadouken non ha senso

shoryuken: si puó fare, tiriamo il dado.
tatsumaki sempu kiaku: uh, meglio no: il dottore mi ha proibito testate di lottatori di sumo fra le chiappe.
hadouken: non lo beccherei mai.
hadouken: a questo livello di difficoltá tocca far finta di passar per bischeri, quindi tiro comunque il dado.

calcio potente: ottimo, tiriamo il dado
calcio leggero: assurdo (! = p2statetype != A)
Pugno potente: tiriamo il dado
Calcio medio: tiriamo il dado: bene, faró questa.


Come sempre, ma ogni mossa che ha il parametro cogente verrá esaminata.

Dunque, quando inserisco al computer lo shoryuken... vado nel prontuario e trovo questo

Quote

[State -1, Antiaerea dal suolo per CPU]
type = changestate
value =
triggerall = statetype = S
triggerall = AiLevel > 0

trigger1 = p2bodydist X < 30 + enemynear, vel x * 11 ; il 30 rappresenta l´allungo arbitrario della mossa,
; l´11 rappresenta il tempo prima dell´esplosione nell´animazione, ovviamente in ticks
trigger1 = p2bodydist X > 10
trigger1 = p2bodydist Y > -20
trigger1 = random < ailevel


E glie la metto con i dovuti adattamenti.

Salvo le mie preferenze sul comportamento del personaggio, non ha nessuna importanza dove la metto, in quanto i comandi non possono tapparsi a vicenda per il semplice motivo che non ci sono. Ed essendo un paragrafo stand alone (se mi servisse un trigger2 userei un nuovo paragrafo standalone che possiede triggerall e trigger1)

e quindi alla fine avremo una forma simile a quella che descrivevo sopra.
0

#8 L   Squall LionHeart™ 

  • Programmatore M.U.G.E.N.
  • Gruppo: Moderatore
  • Messaggi: 1097
  • Iscritto: 23-July 07

Inviato 11 March 2010 - 22:29

Capito, mea culpa non avevo letto bene su XD Ritiro quanto detto sulla ripetitività dei colpi in determinate situazioni e... Inizio il terrorismo, ma per ora ti posso solo assicurare il nobel per la pornografia XD

Saluti

Squall
0

#9 L   puffolotti 

  • Kohai
  • PuntoPunto
  • Gruppo: Membro
  • Messaggi: 267
  • Iscritto: 18-February 08

Inviato 11 March 2010 - 23:07

Dimenticavo la cosa piú importante:

Quando si parla di colpi ravvicinati che sostituiscono i colpi a distanza automaticamente, il triggerall dedicato alla CPU richiede un´ulteriore attenzione:

Deve esserci nella mossa lunga la distanza minima, altrimenti il computer potrebbe usare la mossa lunga quando il giocatore non potrebbe.

Tale limite dovrebbe essere implicito nella distanza minima del trigger 1 della versione lunga della mossa, per evitare che il computer tiri colpi insensati quando l´avversario gli sta passando sopra la testa.

Cioé, per sicurezza il colpo lungo dovrebbe avere una stringa

triggerall = p2bodydist X >= 15

cosí come il colpo corto ha la stringa:

triggerall = p2bodydist X < 15

l´idea alla base é che quando l´ordine dei paragrafi perde importanza...

semplicemente scambiandone due o aggiungendone un terzo identico, puoi ottenere un personaggio che preferisce balzare sull´avversario e prenderlo a ginocchiate che calciarlo da lontano.

Immaginiamo un caso diverso in cui il passaggio da calcio a ginocchiata non é automatico in base alla distanza, ma viene comandato in qualche modo. (come i pugni di dhalsim da SF2superturbo in poi.

In tal caso puoi fargli mischiare le due cose, facendogli cercare la ginocchiata quando é sano, e facendogli dubitare del contatto man mano che viene danneggiato.


Quote

statedef -1,
ginocchiata
triggerall blah blah blah, é guidato dal computer ed é vicino.
trigger1 blahblah blah
trigger1 vita maggiore di 800
trigger1 tira il dado e se viene meno di intelligenza artificiale, tirala.

Altre mosse per insaccarli il collo

statedef -1,
calcione fetente
triggerall blah blah blah, é guidato dal computer ; ed é lontano(tappata in quanto abbiamo detto che non c´é automatismo.)
trigger1 blahblah blah
trigger1 tira il dado e se viene meno di intelligenza artificiale moltiplicato per (1+vita/1000), tirala

Altre mosse per spaccargli le rotule

statedef -1,
ginocchiata
triggerall blah blah blah, é guidato dal computer ed é vicino.
trigger1 blahblah blah
;trigger1 vita maggiore di 800
trigger1 tira il dado e se viene meno di intelligenza artificiale, moltiplicato per 2 tirala.



La prima e la terza si riferiscono alla stessa identica azione CNS, la prima é in override finché il personaggio ha piú di 800 Pf, (e non la esclude certo del tutto) la seconda guadagna di importanza man mano che il personaggio perde la vita, e guadagnando di importanza aumenta le probabilitá di essere preferita alla terza.

Apparirá quindi che quando il personaggio é sano preferisce cercare il contatto, man mano che si indebolisce lo si vedrá sempre di piú cercare di colpire da lontano, e dará l´impressione di essere intimidito dai danni subiti, rifiutandosi di avvicinarsi all´avversario.

Effetto collaterale positivo: l´AI cambierá tattica durante la partita.
0

#10 L   Squall LionHeart™ 

  • Programmatore M.U.G.E.N.
  • Gruppo: Moderatore
  • Messaggi: 1097
  • Iscritto: 23-July 07

Inviato 11 March 2010 - 23:24

Si, vabbè il p2bodydist è il fondamento dell'AI moderna del mugen XD quello come gli stateno/prevstateno per le combo ed il trigger movecontact XD hai fatto bene a darlo per scontato ;)

Saluti

Squall
0

#11 L   puffolotti 

  • Kohai
  • PuntoPunto
  • Gruppo: Membro
  • Messaggi: 267
  • Iscritto: 18-February 08

Inviato 11 March 2010 - 23:54

Di quello ne parleró in seguito, in ogni caso mi pare ovvio che il movecontact o movehit o moveguarded vadano indicati nel cns. il prevstate serve per dare un ritardo sui balzi.

Il movecontact in "Eclisse dei sentimenti" é reso necessario dalla politica delle inversioni, in quanto al computer non é dato impiegare la corsa in avanti per misurare la distanza di un colpo, quindi la corsa dovrebbe essere data al computer come una mossa speciale (tipo guy in SFalpha) Ladykfm non ce la ha, (va in frenata direttamente) i prossimi la avranno.

Questo é quello che bisogna capire per giocare a eclisse dei sentimenti:

Per fare l´uppercut in volo di ladykfm puoi ragionare in termini di: corri, fai la capriola, tira il pugno...

Oppure >>v*P

Anche se da nessuna parte nel CMD trovi f,f,d,P... puoi benissimo farlo, da nessuna parte é scritto che devi correre per un km prima di fare la capriola.

Le mosse speciali sono tutte o quasi del tipo: mentre corri, mentre salti, mentre tiri un altro pugno.

Il punto é che, visto che il computer puó tenere sotto controllo migliaia di tasti, la CPU esula dalla logica dei 6 tasti, quindi risolvo con una inversione per la CPU, (300??)

che é identica alla corsa, ma si attiva con la logica delle mosse con rincorsa.

A 6 metri comincia a correre, a 3 metri fermati (e terrai conto degli spostamenti dell´avversario) e andrai in frenata, e lo sappiamo tutti e due...

e da lí tira la terrificante mossa n° 284, nel caso l´avversario non si sia preparato proprio a quella. (Il tutto sottostá alla logica di cui ai post precedenti,)

La parte in verde scuro, nell´istruzione della corsa emulata... non esiste. La differenza fra la corsa emulata e la corsa vera é che la prima ha prima istruzioni per interrompersi in un colpo, e queste sono nel colpo, non nella corsa, e istruzioni per interrompersi in frenata, e queste sono nella frenata, non nella corsa.

In questo modo il computer puó mettere in buffering 3 o 4 stati successivi per poi saccodiare con una combo custom da qui alla fine dei tempi.

In questo modo, anche se l´uppercut di Ladykfm é a TRE stati di distanza dallo stand by (Devi metterti a correre, smettere di correre -> andare in frenata, andare in capriola, tirare un pugno) il computer puó comunque prevedere di usarlo da camminata o posizione accosciata, che sono quattro stati di distanza.

Non ho ancora codificato questo metodo, cominceró a farlo con jerome, che erediterá la purezza che manca a LadyKFM
0

Condividi questa discussione:


Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

1 utenti stanno leggendo questa discussione
0 utenti, 1 ospiti, 0 utenti anonimi