Jump to content
Rpg²S Forum

JackX

Utenti
  • Posts

    112
  • Joined

  • Last visited

Posts posted by JackX

  1. @ ProGM

     

     

    Mi introduco senza leggere tutto perché sono di fretta ><.

     

    Io personalmente ho provato un po' di tutto, sto appunto cercando di creare un progetto multiplatform, ma efficiente e che sia davvero portabile.

    Ho iniziato con flex, sono arrivato a 1/3 dello sviluppo... ma praticamente TUTTI hanno tolto la compatibilità -.-'

    Un peccato, perché è veramente semplice da usare, soprattutto se accompagnato con flashpunk:

    http://flashpunk.net/

    So che esiste Air ma... ma... bah, mentre programmavo con flash ho sempre avuto problemi di prestazioni e di memoria .___. pesaaaante, Così ho optato per un cambio totale.

     

    Dopo aver sperimentato robba varia (unity, vari tool html5) mi sono "stanziato" su cocos2d-x, che fornisce una libreria molto potente, basata su OpenGL, per creare giochi per windows, linux, mac, android, iphone, blackberry e wp8.

    http://www.cocos2d-x.org/

    L'ho trovato molto fico, soprattutto perché permette molta personalizzabilità.

    Purtroppo è un po' macchinoso il setup e va presa la mano col c++, ma una volta preso il via è ottimo! :3

    Ci sto rifacendo il pifferaio di Hamelin, spero a breve di poter mostrare qualcosa ^^

    Io partii da un link del genere: http://webification....evelopment-sdks

    All'inizio pensai "PhoneGap è gratuito e sembra bello, mi supporta pure Symbian!!", dopo aver scoperto che si basava sull'utilizzo dell'applicazione via browser, grazie ad HTML5, capii che era meglio lasciar perdere xD

     

     

    Unity3D lo conoscevo da più tempo, e l'idea di poterlo far girare nel browser mi allettò molto ma... Si basa troppo sull'interfaccia grafica e non era quello che volevo. Volevo una esperienza incentrata più sulla programmazione e non volevo dover investire il mio tempo nell'imparare un nuovo approccio che sarebbe stato legato principalmente all'interfaccia grafica di quello specifico programma. Oggi si è evoluto tantissimo, e probabilmente se a suo tempo avessi deciso invece di utilizzare Unity, ora avrei diversi vantaggi in termini di tempo etc. Ma il futuro non è facile da azzeccare, quindi ho preferito non rischiare... Non si sa mai che da un giorno all'altro chiudano tutto xD

     

     

    Cocos2D-x non ricordo esattamente perché lo scartai, rimane una scelta decisamente interessante. Dal sito ufficiale:

    . Cocos2d-x

     

    written in C++ and OpenGL ES 1.1/2.0, run on iOS, Android, BlackBerry, Bada, Marmalade, Windows, Linux and more

    3. Cocos2d-x

    Setting up development environments

    Android Environment Setup

    iOS Environment Setup

    Windows Phone 8 Environment Setup

    Windows 8 Metro Environment Setup

    Windows 7 Environment Setup

    Mac OS X Environment Setup

    Linux Environment Setup

    BlackBerry Environment Setup

    Bada Environment Setup

    Più Cocos2D-html5, ovviamente.

    Gli manca solo webOS e siamo a posto xD ( cioé, persino Bada :O )

    L'hanno aggiornato parecchio dall'ultima volta che lo vidi...

     

    Probabilmente il motivo principale per cui l'avevo scartato è che non esportava anche in Flash, che trovo irrimediabilmente comodo: dallo stesso sistema operativo puoi generare un file che può essere eseguito ovunque. È appunto lo stesso vantaggio che accompagna Java, però secondo me Flash è ancora più pratico e leggero ( ma non più performante rispetto a Java, non raggiunge lo stesso livello neanche con Stage3D; questo non toglie però che possa comunque fare i 60 FPS fissi anche con giochi 3D, dipende dall'hardware e da cosa gli si sta chiedendo di fare... ).

    Detto in parole povere, io non ho un computer Apple ( nonostante MacOS X si possa installare su certe CPU Intel/AMD, cosa che ho già provato con successo xD, o anche su macchine virtuali, non altrettanto comodo e performante però :\ ) e trovo seccante dovermi sistemare tutto l'occorrente su ogni sistema operativo dove voglio eseguire l'applicazione che sto programmando. È solo questo motivo, per me abbastanza valido allo stato attuale, che non riesce a farmi passare a Cocos2D-x, nonostante possa spingere di più l'hardware, girare nativamente e coprire un numero maggiore di piattaforme ( questa è una lama a doppio taglio: se vuoi supportare molte piattaforme, devi anche disporre di esse per fare dei test adeguati, quindi significa procurarsi MacOS X, iOS, Android, Bada, BlackBerry, Linux, Windows etc. etc. ). L'unico altro motivo ( questo però dipende molto da cosa si deve fare ) è l'orientamento specifico al 2D ( ho visto comunque che è possibile fare qualcosa in 3D, ma non ho approfondito in effetti... ).

     

     

    Il Pifferaio di Hamelin, lo giocai. Complimenti a te per la pazienza nella programmazione e a Flame per l'ottima grafica, è uno di quegli "stili alternativi" che mi piacciono parecchio xD

    Sicuramente riuscirai ad ottenere risultati ancora migliori adesso che hai più libertà nella programmazione ^^

     

    Anche Processing ( simil-Java e Java ) e Stage3D ( ActionScript ) si basano sulle OpenGL.

    Ho proprio il sospetto che quella libreria ( FlashPunk ) non sfrutti ancora Stage3D, ecco che l'utilizzo di grosse grandi risorse grafiche ( non so che in risoluzione lo stai facendo, però di solito è quello che frega con Flash ) è un compito eccessivo per la CPU, visto che Flash di norma scarica tutto su quella ( niente accelerazione hardware :[ ).

    Con l'arrivo di Stage3D è stato finalmente introdotta questa possibilità, a parte certe GPU ( tra cui quello di Starry -__- ):

    http://helpx.adobe.c...vers-flash.html

    ( notare a fondo pagina il piccolo esempio Flash che vi dice il livello di supporto a Stage3D ).

     

     

    Mi pare di capire, da qui: http://flashpunk.net...hp?topic=5166.0, che se usi tale libreria con Starling, allora puoi utilizzare le risorse messe a dispozione da Stage3D, e quindi noterai l'enorme differenza di prestazioni xD

     

     

    Flash su iOS non ci è mai arrivato e su Android l'hanno tolto a breve, sulle altre piattaforme mobile non saprei ( su Symbian^3 c'è ancora ma non è aggiornatissimo, forse è rimasto all'8, ma ormai poco ci interessa, la Nokia sta con Microsoft ora >_< ).

    Mentre sulle piattaforme Desktop principali ( Windows, Linux e MacOS X ) non mi pare abbiano tolto nulla a Flash °°

    Adobe Air non fa altro che interfacciarsi tra il tipico file swf e il sistema operativo. Praticamente si comporta come un Flash Player che quando lo apri carica subito il tuo file swf. Il tutto però avviene "dietro le quinte", quindi all'utente sembra di star avviando una qualsivoglia applicazione.

    Poi hai anche il vantaggio di poter accedere a determinate funzione del sistema operativo ( come il filesystem ) che di base sono inacessibili ( è naturale essendo un formato nato per essere eseguito sui browser ).

    Altrimenti, non si deve programmare nulla di nuovo, bisogna solo sapere come creare il package apposito ( .air per i sistemi Desktop, .apk per Android e .ipa per iOS, se non erro... con iOS non ho ancora avuto modo di approfondire la cosa ).

    Per dovere di cronoca, Air è utilizzabile anche sul BlackBerry.

    Per quanto riguarda webOS, non so nemmeno se c'è ancora il supporto a Flash...

     

     

     

    @ Guardian of Irael

     

     

    Vi è sempre quel timore per tutto... cosine gratis si trovano ^ ^

     

    Machinarium era proprio uno di quelli! ^ ^

     

    (

    Piccolo usava spesso questa faccina :E e non sapeva cosa fosse... tu lo sai? Così da risolvere uno dei grandi misteri di 2s? XD)

     

     

    Di fatto il tempo non è poco, voglio dire, quanto me ne serve, non so dare una data precisa, ci lavoro giorno per giorno, ma non è sicuramente ristretto. Di conoscenze ne ho ancora tanto bisogno.

     

    Eh dovrei riuscirci, qualche annetto ancora diciamo XD

     

    Ah che bello 10 stage passo passo per il gioco! :3

    Ottima pure quella per il platform, ne ho letto di simili, qui vedo qualcosina di differente. ^ ^

    Nulla, sta a me ora, approfondisco un attimo questo processing e vedo se ne vale il passaggio da Allegro a lui o se magari lasciarlo per un futuro ^ ^

     

     

    Più che immaginavo per come hai parlato in generale ora, era tanto per specificare a chi legge la questione GM ^ ^

    (Me li avevi già passati te o forse era Dax D:)

     

     

    @Pro: già mi avevi aggiornato a Lucca! XD Stencyl 3 non lo aspetti più? :D Cocos non l'ho ancora provato tuttavia... questo non ha problemi di pesantezza di stomaco? ^ ^

    Anche Starry me lo chiese e da quando gli dissi "non ne ho la più pallida idea" anche lui incominciò ad adoperare la fatidica smile: :E

    Davvero, non lo so... Io la utilizzo quando faccio ironia a carattere demenziale ( quando dico scemenze in generale o quando uso un tono leggero/allegro, abuso di xD ).

    Quando mi verrà in mente l'espressione facciale corrispondente, mi ricorderò di avvertirti xD

     

     

    Probabilmente per progetti più grossi e a lungo termine potresti stare su Allegro, mentre se vuoi accelelerare i tempi Processing potrebbe darti una mano ( può essere utile altrimenti quando devi realizzare giochini più brevi o applicazioni al volo senza avere compromessi considerevoli nelle prestazioni ).

     

     

  2. ( ho un modo di scrivere per il quale cerco di non dare per scontato una comune conoscenza di un argomento, in modo che se sono a conoscenza di qualcosa di sbagliato, posso dare agli altri l'occasione di correggermi e viceversa )

     

    Conosco adobe air, ci sono stati sviluppati giochini che ho reputato interessanti! :3

    Sì, per il discorso Flash a pagamento o no ho visto già, ci sono diverse librerie od altri strumenti, IDE, ecc... senza stare a scomodare per forza quello a pagamento della adobe. Avevo una mezza intenzione tempo fa... ^ ^

     

    Per Air il recente (da humble bundle) Offspring Fling ^ ^

     

    Oh del fatto di Air su iOs ed android non lo sapevo, pensavo volessero abolire tutto il flash in generale e chi si è visto si è visto, buono a sapersi allora ^ ^

    Fino a qualche tempo fa credevo che comunque bisognasse pagare una licenza, almeno per vendere... a quanto pare invece da un bel po' rilasciano Flex open-source e free ( perché una cosa è l'IDE, un'altra sono API, SDK, framework etc. che potevano comunque essere a pagamento ).

     

    Anche Machinarium, che ha potuto vedere luce su iPad 2 grazie ad Air ( mi pare all'inizio fosse proprio in esclusiva per iPad 2, per quanto riguarda le piattaforme Mobile, quindi niente Android, ora non saprei... ).

     

     

    Mi piace come libreria e...

     

    Mi hai rimesso il dubbio tu! XD

     

    Compresi i vari vantaggi di processing...

    Mannaggia a me :E

    Se sei già ben avviato, probabilmente è meglio rimanere dove sei... Il punto è che non avendo mai visto un tuo topic in merito al tuo progetto ( a parte i due articoli sul magazine ), non ho mai capito se il problema è che devi accumulare prima conoscenze a sufficienza o semplicemente è una questione di tempo... in entrambi i casi, avendo una curva di apprendimento più alta e potendo fare certe cose scrivendo meno codice, Processing potrebbe aiutare in tal senso. Ora ci sono le versioni beta della 2.0 ( quando avevo iniziato a provarlo era da poco uscita la prima alpha release della 2.0 o poco prima insomma ), e dovrebbe essere ancora più maturo. Con Dark Rain ho sbagliato nel non mettermi da subito dei limiti ben precisi nella realizzazione di CBS etc. e nel voler sempre cercare di avere tutto ( volevo fare il bs custom con le combo, le animazioni per tutti i PG contemporaneamente etc., ma senza dover ricorrere all'utilizzo esclusivo delle Picture, per poter preservare l'uso del Map Editor per fare mappe con Charset e Chipset etc., in modo anche da non avere stacco tra BS ed Esplorazione ). La conclusione è che poi, volendo fare troppo ( senza già saper fare tutto ma imparando all'occasione cose nuove ), non si è concluso niente e ora si pensa di investire meglio il tempo futuro facendo grafica da 0 ( in modo da poter adottare uno stile grafico che possa permettere una creazione delle risorse più rapida ) e linguaggio di programmazione ( per i già tanti motivi già accennati: cross-platform, meno limiti, maggiori prestazioni, fare una esperienza più completa etc. ).

    Sto come al solito divagando... Insomma, dipende da quanto tempo hai e da quanto ne vuoi investire e se pensi, allo stato attuale, di farcela prima di diventare troppo vecchio xD

     

     

    Provato il gioco fila benissimo senza problemi! ^ ^ Poi così ad occhio non riesco a capire che programmazione c'è dietro comunque D:

    Questo può aiutare a farsi un'idea:

    http://www.hobbygamedev.com/int/the-making-of-a-10-thunderbolt-2/

    [ ho notato che sullo stesso sito ci sono altri articoli abbastanza interessanti per creatori di videogiochi, come questi

    http://www.hobbygamedev.com/adv/2d-platformer-advanced-collision-detection/

    http://www.hobbygamedev.com/int/platformer-game-source-in-processing/

    nel secondo, in particolare, parla anche di Processing e nei suoi difetti parla solo della poca affidabilità dell'applet Java ( il cui supporto, come ho già scritto, è stato tolto nelle versioni successive, quindi niente più utilizzo via browser ) e sulla libreria audio di default, che penso sia sempre riferita al suo utilizzo nell'applet e molto probabilmente ad una versione un po' datata della stessa ]

     

     

    Video già visto in passato. GM lo conosco, ma attento i suoi problemi li ha, non per esperienza diretta, mai fatto molto ma... occhio o rischi di fare la fine che hai fatto con rpgmaker D:

    ^ ^

    Dovevo scrivere "fui stato tentato forse", lo vidi più di 1 anno fa, acqua passata xD

    ( magari però a qualcuno possono interessare questi articoli, in italiano e con progetti d'esempio, sulla "modalità" 3D di Game Maker 6: http://mastergidan.altervista.org/guida3D/Tutorials_3D_per_Game_Maker_6.html )

  3. Ok, qui mi son perso subito XD Comuqnue d'accordo con il fatto che html5 non convince :D

    Una cosa che forse è passata un po' inosservata, è che il programma famoso Adobe Flash ( a pagamento ), non è l'unico modo per creare un documento swf eseguibile con un Flash Player ( quest'ultimo è gratuito invece ). Esistono alternative gratuite al programma Adobe Flash, che ti danno quindi ancora la possibilità di utilizzare strumenti grafici per gestire la Timeline, potendo sempre integrare/alternare il linguaggio di programmazione ActionScript.

    Ma esistono anche alternative che ti permettono di avere a che fare solo con il linguaggio di programmazione ActionScript, quindi come se scrivessi codice C++ su un blocco note xD ( ovviamente, come per C++, Java etc., anche per l'ActionScript esistono IDE appositi che ti permettono quindi di integrare tutte quei passaggi necessari per passare dal codice all'eseguibile in modo automatico ).

    Per far ciò si può utilizzare Flex, SDK messo a disposizione, open-source e free ( che ricordo non sono sinonimi ), dalla stessa Adobe. Quindi ti scegli l'IDE, ci carichi l'SDK ( un po' come si fa, con un IDE C++, per le SDL ) e poi diciamo che inizi a programmare xD

    Adobe Air, sempre gratuito, è una libreria ( o un insieme di esse insomma ) che ti permette di superare dei limiti di Flash ( e quindi del Flash Player ) e di poter così accedere a delle funzioni del sistema operativo in uso, in modo comunque cross-platform. Facciamo un esempio pratico.

    Hai bisogno di creare una applicazione che carichi ed eventualmente salvi delle informazioni su un file di testo in una locazione specifica del disco ( magari non un path assoluto ma uno relativo alla applicazione stessa, tipo "/dati/miofile.txt" ). Con Flash di norma non puoi, perché gli mancano le possibilità necessarie per gestire file in tal senso. Grazie ad Adobe Air invece puoi ( http://help.adobe.co...age-detail.html, il simbolo rosso indica appunto che è disponibile solo con Air ).

     

    In sostanza, Flash, dopo aver installato il plugin apposito, ne usufruisci solitamente via browser ( ma se scarichi il player apposito, tra l'altro davvero leggero, puoi anche utilizzarlo al di fuori del browser, basta dargli in pasto il file .swf desiderato ).

    Mentre con Air, dopo aver installato il programma apposito ( runtime e installer di pacchetti .air ), potrai installare le applicazioni fatte con esso ( solitamente pacchetti installazione con estensione .air ) ed utilizzarle come se fossero native ( .exe su Windows, .app su MacOS X etc. ), oltre ad aggiungere nuove funzionalità. Aggiungo che l'applicazione creata non si utilizza, e non si può utilizzare, via browser ( per quello esiste già Flash, appunto ).

    In questo modo, stesso codice ActionScript ( a parte il caso in cui sfrutti le aggiunte di Air; magari ci specifichi una condizione per il pre-processore in base al target ) e possibilità di utilizzare l'applicazione risultante sia su browser, sia come se fosse nativa.

    Allo stato attuale quindi puoi creare il tuo gioco e farlo girare con Flash Player sui browser ( ed ormai sono quasi solo gli O.S. Desktop ad utilizzarlo; iOS praticamente mai supportato e ora nemmeno più Android ), mentre con Air li puoi far girare come nativi sia sui vari O.S. ( riuscendo ad utilizzarlo su Windows, MacOS X, Linux, Android e iOS; per quest'ultimi due, puoi anche includere le runtime Air direttamente nell'applicazione stessa, in modo che possa essere avviata direttamente anche senza aver precedentemnte installato le runtime ).

    Considera pure che oggi è possibile utilizzare la libreria Stage3D, che ti permette ( finalmente ) di accedere all'accelerazione grafica, quindi migliorare prestazioni sia di giochi 2D che fare effettivamente giochi 3D :O

    ( posso confermarti quanto scritto sopra per esperienza personale, ho fatto test con Stage3D ed Air e poi fatti girare su BlueStacks, oltre che su Windows e MacOS X; ovviamente quando esporti per android dovrai aggiungere un paio di cose relativamente agli standard imposti da Google, ma non riguardarebbe comunque il codice ActionScript; idem per iOS )

     

     

    Eppur qualche pazzerello che si mette a farli in assembly c'è, tanto per farsi male ^ ^

    Io comunque l'ho studiato un poco per un esame, ora neanche lo ricordo più, ci farei poco . Su un sistema chiuso/piccolo da ottimizzare conoscere qualche specifica in assembly non sarebbe male :3

     

    Speriamo siano due righe XD

    Come dicevo, è tutta una questione di hardware. A meno di non trovarsi con processori relativamente lenti ( qualche MHz dei PIC contro qualche GHz delle CPU Desktop/Server, oltre a dover considerare architetture migliori e multi-core ) o di dover accedere a delle funzionalità non coperte già dalle librerie col linguaggio di programmazione in uso, allora è solo uno spreco di tempo.

    Forse applicazioni che devono de-criptare chiavi, o fare simulazioni di chimica organica ( o anche peggio, roba a livello di proteine o a livello sub-atomico ) potrebbero richiedere tanta ottimizzazione, ma anche qui sarebbe uno spreco in quanto con C++ ottieni più vantaggi a fare una buona programmazione che sfrutti le tecnologie odierne ( come il multi-core ) invece che perdere tempo a limare le operazioni base ( come i loop ) con Assembly. Magari con Assembly guadagni qualche secondo, ma su elaborazioni che possono durare anche mesi, ha più senso puntare nello sfruttamente delle tecnologie moderne ( anche le GPU fanno la differenza in questi campi, possono svolgere calcoli davvero impressionanti... possiedono un numero di core davvero esagerato xD ).

    Se devi fare l'equivalente di questa roba in C++, con Assembly, non hai il tempo manco di finire il programma che la concorrenza ha già fatto nuove scoperte xD

    Insomma, a meno di motivi didattici o hardware specifici, Assembly non ha senso, non conviene. Troppo tempo e poche possibilità di sfruttare a dovere le tecnologie odierne ( a partire dalla programmazione orientata agli oggetti, fino alle tecnologie quali Pixel Shader e amici vari ). Figuriamoci poi il cross-platform o la possibilità di utilizzarlo direttamente su un browser... xD ( anche se ci fossero programmi appositi che convertano codice su codice, da assembly fino al necessario, non cambierebbe le cose... )

     

     

    Eh già di librerie migliori non si fa difficoltà a trovarle > <

    Mi chiedo perché usi C++ e Allegro xD

     

     

    Suppongo molto più di tanto, ma probabilmente così non ne sarei in grado e comunque rimango abbastanza niubbo e l'ho abbandonato da un pezzo XD Comunque quello riportato riesco più o meno a leggerlo ^ ^

    La questione tante righe di codice non mi spaventa (se proprio non hai l'acqua al collo insomma), basta che il linguaggio ce la fa, altrimenti per quello che voglio fare di linguaggi con due righe e via fai tutto ce ne sono ^ ^

    Non ho ben capito se quindi dovrai o meno utilizzare C++ e Allegro per il tuo progetto xD

     

    La questione non è solo tante righe di codice ( che tra l'altro diminuiscono parecchio la leggibilità e quindi la facilità con cui fare eventualmente debugging ). Processing ( che è il nome sia del programma/ambiente di sviluppo che del linguaggio di programmazione ) non è solo questo.

    • Quantità minore di codice e tante funzioni molto semplici da imparare e ad usare, senza togliere la possibilità di scrivere codice più avanzato ( Java );
    • L'IDE è molto pratica e comoda ( unico difetto: scarso ( o assente ) Highlighting; viene comunque data la possibilità di utilizzare un qualsivoglia editor di testo esterno, utilizzando Processing solo per la sua esecuzione ( io ad esempio ho usato Notepad++ xD );
    • Tante librerie ( e se non sbaglio è pure facile crearne, oltre ad utilizzarle ), tra cui addirittura il porting di OpenNI+NITE ( quelle che ho usato io per Kinect )... è stato fantastico quando l'ho visto xD
    • Cross-Platform ( Windows, MacOS X, Linux e Android; volendo è anche eseguibile in browser con l'esport in javascript );
    • Le librerie base per elaborazioni video, ad esempio, utilizzano proprio una delle versioni OpenGL più ottimizzate per Java ( insomma, le prestazioni non sono il suo problema ).

    Questi i primi che mi son venuti in mente.

     

    Poi in effetti non è adatto alla creazione di giochi, così come può non esserlo OpenGL con C++ e basta ( solitamente si usano le SDL, dove puoi utilizzare le OpenGL per la parte video ). Ma questo non significa che non si possa fare ( ci sono esempi peggiori, come Dark Rain e Pocket Quest... quest'ultimo poi è l'esempio di un gioco che andrebbe bene giocato su qualsiasi piattaforma e che potrebbe trarre tanti vantaggi da programmi come Processing... ci vuole meno a gestire le immagini con Processing che con RPG Maker >_>; in fondo, tolto il Database, il Default Battle System, il Menù, Charset e Chipset nel loro uso convenzionale... delle comodità/semplicità/comandi di RPG Maker se ne sfrutta sì e no un 20% :E ).

     

    Ti lascio un bell'esempio di mini-gioco che spinge, relativamente a diversi altri giochi 2D, abbastanza l'hardware ( vengono fatte operazioni abbastanza critiche in real-time... i grossi loop sono sempre un problema, non sempre puoi ottimizzare ricorrendo a matrici etc. ):

    http://a10thunderbolt2.com/

    ( NEL CASO non ti vada prova in un browser provane uno diverso... potrebbe anche essere un problema di versione di Java nel caso... in tal senso trovo più pratico Flash xD )

    A me funge bene e va fluidissimo... non saprei da te, non conosco l'hardware a tua disposizione xD

     

    Se poi conosci qualcosa che fa meglio di Processing, nei punti sopra elencati, sarò contento di venirne a conoscenza ^^

     

     

    Conta che negli anni qui ne abbiamo viste di cose in qualsiasi linguaggio che semplificano quelle fatte su rpgmaker, tanti scripter a lamentarsi XD

    Beh sì, decisamente xD

     

     

    C'è anche AllegroGL sì, ma mai usato D:

    Stiamo parlando di un... rpg stile Zelda fuso con un platform, salti di più, cadi giù, hai diverse animazioni e non ci sono miliardi di nemici su mappa, fatto bene di codice pure il più brutto java mi sa che lo regge XD Di certo elaborazioni video così onerose non ci vogliono. Ho guardato un po' tutte le librerie, so che con OpenGL e simili puoi fare comunque un buon 2D (così come con Allegro reggi un po' di 3D).

    ^ ^

    Capisco... io fui tentato parecchio da Game Maker quando vidi questo ( non centra molto col tuo discorso, ma l'aver citato Zelda mi ha ricordato il seguente video xD ):

     

    Java poi è anche già ben predisposto all'utilizzo dei Thread *_* ( altra informazione random xD )

     

     

    Sì, direi XD

    Dai mi sto organizzando per mettere da parte sui 1300 per un buon computer nuovo e di Allegro non son più tanto sicuro, ma... alla fine penso che ci rimarrò, java o simili li escludo ^ ^

    Ovviamente gli fps saranno sempre limitati od ha poco senso il contrario ° °

    Sicuro come specificato prima il tipo di gioco un java od uno Stage3D molto probabilmente non avrebbero difficoltà a farlo girare, quella del C++ è giusto un "mi piace" e voglio farmi male con più righette di codice. Di Allegro mi hai rimesso il dubbio adesso... ma non credo di avere problemi con quella libreria per il genere di gioco, che dici? ^ ^

    Da quanto mi pare di aver visto, Allegro viene aggiornato abbastanza ( pare che la versione 5.0 supporti anche Android e iOS: http://en.wikipedia...._%28software%29 ), e ha tante estensioni... Insomma, è una libreria orientata alla creazione di giochi ( similmente alle SDL, e non come OpenGL che è orientata solo all'elaborazione video ) che sa il fatto suo, ci puoi fare davvero tanta roba. Di questo non dovresti preoccuparti xD

    Quello che mi chiedevo era più che altro il motivo della scelta, essendocene davvero tante. Perché io penso che se si tratta di fare esperienza, allora utilizzare librerie apposite per ogni campo ( OpenGL video, OpenCL cacoli paralleli etc.) può darti la possibilità di acquisire strumenti molto utili, in generale, per il futuro ( lavorativo e non ), mentre con le Allegro la tua esperienza rimarrebbe più circoscritta ( sempre meglio che essere rimasti su RPG Maker, dove, arrivati ad un certo punto, il tempo lo perdi ad aggirare le sue carenze/limiti ed i suoi bug; non è sempre così, certo, dipende da quello che cerchi di fare ).

    Non esiste in assoluto la soluzione migliore, esiste semplicemente la soluzione più adatta a ciò che ti serve ottenere.

    Alla fine penso che tu ti sia semplicemente affezionato/abituato ( un po' come altri con RPG Maker, tra cui io prima di lasciare :E ) e quindi ti sta bene così. E ripeto, a meno di esigenze particolari, non si deve cambiare per forza, va benissimo così ( non che io abbia la presunzione ti farti cambiare idea eh xD ).

    Se poi sai già cosa ti aspetta ( nel senso che hai già imparato ciò che ti serve della libreria Allegro e sai già cosa dovrai fare ) a maggior ragione, se i tempi e gli sforzi son ragionevoli, non ha proprio senso anche solo farsi venire dubbi sul da farsi.

     

     

     

     

    EDIT: avevo scritto che Processing è solo il nome del programma e non del linguaggio di programmazione. Ho corretto perché è SIA il nome del programma CHE il nome del linguaggio di programmazione, come riportato dal sito ufficiale.

    Processing is an open source programming language and environment for people who want to create images, animations, and interactions.

  4. I messaggi di errore sono altamente casuali invece che causali a quanto pare! XD Libero ^ ^

     

    Comunque apro la discussione suddetta come hai specificato con i consigli utili, in caso continuiamo lì! ^ ^

     

    EDIT: ecco qui ^ ^

     

    A Starry, lo stesso identico messaggio, posso inviarlo senza problemi.

    Non so, magari mi hai aggiunto "per sbaglio" nella lista utenti bloccati... boh xD ( ecco perché mi hai detto di continuare per MP xD )

     

    Il problema è che nel mio PM c'era anche roba che sarebbe comunque OT nel nuovo topic xD

    Quindi nel nuovo topic posso mettere la parte inerente, ovviamente, ma il resto? =O

     

    Al più prova a mandarmi un pm tu e io provo a risponderti...

  5. Allora aspetta, possiamo prendere gli ultimi messaggi ed aprire un topic a parte il parlando del making sulla programmazione in generale ad essere interessante per tutti dovrebbe esserlo, va bene? :3

     

    Ah ecco, mi pareva strano avessero creato qualcosa così forte sul controllo memoria, ma si evolvono, quindi... capito allora.

    ^ ^

    Andrebbero scritti un po' meglio... vabbè xD

     

    Magari si può aprire un topic raccogliendo ( per categorie ) nel primo post tutti gli strumenti utili ( che verranno in mente agli utenti ) per lo sviluppo di applicazioni ( e quindi anche giochi ).

     

     

     

    PS: è corretto suppore che tu abbia la casella messaggi piena? xD

    Componi nuovo messaggio

     

     

    Si sono trovati i seguenti errori

     

    L'utente Guardian of Irael non puo' ricevere nessun nuovo messaggio

    Questo messaggio privato non e' stato inviato

    Forse è più probabile che tu li abbia disabilitati, il messaggio d'errore non è molto esplicito al riguardo xD

  6. In caso continuiamo per mp che non capisco più se stiamo OT o va bene che parliamo di linguaggi del gioco... DR con quale linguaggio ad esempio? XD

    Decisamente OT, sì. Ho solo pensato che certe cose potessero interessare anche ad altri e quindi ho scritto un po' una cozzaglia di nomi che possono essere interessanti ( Processing, BlueStacks, Adobe Air, etc. ), perché prima che nel caso apra qualche topic, potrebbero passare eoni :E

     

    Si va di PM. :sisi:

     

     

    Volevo giusto specificare una cosa:

    [...]

     

    ( in sostanza hai meno controllo sulla de-allocazione della memoria rispetto a C++ )

     

    [...]

    [...]

     

    Magari non te la fanno piacere per la storia del Garbage Collection... quella cosa del poter trattare la memoria anche manualmente che dicevi prima invece non la conoscevo :3

     

    [...]

    Mi son espresso da cani... Intendevo che, in generale, in Java hai meno controllo sulla memoria rispetto a C++, tant'è che la presenza della Garbage Collection ( che si occupa di liberare sistematicamente la memoria da oggetti non più referenziati, senza che il programmatore se ne debba preoccupare ) ha portato all'assenza di un comando specifico per de-allocare oggetti in Java ( in C++ possiamo grazie a delete ).

    E non abbiamo neanche la possibilità di richiamare con assoluta certezza una funzione particolare quando l'oggetto viene de-allocato dalla Garbage Collection ( in C++ abbiamo il de-costruttore che viene chiamato quando utilizziamo il comando delete ).

    Qualche possibile alternativa a delete e de-costruttore, ma assolutamente NON equivalente, può trovarsi qui: http://www.javamex.c...ts/delete.shtml

    In sostanza la cosa migliore da fare, quando si conosce il ciclo di vita di una variabile ( oggetto in questo caso ), è quella di richiamare una funzione di pulizia manualmente ( creata, dunque, appositamente dal programmatore in ogni classe i cui oggetti hanno bisogno di tale funzione, perché in generale, essendoci la Garbage Collection, non dovrebbe essercene bisogno ).

  7. @ Guardian of Irael

     

     

    Discorso HTML... hai ragione! Difatti non mi ci son mosso per nulla ancora e lo guardo un pochino alla distante, anche se credo ci sbatterò la testa prima o poi per giochini semplici visto che ormai promuovono solo quello e per il resto dicono muore di qua e muore di là ;____ ;

    Possono dire quel che vogliono, io aspetto ancora che il player video youtube versione HMTL5 funzioni non peggio di quello Flash... Steve Jobs ha insistito sul fatto che Flash non fosse adatto per gli smartphones... la "risposta" di Adobe è stata Air xD [ Air ti permette di utilizzare applicazioni scritte in ActionScript ( quindi anche con SDK gratuiti come Flex ) e di farle girare, QUASI come se fossero native, su varie piattaforme, sia Desktop che Mobile ( tra cui proprio iOS xD ) ].

     

     

    Lo sai che non son cose da dire queste così tante volte! Poi per far davvero tutto da zero ci viene da programmare con quello > <

     

     

    Col C++ sì, le librerie per quel che ho sempre visto ti salvano per farlo funzionare su ogni piattaforma, forse quei due accorgimenti finali ci vogliono però, pure io quel timore l'ho avuto... poi se usi visual studio per programmare, il solo-windows lo temi ° °

     

    Mmmh processing, non conoscevo, anche pechè sembra poco orientato al game come indirizzo, sarebbe comunque passato inosservato! Eppure qualsiasi cosa con su scritto java non è che mi abbia mai attirato più di tanto > <

    Fortunamente, non ha alcun senso, con l'hardware attuale, programmare giochi per Desktop e Mobile in assembly xD

    Però, quando mi è capitato di dover scegliere se programmare, un PIC della Microchip, in Assembly o in C, non ho avuto molti dubbi: Assembly. Penso che trattandosi anche di pochi MHz, abituarsi ad avere un maggior controllo sul flusso del programma, ottimizzando a dovere ove necessario ( cosa che magari in C non riusciresti a vedere a causa del livello di astrazione maggiore ), sia tutto di guadagnato nel momento in cui dovrai contare addirittura il tempo all'interno di un ciclo di operazioni ( solitamente composto da più di un ciclo di clock ).

    So che al più se ne utilizza un po', in campo professionale, sempre riguardo i videogame, qualora sia necessario effettuare specifiche ottimizzazioni ( magari sulla memoria ). Non mi stupirebbe se in questi casi centrassero console come la playstation, il cui hardware fa sempre tanto felici i programmatori xD

     

     

    Sottolineo che, semplicemente col C++, ci sono accorgimenti da prendere in base all'O.S., quanto poi questi siano "pesanti", è un altro discorso... possono essere due righe o, nel caso dell'Objective-C ( quindi MacOS e iOS ) anche di più. Ovviamente ci sono librerie cross-platform, come quelle che ho utilizzato per Kinect ( non è un caso che abbia utilizzato OpenGL e OpenNI, tra l'altro con un IDE cross-platform come CodeBlocks xD ), ma ci sono anche quelle che vanno su una sola piattaforma praticamente ( le DirectX mi pare solo Windows e Xbox ).

    Ciò che può seccare di più, ed è uno dei motivi per i quali avere uno stessa base hardware per console conferisce il vantaggio di poter usare hardware vecchio e ottenere comunque buoni risultati, è l'ottimizzazione in base ai diversi hardware montati su PC, nonché diversi driver... La scheda video della PS3 è ridicola già da un po', eppure ce la fa ancora ( pur sempre col difetto di texture generalmente meno dettagliate della concorrente Microsoft ).

     

     

    Anch'io sono sempre stato molto diffidente nei confronti di Java... non so perché xD

    Questo comunque non mi ha impedito di provare per un po' Processing ( la sintassi, come ho già scritto, assomiglia a Java, ma di base rimane più semplice, è fatta apposta perché sia abbastanza accessibile anche a chi non è proprio un programmatore: magari un artista che vuole creare un piccolo sketch audio-visivo ).

     

    Comunque più tardi, quando scelsi di dare un esame che comprendeva Java, mi dovetti ricredere: è più accessibile di quanto non sembri e ha i suoi "perché", anche se la questione della garbage collection mi puzza un po' ( in sostanza hai meno controllo sulla de-allocazione della memoria rispetto a C++ )... comunque ci sono tanti esempi di software scritti in Java, anche molto "pesanti", che funzionano bene, alla stregua di uno scritto in C++ ( come accennavo prima, le differenze possono anche essere impercettibili nella maggior parte della applicazioni ).

    Ci sono già giochi realizzati con Processing ( e anche cose più COMPLESSE ed ESIGENTI )... il fatto che non abbia una connotazione particolarmente orientata ai giochi, non significa che non sia adatto: è semplicemente adatto ad applicazioni in generale, così come lo è C++ e Java. Di sicuro non nascono come linguaggi di programmazione orientati ai giochi. È la scelta delle librerie che ti permette di ottenere vantaggi in un determinato campo ( le OpenGL sono adatte per elaborazioni video in generale, ma questo non gli impedisce, grazie anche alla accelarazione grafica, di fare meglio delle liberie Allegro, sempre rimanendo sul 2D ).

    Per Processing ci sono diverse librerie: quelle base sono già sufficienti per coprire le necessità di molti giochi ( puoi gestire mouse, tastiera, touchscreen, video 2D/3D, audio, se non erro anche socket etc. ).

    Sarei curioso di vedere quanto codice Allegro dovresti scrivere per ottenere lo stesso risultato che ho ottenuto io ( ovvero quel semplice test sulle collisioni che ho messo un paio di post fa ).

    Qui ti riport il codice per curiosità:

     

     

    /* @pjs preload="img/lower.png, img/upper.png, img/Zonta.png"; */
    PImage imgLower, imgUpper, imgCharsetPlayer, imgPlayer, imgUpperCollision, imgPlayerCollision;
    int intX=0, intY=0, intXnext=0, intYnext=0, intDirezionePlayer=0, intPassoPlayer=3, intPosaPlayer=1, intFrequenzaPlayer=25, intPosaFlagPlayer=1, intContatorePlayer=0, intDirCharaPlayer=0;
    boolean[] blnKeyBuffer = new boolean[256];
    boolean[] blnSpecKeyBuffer = new boolean[256];
    int intDimPlayer, intWidthPlayer, intHeightPlayer;
    private static final int DIR_LEFT = 1, DIR_LEFT_UP = 2, DIR_UP = 4, DIR_UP_RIGHT = 8, DIR_RIGHT = 16, DIR_RIGHT_DOWN = 32, DIR_DOWN = 64, DIR_DOWN_LEFT = 128;
    boolean blnNoCollision = false, blnNoBackground = false;
    void setup() {
    imgLower = loadImage( "img/lower.png" );
    size( imgLower.width*2, imgLower.height*2 );
    imgUpper = loadImage( "img/upper.png" );
    imgCharsetPlayer = loadImage( "img/Zonta.png" );
    imgPlayer = createImage( 24, 32, ARGB );
    imgPlayerCollision = createImage( imgPlayer.width, imgPlayer.height, ARGB );
    intWidthPlayer = imgPlayer.width;
    intHeightPlayer = imgPlayer.height;
    intDimPlayer = intWidthPlayer*intHeightPlayer;
    noSmooth();
    }
    void draw() {
    if ( blnKeyBuffer[int('c')] == true || blnKeyBuffer[int('C')] == true )
     blnNoCollision = true;
    else
     blnNoCollision = false;
    
    
    for ( int k = intPassoPlayer; k > 0; --k ) {
     intXnext = intX;
     intYnext = intY;
     intDirezionePlayer = 0;
     if ( blnSpecKeyBuffer[uP] == true ) {
      intYnext -= 1;
      intDirezionePlayer += DIR_UP;
      intDirCharaPlayer = 0;
     }
     if ( blnSpecKeyBuffer[right] == true ) {
      intXnext += 1;
      intDirezionePlayer += DIR_RIGHT;
      intDirCharaPlayer = 1;
     }
     if ( blnSpecKeyBuffer[DOWN] == true ) {
      intYnext += 1;
      intDirezionePlayer += DIR_DOWN;
      intDirCharaPlayer = 2;
     }
     if ( blnSpecKeyBuffer[left] == true ) {
      intXnext -= 1;
      intDirezionePlayer += DIR_LEFT;
      intDirCharaPlayer = 3;
     }
     if ( intContatorePlayer > 0 ) {
      if ( intContatorePlayer < intFrequenzaPlayer*2 ) {
    if ( intContatorePlayer == intFrequenzaPlayer ) {
     intPosaPlayer = 1;
    }
    intContatorePlayer++;
      }
      else {
    intPosaFlagPlayer = ( intPosaFlagPlayer == 0 )?( 1 ):( 0 );
    intPosaPlayer = 1;
    intContatorePlayer = 0;
      }
     }
    
     if ( intContatorePlayer == 0 ) {
      if ( intDirezionePlayer != 0 ) {
    intContatorePlayer = 1;
    if ( intPosaFlagPlayer == 0 )
     intPosaPlayer = 0;
    else
     intPosaPlayer = 2;
      }
      else
    intPosaPlayer = 1;
     }
     
     imgPlayer.copy( imgCharsetPlayer, intPosaPlayer * imgPlayer.width, intDirCharaPlayer * imgPlayer.height, imgPlayer.width, imgPlayer.height, 0, 0, imgPlayer.width, imgPlayer.height );
     imgPlayer.loadPixels();
    /*
    0: SINISTRA ( - )
    1: SU ( - )
    2: DESTRA ( + )
    3: GIU ( + )
    */
     int[] intEstremiPlayer = { intWidthPlayer - 1, intHeightPlayer - 1, 0, 0 };
     for ( int i = 0, y = 0; y < intHeightPlayer; ++y ) {
      for ( int x = 0; x < intWidthPlayer; ++x, ++i ) {
    if ( ( imgPlayer.pixels[i] >> 24 & 0xFF ) != 0 ) { // ALPHA
     // SINISTRA
     if ( x < intEstremiPlayer[0] )
      intEstremiPlayer[0] = x;
      // SU
     if ( y < intEstremiPlayer[1] )
      intEstremiPlayer[1] = y;
     // DESTRA
     if ( x > intEstremiPlayer[2] )
      intEstremiPlayer[2] = x;
     // GIU
     if ( y > intEstremiPlayer[3] )
      intEstremiPlayer[3] = y;  
    }
      }
     }
     if ( intEstremiPlayer[0] == ( intWidthPlayer - 1 ) )
      intEstremiPlayer[0] = 0;
    
     if ( intEstremiPlayer[1] == ( intHeightPlayer - 1 ) )
      intEstremiPlayer[1] = 0;
    
     if ( intEstremiPlayer[2] == 0 )
      intEstremiPlayer[2] = intWidthPlayer - 1;
    
     if ( intEstremiPlayer[3] == 0 )
      intEstremiPlayer[3] = intHeightPlayer - 1;
     int intWidthPlayerEffective = intEstremiPlayer[2] - intEstremiPlayer[0] + 1;
     int intHeightPlayerEffective = intEstremiPlayer[3] - intEstremiPlayer[1] + 1;
     int intDimPlayerEffective = intWidthPlayerEffective * intHeightPlayerEffective;
    
    
     int[] collisioni = { 0, 0, 0, 0 };
    
     // SINISTRA
     imgPlayerCollision.copy( imgUpper, intX + intEstremiPlayer[0] - 1, intY + intEstremiPlayer[1], 1, intHeightPlayerEffective, 0, 0, 1, intHeightPlayerEffective );
     imgPlayerCollision.loadPixels();
     for ( int i = 0; i < intHeightPlayerEffective * ( intWidthPlayer - 1 ); i += intWidthPlayer ) {
    if ( (imgPlayerCollision.pixels[i] >> 24 & 0xFF) != 0 ) { // ALPHA
     collisioni[0] = 1;
     break;
    }  
     }
     // SU
     imgPlayerCollision.copy( imgUpper, intX + intEstremiPlayer[0], intY + intEstremiPlayer[1] - 1, intWidthPlayerEffective, 1, 0, 0, intWidthPlayerEffective, 1 );
     imgPlayerCollision.loadPixels();
     for ( int i = 0; i < intWidthPlayerEffective; ++i ) {
    if ( (imgPlayerCollision.pixels[i] >> 24 & 0xFF) != 0 ) { // ALPHA
     collisioni[1] = 1;
     break;
    }  
     }
     // DESTRA
     imgPlayerCollision.copy( imgUpper, intX + intEstremiPlayer[0] + intWidthPlayerEffective, intY + intEstremiPlayer[1], 1, intHeightPlayerEffective, 0, 0, 1, intHeightPlayerEffective );
     imgPlayerCollision.loadPixels();
     for ( int i = 0; i < intHeightPlayerEffective * ( intWidthPlayer - 1 ); i += intWidthPlayer ) {
    if ( (imgPlayerCollision.pixels[i] >> 24 & 0xFF) != 0 ) { // ALPHA
     collisioni[2] = 1;
     break;
    }  
     }
     // GIU
     imgPlayerCollision.copy( imgUpper, intX + intEstremiPlayer[0], intY + intEstremiPlayer[1] + intHeightPlayerEffective, intWidthPlayerEffective, 1, 0, 0, intWidthPlayerEffective, 1 );
     imgPlayerCollision.loadPixels();
     for ( int i = 0; i < intWidthPlayerEffective; ++i ) {
    if ( (imgPlayerCollision.pixels[i] >> 24 & 0xFF) != 0 ) { // ALPHA
     collisioni[3] = 1;
     break;
    }  
     }
     if ( blnNoCollision == false ) {
      if ( ((intDirezionePlayer & DIR_LEFT) != 0x0) ) {
    if ( collisioni[0] == 0 )
     intX = intXnext;
      }
      if ( ((intDirezionePlayer & DIR_UP) != 0x0) ) {
    if ( collisioni[1] == 0 )
     intY = intYnext;
      }
      if ( ((intDirezionePlayer & DIR_RIGHT) != 0x0) ) {
    if ( collisioni[2] == 0 )
     intX = intXnext;
      }
      if ( ((intDirezionePlayer & DIR_DOWN) != 0x0) ) {
    if ( collisioni[3] == 0 )
     intY = intYnext;
      }
     }
     else {
      intX = intXnext;
      intY = intYnext;
     }
    }
    if ( blnNoBackground == false ) image( imgLower, 0, 0 );
    image( imgUpper, 0, 0 );
    fill( 0, 0, 255, 200 );
    image( imgPlayer, intX, intY );
    
    fill( 0, 255, 255 );
    fill( 255, 255, 255, 125 );
    rect( 10, height/2 - 70, width/2 - 20, 60 );
    fill( 0, 0, 0 );
    text(
      "X: " + intX + " Y: " + intY +
      "  NO-COLLISION: C( " + blnNoCollision + " ) "
      , 20, height/2 - 50);
    text(  
      "NO-BACKGROUND: B( " + blnNoBackground + " )"
      , 20, height/2 - 30);
    }
    void keyPressed() {
    if ( key == CODED ) {
     blnSpecKeyBuffer[keyCode] = true;
    }
    else {
     blnKeyBuffer[int(key)] = true;
    }
    }
    void keyReleased() {
    if ( key == CODED ) {
     blnSpecKeyBuffer[keyCode] = false;
    }
    else {
     blnKeyBuffer[int(key)] = false;
    }
    
    if ( ( key == 'b' ) || ( key == 'B' ) )
     blnNoBackground = ( blnNoBackground == false )?( true ):( false );
    }
    

     

     

    Tolto il mio modo tremendo di scrivere codice, è molto facile da leggere anche se non si conosce Processing... la maggior parte delle operazioni sono "astratte" ( con un comando, loadImage, ti carichi l'immagine e con un altro, image, la mostri... è maledettamente semplice... ho il sospetto che i tempi di sviluppo, nonché la qualità e le possibilità, di giochi portati avanti con RPG Maker e che fanno uso quasi esclusivo delle Picture, otterrebbero solo miglioramenti nell'utilizzo di un programma del genere... per assurdo in certe cose è pure più semplice di RPG Maker... ).

    Se l'avessi esportato in Java invece che in javascript, le prestazioni sarebbe sicuramente migliori ( a me anche la versione javasript gira a 60 FPS comunque, ma provandolo su un netbook scende parecchio... in Java dovrebbe farcela tranquillamente ).

     

    Ecco, non mi è mai minimamente venuto in mente di provare un emulatore android, per quanto mi interessasse quest'ultimo, grazie, avere il link sottomano è buona cosa, salvato! :3

     

    Non uso le OpenGL, mi muovo sempre in 2D e mi son trovato bene con Allegro, mi sta simpatica XD

    Inizialmente ho provato un po' a programmare in Java con l'SDK ufficiale e quindi con l'emulatore ufficiale... uno schifo... emulatore troppo lento e non supportava bene l'accelerazione hardware. Per assurdo, BlueStacks che non è realizzato da Google, funziona correttamente negli aspetti prima elencati e non solo.

     

    Allegro non l'ho mai usata... so che ci sono diverse versioni API e che esiste anche AllegroGL che ti consente di sfruttare l'accelerazione hardware e così di superare il divario che avresti senza OpenGL [ questo divario ovviamente esisterebbe solo qualora dovessi fare elaborazioni video abbastanza onerose... è chiaro che se ti metti a fare un Super Mario World ( uno di quelli per SNES insomma xD ) molto probabilmente non sentiresti differenza, tra Allegro normale e OpenGL, a livello di prestazioni e quindi di FPS ]. Ti ricordo che le OpenGL permettono di fare elaborazioni video in generale, non è "costretto" al 3D, quale visuale adottare, quali dimensioni sfruttare e quali tecnologie adoperare, lo decidi tu alla fine. Hai controllo a sufficienza con quelle xD

     

    Io son cattivo da questo punto di vista :sisi:

     

    Il problema del test su diversi pc, io ne ho uno vecchio e basta > <, poi arrivati alla fine su mezzi altri non funzionano mai ;____ ;

    Buoni due punti, il primo l'ho seguito, vediamo se riesco per bene con il secondo ^ ^

    È giusto essere cattivi ma... con un portatile vecchio e usando le librerie Allegro... rimani un po' indietro xD

    Provo a spiegarmi con un esempio... se tu fai un gioco sia in C++ che in Java ( su un computer normo-dotato eh xD ) e poi provi entrambi senza limitare a 60 gli FPS, potrebbero anche girarti rispettivamente a 310 e 279 ( OpenGL eh xD ). Se in ogni scenario questi non scenderanno mai sotto i 60 FPS ( volendo potremmo stare anche più bassi e quindi a 30 FPS, ma va bene così xD ) per te, una volta fissato il gioco a 60 FPS ( non ha alcun senso tenerlo più alto, l'occhio umano ha i suoi limiti :E ) non cambia nulla tra C++ e Java... Il punto allora è "se lo faccio girare su un computer sempre più obsoleto, ad un certo punto arriverò a far girare la versione C++ a 60 FPS e la versione Java a meno di 60 FPS, perché quando erano senza freni la versione C++ era più performante". In questi casi ti direi: "boh?" xD

    Questo "boh?" deriva dal fatto che non sai a cosa era dovuta quella differenza di FPS e quindi se quella causa viene meno in un computer obsoleto, perdi anche il vantaggio in sostanza... Poi non è neanche detto che gli FPS di entrambi varino in modo lineare ( le librerie adattate ai due linguaggi potrebbero adottare soluzioni diversamente efficenti in determinate situazioni )...

    Insomma, parecchie variabili in gioco e quindi colgo l'occasione per ribadire: nella maggior parte dei casi, a meno che non sia stato programmato da cani o si debbano compiere calcoli davvero onerosi, NON ci sarà differenza percettibile, a livello di resa finale, tra certi linguaggi di programmazione.

    È come aspettarsi percettibili differenze di tempo tra un semplice loop realizzato rispettivamente in C++ e in Assembly. Se magari lo fai girare su un PIC allora, forse, sì xD

     

    Credo che differenze ne possa trovare più facilmente tra Stage3D ( accelerazione grafica in Flash ) e C++, difficilmente tra Java e C++. E nonostante ciò, sono abbastanza sicuro che neanche con Stage3D avresti problemi col tuo gioco ( sempre parlando di un computer normo-dotato xD ).

     

     

  8. DR era uno dei progetti più promettenti del making italiano, ma visto che avete intenzione di passare a qualcosa di più serio, siete perdonati XD

    Buona Fortuna :sisi:

    buona fortuna ^ ^ aspetto il nuovo topic nella sezione altri tool

    Grazie!

     

     

    @ Guardian of Irael

     

     

    Vi ci clicco ovunque in caso :D

    [...]

    Non preoccuparti... sarà un nuovo tipo di banner: non sarai tu a cliccare loro, saranno loro a cliccare te B°D

     

    [...]

    Quando hai detto javascript ho pensato subito all'html5, stavo guardando proprio oggi qualcosina...

     

    C++ è il mio preferito :3

    E va beh, si vede ormai che vuoi libertà totale, a me più di tanto non dispiace ^ ^

    Peccato che, HTML5, presenti ancora dei bug non trascurabili ( tra report che ho letto in giro e problemi vari che si hanno con il nuovo visualizzatore video HTML5 di youtube... ).

    Inizialmente, infatti, volevo proprio puntare su HTML5, utilizzando nello specifico questo framework ( insomma, una base di librerie da cui partire ): PhoneGap. Qui le caratteristiche: Supported Features.

    Il motivo principale per cui ho lasciato perdere è che il supporto all'accelerazione grafica non è ancora ai livelli necessari per far girare bene ovunque le applicazioni fatte ( magari c'è quel browser, in quel sistema operativo, che ancora non ha introdotto il supporto alle WebGL oppure gli mancano alcune features dell'HTML5 e/o del CSS3 etc. ).

     

    Il C/C++ rimane la base di tutto... Un livello più basso è coperto solo dall'Assembly ( in realtà Assembly è solo basso livello xD ).

    Lo svantaggio odierno, rispetto ai linguaggi interpretati come Java ( il quale mi pare di aver letto possa anche essere compilato in modo da avvicinarsi alle prestazioni del "rivale" C++, pur venendo comunque eseguito all'interno della sua virtual machine che ne permette appunto l'uso su tutte le piattaforme in cui vi è installata ), è che spesso hai la necessità di fare particolari modifiche ( magari da Windows a Linux e viceversa ) oppure dover proprio imparare un linguaggio analogo ( è il caso dell'Objective C per MacOS e iOS... alcune cose le puoi anche fare in C++, altre pare di no ) per poter coprire diverse piattaforme ( se per iOS si parla di Objective C, per Android si parla di Java, nonostante per entrambi si possa comunque fare una buona parte in C++ con gli appositi SDK ). Forse con le librerie QT si riesce a fare qualcosa, in C++, senza dover scomodare altri linguaggi, però a suo tempo c'era qualcosa che non mi convise tanto ( forse non avevo accesso a tutte le funzioni che mi servivano... boh ). Non l'ho evidenziato ma l'obbiettivo sarebbe avere un unico codice che può girare sulla maggior parte delle piattaforme, i cui vantaggi sono sufficientemente evidenti.

     

    Un programma molto buono, a mio giudizio, che si occupa di esportare del codice ( abbastanza semplice da imparare, grazie anche alle numerose funzioni e librerie già pronte ) in una applicazione Java ( utilizzabile quindi su Windows, Linux, MacOS X, Android ed esporta anche in javascript, quindi utilizzabile nel browser ), è: Processing, open-source e nessuna licenza da acquistare, anche se vuoi vendere le tue applicazioni.

    Il codice è molto simile al Java, tant'è che se non erro puoi anche scrivere codice Java.

    Prima c'era il supporto anche per l'applet Java ( quindi lo potevi esportare in modo che fosse eseguibile via browser, come MineCraft ), ora per motivi di minor supporto hanno abbandonato questa opzione.

    Rimane comunque il fatto che sia molto valido per tutto il resto e la possibilità di esportare in javascript compensa, in parte, la mancanza dell'applet ( il test javascript nell'altro mio messaggio è fatto ed esportato proprio con Processing ).

    Per chi poi non ha un Android su cui provare ed utilizzare applicazioni già esistenti o fatte con Processing, ho avuto modo di verificare l'ottima efficacia di un programma che simula un ambiente Android ( decisamente meglio dell'emulatore messo a disposizione da Google ): BlueStacks.

     

    Insomma, se vuoi accelerare i tempi e non dover scoprire volta per volta i problemi relativi ad ogni O.S. ( e quella funzione lì non è supportata per quella versione della libreria per quell'hardware specifico, e quello che va in crash con quel driver etc. etc. ), Processing potrebbe essere molto interessante. Sottolineo come abbia decisamente poco da invidiare alla maggior parte delle applicazioni scritte in C++ e che utilizzano le OpenGL ( per andare effettivamente a scovare le differenze nelle prestazioni, bisogna ritrovarsi in casi abbastanza limite o eccezzioni particolari, insomma, non sono problemi che riguardano la maggior parte delle applicazioni e dei giochi xD ).

     

    Questo te lo dico per esperienza, seppur brevissima, personale: ho fatto una piccola collaborazione con un gruppo di ricerca della mia facoltà, realizzando una semplice applicazione in C++, su Linux e su Windows ( cercando quindi di avere un unico codice ) che utilizza le OpenGL per la parte video e le OpenNI+NITE per interfacciarsi col Kinect ( sono librerie davvero ben fatte ). Lo scopo era quello di avere delle zone particolari nello spazio con cui interagire ( per esempio, si può piazzare un triangolo nello spazio e se una persona ci passa sopra, quello cambia colore, così da evidenziare l'avvenuta collisione ).

    Per una cosa così, abbastanza modesta, sono comunque sorte alcune seccature causate da driver e hardware video differenti ( persino una "scemenza" come l'anti-aliasing può essere dare risultati differenti in differenti hardware, e non parlo di vecchi computer... ).

    Da questa esperienza capì che:

    1) dovevo mollare RPG Maker, avevo troppe cose importanti da imparare e cominciare ad utilizzare un linguaggio di programmazione in modo più costante è una di quelle;

     

    2) è necessario trovare il modo più efficiente di spendere il proprio tempo, sia nel presente che nel futuro ( anche relativamente all'acquisizione di conoscenze utili economicamente ): un linguaggio di programmazione come Java e Action Script permette di scrivere un unico codice e di farlo girare su un buon numero di O.S. e hardware differenti.

     

     

     

    Ah sì, quello lo avevo già visto tempo fa sul gruppo FB XD

    Bene almeno per la firma nuova :D

    Comunque intendevo fatevi sentire qui ogni tanto :*

    Prima o poi aprirò qualche topic... che sia qualche roba vecchia di RPG Maker o per segnalare qualche programma utile come quello più su.

     

     

     

     

    @ Lusianl

     

     

    Beh dai.Un modo per crescere.

    Una cosa mi raccomando, di rimanere sempre su questo forum, magari postando nella sezione degli altri tool.;)

    Ora per la questione del cambio tool, non so dirti se fai o no una scelta giusta.Per me i nuovi tool sono gia avanti, figurarsi un altro tool con maggiori possibilità...

     

    [...]

    @) RPG Maker non è gratuito, i linguaggi di programmazione e gli altri programmi e librerie che ho citato, sì;

     

    @) RPG Maker, e ciò che ci fai, gira SOLO su Windows ( gli altri si agganciano o se ne hanno la possibilità si installano macchine virtuali ed altro, ma non sempre è la stessa cosa... );

     

    @) ci sono casi in cui le prestazioni non sono soddisfacenti ( = LAG );

     

    @) non è adatto alla realizzazione di qualsiasi tipo di gioco, anche con l'introduzione del Ruby ( non a caso si chiama RPG Maker... non intendo dire che non si possa fare, semplicemente che può risultare insoddisfacente il risultato e/o i tempi per ottenerlo );

     

    parere personale) se devo programmare, preferisco crearmi anche gli strumenti per lo sviluppo, in modo da imparare cose nuove e ad avere più libertà di azione.

     

    Questi sono i primi che mi vengono in mente, probabilmente se ne trovano anche altri.

     

    [...]

     

    Comunque una cosa devo dirla, ho visto moltissimi giochi per smarphone con risorse dell'enterbrain a pagamento, questo mi fa storcere un pò il naso.

    Sinceramente non saprei... è probabile che fin quando non dai molto nell'occhio nessuno ti cerchi... Se ti riferisci alle risorse RPG Maker, magari se uno acquista la licenza del programma poi ha anche la possibilità di utilizzare la grafica nella propria applicazione da vendere, sia che la si sviluppi con RPG Maker stesso, sia che si utilizzi un altro strumento o linguaggio di programmazione...

    Non so poi che politiche attuino alla verifica di tal proposito...

     

     

     

     

    PS: ho sistemato un pochino i miei post precedenti per farli sembrare meno caotici xD

  9. Grazie ^^

     

    @ Testament

     

     

    Che vi devo dire? Buon viaggio nel vostro nuovo mondo.

     

    Personalmente la cosa mi dispiace in una maniera che non potete immaginare, anche in previsione di un Dark Rain futuro.

     

    Sono il primo che vorrebbe vendere PQ, ma, da bravo incoerente qual sono, la tendenza recente all'abbandono di progetti su rpgmaker/l'abbandono di rpgmaker per tentare la strada del mercato... lo so è antiquato e fatto male (mi senti limitato anche io), ma mi rattrista lo stesso.

     

    Vi auguro comunque buona fortuna per il futuro, sperando che la strada intrapresa vi porti dove volete.

    In realtà, per quanto riguarda Dark Rain, il passaggio da tool a linguaggio di programmazione, non deriva dalla possibilità di poter vendere il prodotto, tant'è che in quest'ottica non era stato nemmeno pensato... Per "rispetto" nei confronti di chi ha creduto in questo progetto, il massimo della forma di guadagno sarebbe banner pubblicitari, sponsor o cose così, ma il gioco verrebbe rilasciato gratuitamente, almeno su piattaforma Windows ( chiaro che se non ci costa nulla in più, anche su altri O.S., comunque ribadisco che le intenzioni per Dark Rain sono quelle di un gioco gratuito ).

     

     

    Nel mio messaggio volevo in effetti anche citare Pocket Quest, le cui caratteristiche ( grafica, gameplay etc. ) mi fanno pensare ad un gioco che potrebbe girare tranquillamente su qualsiasi piattaforma ( anche touchscreen ).

     

    Dunque, uno dei motivi principali per l'utilizzo di un linguaggio di programmazione, è l'abbattimento di quella barriera esistente tra le varie piattaforme... poter vedere giochi come PQ, DR e tanti altri, anche su piattaforme DIFFERENTI da Windows e magari usufruirne anche in maniera più PRATICA ( io trovo maledettamente comodo, ad esempio, aprire una pagina web e subito iniziare a giocare... qualcuno ha detto "Adobe Flash"? Un esempio recente, tutto italiano e addirittura da un utente di questa comunità, è Bugongo di Havana24 ).

     

    Sempre in termini concreti, Starry utilizza MacOS X ed ha un hard disk già abbastanza pieno... invece di doversi installare in qualche modo Windows, ha la possibilità di lavorare ad un progetto multi-piattaforma senza problemi.

     

    Prima ho scritto Flash, ma anche Javascript ( con l'avvento di HTML5 ) ha raggiunto un certo grado di maturità... grazie a WebGL e tecnologie simili, è possibile sfruttare l'accelerazione hardware nei browser, potendo così disporre di prestazioni maggiori, ovvero l'utilizzo di giochi più esigenti senza neanche doversi preoccupare dell'installazione.

     

     

    Vorrei poi ricordare, anche se non credo ce n'è sia davvero bisogno, che RPG Maker non nasce come programma gratuito e l'acquisto delle versioni precedenti all'XP, se non erro, è difficoltoso se non impossibile. Se ad esempio si utilizza C++ con SDL e OpenGL etc. ( anche Flash, basta utilizzare programmi gratuiti alternativi ad Adobe Flash Professional o direttamente programmare in Action Script senza alcun tool ma solo con la tipica IDE per sviluppatori software, volendo pure il blocco note ), non vi è alcun costo da sostenere in tal senso: si tratta di licenze open-source che non prevedono alcun acquisto e ti danno comunque la possibilità di rilasciare gratuitamente o vendere il tuo prodotto. Per me è un macigno in meno sulla coscienza...

     

    Senza contare che fare certe cose su RPG Maker è come farle su Assembly, non ne vale la pena...

    http://darkrain09.altervista.org/_altervista_ht/screen/Codice.png

    ( piccolo estratto di codice )

    Mi son dovuto scaricare il programma di Cherry e modificare dimensione dei caratteri etc. per non diventare cieco... e nonostante i commenti che mi son lasciato è un macello riprendere... mi son dovuto creare anche un file excel perché, non a caso, non ho dato nomi alle variabili di RPG Maker, proprio come avviene in Assembly con i registri della CPU... Il motivo deriva dalla esigenza di avere delle posizioni variabili per le variabili... quindi alcune venivano utilizzate come puntatori etc. etc.

     

    Concludendo, avrebbe più senso utilizzare la Patch di Cherry, DynRPG, e programmarmi in C++ il CBS ( per tutta una serie di validi motivi ) per infilarcelo a forza su RPG Maker, OPPURE, visto che di programmazione tanto si tratta, passare direttamente ad un linguaggio di programmazione?

    Con DynRPG e patch simili, e con i successivi RPG Maker ( XP, VX, VX Ace ), dovendo programmare per fare certe cose, da un lato perdo il vantaggio della semplicità di RPG Maker, dall'altro NON ottengo il vantaggio di poter utilizzare l'accelarazione grafica attraverso librerie come OpenGL, che invece avrei slegandomi da RPG Maker.

    La libreria di Cherry per C++ non è neanche ostica volendo, però, nel mio caso, non è più un compromesso ragionevole...

     

     

     

     

    EDIT:

     

    @ Guardian of Irael

     

     

    Ed eccovi > <

     

    Javascript D:

     

    Bene per la voglia di rifarlo con grafica da zero ^ ^

     

     

    In particolare? :3

     

    Oh beh per i difetti di rpgmaker, stiamo lì, stessa cosa per la quale l'ho abbandonato ^ ^

     

    Perchè non rilasciate mezze demo tecniche per quel bel video del BS e le immagini sulla distanza? Sicuramente saranno utili a chi vuole rimanere su rpgmaker! ^ ^

     

    ####

     

     

    E:3

     

     

    ^ ^

     

     

     

    Ecco più che altro ricordo ad entrambi che là sotto abbiamo sezioni per altri linguaggi e tool... quindi non spariteci adesso, fatevi sentire in un futuro non troppo lontano con news sui vostri progetti che vanno su altre strade ^ ^

     

     

     

     

     

     

     

     

     

     

     

    eh!

    Appena i limoni saranno maturi, verremo a spremere i limoni!! è__é

     

    ehm... sì, appena abbiamo qualcosa di corposo, apriremo un topic apposito xD

     

    Per quanto riguarda demo tecniche o altro... boh... nel senso, la fatica per prendere progetti, caricarli e lasciare qualche link in giro, è minima... faccio molta più fatica a scrivere un messaggio xD

    Il punto è: del codice così "mal messo", quanto sarebbe utile essendo decisamente difficile da leggere? Penso sempre che chi è in grado di leggere certi codici altrui, sa già come fare certe cose da sé... Avrei piuttosto preferito descrivere qualche "algoritmo" ( a proposito del cono visivo ), ma ci vuole tempo per descrivere certe cose per bene >__>

     

     

  10. Ci scusiamo con tutti per non aver scritto nulla prima.

     

    Come già hanno scritto altri utenti prima di me, il progetto è "morto".

     

    Sarebbe più corretto scrivere che non sarà più fatto con RPG Maker e che l'intenzione è rifarlo da capo utilizzando un linguaggio di programmazione,

    potrebbe essere pure in javascript xD

     

     

    http://darkrain09.altervista.org/_altervista_ht/screen/TestProcessingDR.png

    ( piccolo vecchio test sulle collisioni http://darkrain09.al....org/rpg_maker/ )

     

    @ i tasti sono:

    • frecce direzionali per il movimento
    • tenere premuto il tasto C mentre ci si muove per tenere disattivato il controllo delle collisioni, similmente a quanto avviene nella modalità test di RPG Maker
    • il tasto B attiva/disattiva lo sfondo ( quando lo sfondo è inattivo si visualizza solo il protagonista e il livello superiore, che viene utilizzato come test per le collisioni )

    @ in base al browser e all'hardware in uso, la velocità di esecuzione potrebbe calare decisamente;

    @ mentre il livello superiore della grafica viene utilizzato come test per collisioni statiche, il personaggio è dotato di una maschera di collisioni di dimensioni pari all'animazione corrente ( volendo potevo mettere solo metà altezza, analogamente a quanto avviene in RPG Maker ).

     

     

     

     

    Il rifarlo da capo, all'inizio, comprendeva solo cambiare totalmente stile grafico ( in modo da rendere anche più rapido creare risorse da zero ) perché, a mio parere, non trovo poi così corretto definire quel gioco "mio" se poi metà del lavoro è stato fatto da terzi... che sia uno sprite, un midi o uno script. Per esprimere la propria fantasia è più che giusto colmare le proprie lacune ( abilità o tempo che sia ) con risorse esterne, però arrivati ad un certo punto questo fatto non mi/ci soddisfava più.

     

    Prima di riprenderlo in mano, però, ci dedicheremo ad un altro progetto, completamente differente, in modo da poter anche familiarizzare meglio con un linguaggio di programmazione in particolare e schiarirci meglio le idee.

     

     

    I motivi per cui abbiamo deciso di accantonare RPG Maker ( sempre che a qualcuno interessi xD ) sono molteplici...

     

     

    @ il tuo GIOCO è SVILUPPABILE e GIOCABILE solo nei O.S. Windows ( non è sempre la stessa cosa utilizzarlo su altri sistemi operativi attraverso macchine virtuali o altro, e non tutti lo sanno o vogliono farlo; senza poi contare le piattaforme "mobile" );

     

    @ ci sono EVIDENTI limitazioni nelle prestazioni ( per quanto continui a sostenere "l'unico limite è la fantasia", ciò non basta a sopperire il fatto che RPG Maker sia un programma obsoleto dal punto di vista delle tecnologie utilizzate per il rendering video e non solo... questo implica che se voglio mostrare dinamicamente tot immagini, il progetto sarà ingiocabile in molti computer che non hanno una CPU relativamente potente, perché a quanto sembra RPG Maker "non ha mai visto una scheda video in vita sua", quindi tutto il carico va alla CPU... in una parola? LAG );

     

    @ all'inizio RPG Maker va bene per imparare certe basi del game design senza eccessivi sforzi negli altri campi ( programmazione in primis )... dopo un po', però, ci si rende conto che:

    • certi eventi li programmi più agevolmente e meglio con un linguaggio di programmazione;
    • i "processi paralleli" abituano ad una concezione sbagliata del "flusso di gioco";
    • non utilizzando un linguaggio di programmazione vero e proprio, il progredire della propria esperienza viene troncato, negandoti la possibilità di ottenere qualcosa di molto utile in ambito lavorativo;
    • altre cose varie ed eventuali.

    Questo è quello che penso io ( a parte i dati di fatto, come le sopraccitate carenze/limiti ), relativamente al fatto che sapevo già programmare un minimo, e mi lasciai tentare dalla rapida curva di apprendimento di RPG Maker ( parliamo si e no del 2002-2004 xD )...

     

    Tutto ciò è riferito ad RPG Maker 2000/2003, per quanto riguarda XP, VX, VX Ace... non ci penso minimamente xD

    Se devo programmare, ne aprofitto per partire dal più basso possibile, quindi niente tool. E preferisco avere anche più libertà sulle risorse grafiche e sonore ( accelerazione grafica, però che possa sfruttare un minimo di "tecnologie" quali vertex buffer object etc.; non dico un sistema audio 5.1, però almeno una gestione più avanzata dell'audio con spostamenti graduali di volume e posizione stereo sì... magari anche qualche trasformata di Fourier visto che ci siamo xD ).

     

     

     

     

    Visto che mi sembra brutto non scrivere nulla su alcune cose che son state fatte, riguardo Dark Rain, alcune vecchie e alcune più recenti, vi lascio qualcosina xD

     

     

    Robbba vecchia:

    http://i3.ytimg.com/vi/NeSlS87SDP8/mqdefault.jpg

    Video del vecchio CBS: 3 vs 10!

     

     

    Robbba recente:

     

    Qualche prova sull'HUD del protagonista, Zonta:

    http://darkrain09.altervista.org/_altervista_ht/screen/HUDs.png

    Mentre gli esperimenti a sinistra e al centro li ho fatti io, quella <pixellata nera fighissima> a destra, è ad opera di Starry *__*

     

     

    Qui invece uno screen del più recente CBS ( con grafica per TESTING, ovviamente xD ):

    http://darkrain09.altervista.org/_altervista_ht/screen/NBS.png

    Ho utilizzato la patch DestinyDLL SOLO per disegnare dinamicamente i valori di alcune variabili d'interesse ( i numeri neri in alto ) e l'area rosa ( composta evidentemente da quadratini rosa 16x16 ).

    L'area rosa rappresenta il "campo visivo" del nemico, che chiaramente "ruota" in base al verso del nemico stesso.

    Mi ero fissato nel non volere un'area di controllo rettangolare

    http://img577.imageshack.us/img577/3645/10567819.png

     

    o basata semplicemente sulla distanza

    http://img504.imageshack.us/img504/2299/sentinellaaf4.png

    ( chiedo perdono agli autori di queste ultime due immagini per averle qui usate senza chiedere prima consenso :* ).

     

    Volevo piuttosto cercare di ricreare un'area più realistica, similmente al cono visivo umano, nonostante sia chiaramente abbastanza distante, ma almeno ho potuto farlo come quello di Metal Gear Solid ( in forma "discreta"/"per quadrati" però, visto che non ci sono misure intermedie su RPG Maker se si vuole continuare ad utilizzare il sistema nativo di Charset e Chipset ).

    Quindi, attraverso due variabili "Ampiezza" e "Lunghezza", viene effettuato il controllo di presenza o meno dell'avversario. Quando si viene "scoperti", ampiezza e lunghezza aumentano.

    L'area di controllo basata semplicemente sulla distanza, sarebbe stata usata per delineare un campo "uditivo".

     

    Penso di aver scavato abbastanza nel triste passato ;__;

     

     

     

    Ringraziamo tutti quelli che ci hanno (in)seguito per tutto questo tempo, per la loro attenzione/interesse, per il loro feedback ( relativamente positivo o negativo che fosse ) e ci dispiace per non aver saputo/potuto attenerci alle aspettative .__.

  11. Mi sembra invece, se non ricordo male, aggiungere un def reset a Game_Actors, più o meno su questa falsariga . . .

    class Game_Actors
     def reset_actor(actor_id)
    @data[actor_id].setup(actor_id)
     end
    end

    e richiamarlo tramite call script . . .

    $game_actors.reset_actor(ID_ACTOR_DA_RESETTARE)

     

    Anche se così facendo dovrebbe tornare equipaggiato come indicato nel DataBase . . .

     

    EDIT - Per il call script avevo scritto solo reset invece di reset_actor . . .

    Più che invece, è per far prima... a quel punto, volendo, si può usare

    $game_actors[ID_ATTORE].setup(ID_ATTORE)

    senza dover creare una nuova funzione...

     

    Grazie JackX, ma non mi fa copiare i personaggi singoli, non so perchè...

     

     

    Grazie, questo metodo funziona, ma non per i personaggi creati dal database dopo il salvataggio... :(

    Se infatti lo applico a un nuovo personaggio, mi dice che il metodo "setup" non è stato trovato...

     

     

    Argh! Scusa Guardian, per punizione mi flagellerò con una frusta di chiodi!

     

    EDIT: Ho trovato l'errore, il problema è lo script del cambio gruppo... Mi sa che devo crearne uno io.

    Utilizzandolo così

    $game_actors[ID_ATTORE].class_id = $data_actors[ID_ATTORE].class_id

    mi funziona, probabilmente deve essere appunto un problema legato allo script che usi( come hai già scritto nell'EDIT ).

  12. Sono in preda a una crisi di nervi. Mi serve assolutamente come inizializzare le informazioni di un PG allo stato iniziale (da database) con gioco già bello che avviato, quindi anche dopo il caricamento dei dati. Non sto parlando di livello, parlo di tutto: classe, curva Exp, grafica, nome...

    Qualcuno ha una soluzione?

    Devi usare $data_actors.

     

    Esempio:

    #Questa è la classe che l'attore di id "ID_ATTORE" ha nel database
    print $data_actors[ID_ATTORE].class_id

     

    #Questa è la classe che l'attore di id "ID_ATTORE" ha durante il gioco ( insomma, quella che subisce effettivamente modifiche )
    print $game_actors[ID_ATTORE].class_id

     

    So che non c'era bisogno dell'esempio, ma visto che c'ero...

  13. E' una questione di tempo... gli scripter che ne hanno e che lo sanno fare lo occupano facendo script per i loro progetti( tanto per dirne una eh )...

     

     

    Mi riferirò alla demo di questo topic: http://www.rpg2s.net/forum/index.php?showtopic=5903

     

    Le pagine di codice che ho dovuto modificare sono: "HUD" e "Crissaegrim ABS"

     

    HUD:

     

     

    #==============================================================================
    # Window Hud
    #==============================================================================
    module Crissaegrim_Hud
     
    Background = "HUD-Background" # Immagine di base dell'HUD
    
    HP_Bar = "HP-Bar" # Immagine della barra HP
    MP_Bar = "MP-Bar" # Immagine della barra MP
    
    Base = "Bars-Base" # Immagine di base delle barre
    
    OnOff_Hud_Switch = 40 # Switch che attiva\disattiva l'HUD
    
    Show_Hide_Button = Input::Letters["H"] # Tasto che mostra\nasconde l'HUD
    
    end
    #------------------------------------------------------------------------------
    class Window_CrissaegrimHud < Window_Base
     def initialize
    super(0,0,544,416)
    self.opacity = 0
     end
      def update
     self.contents.font.size = 16
     self.contents.clear
    skill_count = 0
    for button in Crissaegrim_ABS::Skill_Button.keys
     next if button == nil
    #MODIFICA----------------------------------------------------------------------
     x = (Crissaegrim_ABS::Skill_Button.keys.size - 1) * 44
    #MODIFICA----------------------------------------------------------------------
     skill = $data_skills[Crissaegrim_ABS::Skill_Button[button]]
     next if skill == nil
    #MODIFICA----------------------------------------------------------------------
     show_icon(skill, x - (44 * skill_count), 356)
    #MODIFICA----------------------------------------------------------------------
     skill_count += 1
    end
    item_count = 0
    for btn in Crissaegrim_ABS::Item_Button.keys
     next if btn == nil
     item = $data_items[Crissaegrim_ABS::Item_Button[btn]]
     next if item == nil
    #MODIFICA----------------------------------------------------------------------
     x = 374
    #MODIFICA----------------------------------------------------------------------
     show_icon(item, (29 * item_count) + x, 356)
     item_count += 1
     self.contents.font.size = 18
     self.contents.font.color = text_color(15)
     self.contents.draw_text((29 * item_count) + x-32, 364, 32, 28, $game_party.item_number(item),1)
     self.contents.font.size = 16
     self.contents.font.color = text_color(0)
     self.contents.draw_text((29 * item_count) + x-32, 365, 32, 28, $game_party.item_number(item),1)
    end
    refresh
    end
    def refresh
     actor = $game_party.members[0]
     draw_hp(actor, 0, 0)
     draw_mp(actor, 0, 24)
     show_state(actor, 130, 0)
    if Crissaegrim_ABS::Distance_Weapons.has_key?($game_party.members[0].weapon_id)
    if Crissaegrim_ABS::Distance_Weapons[$game_party.members[0].weapon_id][5] > 0
     show_icon($data_items[Crissaegrim_ABS::Distance_Weapons[$game_party.members[0].weapon_id][5]], 0, 356)
     self.contents.font.size = 18
     self.contents.font.color = text_color(15)
     self.contents.draw_text(-3, 364, 24, 28, $game_party.item_number($data_items[Crissaegrim_ABS::Distance_Weapons[$game_party.members[0].weapon_id][5]]),1)
     self.contents.font.size = 16
     self.contents.font.color = text_color(0)
     self.contents.draw_text(-2, 365, 24, 28, $game_party.item_number($data_items[Crissaegrim_ABS::Distance_Weapons[$game_party.members[0].weapon_id][5]]),1)
    end
    if Crissaegrim_ABS::Distance_Weapons[$game_party.members[0].weapon_id][6] > 0
     show_icon($data_items[Crissaegrim_ABS::Distance_Weapons[$game_party.members[0].weapon_id][6]], 44, 356)
     self.contents.font.size = 18
     self.contents.font.color = text_color(15)
     self.contents.draw_text(43, 364, 24, 28, $game_party.item_number($data_items[Crissaegrim_ABS::Distance_Weapons[$game_party.members[0].weapon_id][6]]),1)
     self.contents.font.size = 16
     self.contents.font.color = text_color(0)
     self.contents.draw_text(44, 365, 24, 28, $game_party.item_number($data_items[Crissaegrim_ABS::Distance_Weapons[$game_party.members[0].weapon_id][6]]),1)
    end
    end
    end
    def show_state(actor, x, y)
     count = 0
     for state in actor.states
    draw_icon(state.icon_index, x, y + 24 * count)
    count += 1
    break if (24 * count > 76)
     end
    end
    def show_icon(item, x, y)
     if item != nil
    draw_icon(item.icon_index, x, y)
     end
    end
    def draw_hp(actor, x, y)
     back = Cache.system(Crissaegrim_Hud::Base)
     cw = back.width
     ch = back.height
     src_rect = Rect.new(0, 0, cw, ch)
     self.contents.blt(x, y-ch+24, back, src_rect)
     meter = Cache.system(Crissaegrim_Hud::HP_Bar)
     cw = meter.width  * actor.hp / actor.maxhp
     ch = meter.height
     src_rect = Rect.new(0, 0, cw, ch)
     self.contents.blt(x+5, y-ch+17, meter, src_rect)
    end  
    def draw_mp(actor, x, y)
     back = Cache.system(Crissaegrim_Hud::Base)	
     cw = back.width
     ch = back.height
     src_rect = Rect.new(0, 0, cw, ch)	
     self.contents.blt(x, y-ch+24, back, src_rect)
     meter = Cache.system(Crissaegrim_Hud::MP_Bar)	
     cw = meter.width  * actor.mp / actor.maxmp
     ch = meter.height 
     src_rect = Rect.new(0, 0, cw, ch)
     self.contents.blt(x+5, y-ch+17, meter, src_rect)
    end
    end
    #------------------------------------------------------------------------------
    class Scene_Map
     alias hud_start start
     alias hud_update update
     alias hud_terminate terminate
     def start
    super
    if Crissaegrim_Hud::Background != ""
    @bg = Sprite.new
    @bg.bitmap = Cache.system(Crissaegrim_Hud::Background)
    @bg.x = 1
    @bg.y = 1
    end
    @hud = Window_CrissaegrimHud.new
    @hud.x = 0
    @hud.y = 0
    hud_properties
    hud_start
     end
     def update
    super
    @bg.update if Crissaegrim_Hud::Background != ""
    @hud.update
    hud_properties
    hud_update
     end
     def hud_properties
    if Crissaegrim_Hud::OnOff_Hud_Switch == 0 or $game_switches[Crissaegrim_Hud::OnOff_Hud_Switch] == true
      if @hud.visible == true and Input.trigger?(Crissaegrim_Hud::Show_Hide_Button)
    	@hud.visible = false
    	@bg.visible = false if Crissaegrim_Hud::Background != ""
      elsif @hud.visible == false and Input.trigger?(Crissaegrim_Hud::Show_Hide_Button)
    	@hud.visible = true
    	@bg.visible = true if Crissaegrim_Hud::Background != ""
      end
     else
       @hud.visible = false
       @bg.visible = false if Crissaegrim_Hud::Background != ""
     end
      end
     def terminate
    super
    @bg.dispose if Crissaegrim_Hud::Background != ""
    @hud.dispose
    hud_terminate
     end
    end

     

     

    Qui ho semplicemente modificato le coordinate X e Y delle abilità(skill) e degli oggetti(item), in modo da:

    1) utilizzare le abilità come attacchi principali al posto delle armi( così da poter realizzare agevolmente Tira Pugni e Lancia Sfere );

    2) visualizzare correttamente 5 oggetti;

    3) eliminare lo slot abilità.

    Puoi vedere uno screen del risultato ( ricordati che lo sfondo dell'HUD è una semplice immagine che quindi dovrai modificare tu, ad esempio incominciando a togliere lo sfondo per le abilità e ampliando quello per gli oggetti ):

    http://ultrasonic.altervista.org/_altervista_ht/rpg2s/HUD_MOD.png

     

    Crissaegrim ABS

     

     

    #==============================================================================
    # Crissaegrim ABS tradotto in italiano
    #==============================================================================
    #------------------------------------------------------------------------------
    # Crediti:
    # Vlad: autore 
    # Ciri: traduttore
    #------------------------------------------------------------------------------
    # Per creare un nemico collocare i seguenti commenti in un evento:
    
    # Enemy ID - dove ID sta per l'ID del nemico nel database;
    # Die Erase - fa in modo che il nemico contro cui si combatte scompaia se sconfitto;
    # Die Switch Local A - Attiva la Switch locale A quando il nemico con cui si combatte viene ucciso;
    # Die Switch Local B - Attiva la Switch locale B quando il nemico con cui si combatte viene ucciso;
    # Die Switch Local C - Attiva la Switch locale C quando il nemico con cui si combatte viene ucciso;
    # Die Switch Local D - Attiva la Switch locale D quando il nemico con cui si combatte viene ucciso;
    # Die Switch X - Attiva la Switch X quando il nemico con cui si combatte viene ucciso;
    # Die Variable X - Aggiunge +1 alla variabile x quando il nemico con cui si sta combattendo muore;
    # Follow X - serve a fare si che il nemico segua automaticamente l'eroe, quando questo è a X passi di distanza da lui.
    # Kill Weapon ID - Questo ID indica l'ID di un'arma nel database;il commento serve a fare in modo che il nemico muoia solo se viene usata tale arma. 
    # Kill Skill ID - Questo ID indica l'ID di una skill nel database;il commento serve a fare in modo che il nemico muoia solo se viene usata tale skill.
    # Kill Item ID - Questo ID indica l'ID di un oggetto nel database;il commento serve a fare in modo che il nemico muoia solo se viene usato tale oggetto.
    
    #------------------------------------------------------------------------------
    # CONFIGURAZIONE GENERALE
    #------------------------------------------------------------------------------
    module Crissaegrim_ABS
    #------------------------------------------------------------------------------
    #Tasto per l'attacco con la mano destra:
    #MODIFICA----------------------------------------------------------------------
    Right_Attack_Button = ""
    #MODIFICA----------------------------------------------------------------------
    #------------------------------------------------------------------------------
    #Tasto per l'attacco con la mano sinistra, o con lo scudo:
    #MODIFICA----------------------------------------------------------------------
    Left_Attack_and_Shield_Button = ""
    #MODIFICA----------------------------------------------------------------------
    #------------------------------------------------------------------------------
    # Tasti per la memorizzazione e l'utilizzo delle abilità:
    #MODIFICA----------------------------------------------------------------------
    Skill_Button = {Input::Letters["A"] => 83, Input::Letters["S"] => 84}
    #MODIFICA----------------------------------------------------------------------
    #------------------------------------------------------------------------------
    # Tasti per la memorizzazione e l'utilizzo di oggetti:
    #MODIFICA----------------------------------------------------------------------
    Item_Button = {Input::Numberkeys[1] => 0, Input::Numberkeys[2] => 0, Input::Numberkeys[3] => 0, Input::Numberkeys[4] => 0, Input::Numberkeys[5] => 0}
    #MODIFICA----------------------------------------------------------------------
    #------------------------------------------------------------------------------
    # Arma da distanza.
    # Per creare un arma da distanza copiare: Distance_Weapons[S] = [T, U, V, W, X, Y, Z] e inserire:
    # S:ID dell' Arma, T:Chara del proiettile dell'arma, U:Indice del chara, V:Velocità, W:Distanza, X:Tempo di attasa per attacare nuovamente, Y: database ID  del primo tipo di munizioni, Z:database ID del secondo tipo di munizioni 
    Distance_Weapons = {}
    Distance_Weapons[4] = ["$Arrow", 0, 6, 5, 30, 21, 22]
    #------------------------------------------------------------------------------
    # Armi con animazioni
    # Per creare un'arma con animazione copiare: Animate_Weapons[X] = ["Y", Z] e impostare:
    # X:ID dell'arma nel database e Y per il prefisso del nome del chara che raffigura 
    #l'attacco (per esempio se il chara del protagonista si chiama "Actor3", il chara 
    #del protagonista che attacca si dovrà chiamare "Actor3_preffisso", quel prefisso dovrete 
    #inserirlo al posto della Y), e Z per l'idice del Chara
    Animate_Weapons = {}
    Animate_Weapons[2] = ["_attescudo", 1]
    Animate_Weapons[4] = ["_attescudo", 0]
    #------------------------------------------------------------------------------
    # Armi con suono
    # Per creare un'arma con suono copiare: Weapon_Shot_SE[X] = "Y" e impostare:
    # X per l'ID dell'arma nel database, e Y per il nome del suono contenuto nella cartella SE
    Weapon_Shot_SE = {}
    Weapon_Shot_SE[4] = "Blow7"
    #------------------------------------------------------------------------------
    # Abilità a distanza
    # Per creare una skill utilizzabile a distanza copiare: Distance_Skills[U] = [V, W, X, Y, Z] e impostare:
    # U:ID della skill, V:Chara della skill, W:Indice del Chara, X:Velocità, Y:Distanza, Z:Tempo da aspettare prima di compiere un nuovo attacco.
    Distance_Skills = {}
    #MODIFICA----------------------------------------------------------------------
    Distance_Skills[83] = ["Energy Ball", 3, 10, 1, 15]
    Distance_Skills[84] = ["Energy Ball", 7, 4, 6, 60]
    #MODIFICA----------------------------------------------------------------------
    Distance_Skills[59] = ["$FireBall", 0, 4, 5, 60]
    Distance_Skills[63] = ["Energy Ball", 7, 4, 5, 60]
    Distance_Skills[67] = ["Energy Ball", 3, 4, 5, 60]
    Distance_Skills[71] = ["Energy Ball", 2, 4, 5, 60]
    Distance_Skills[73] = ["Energy Ball", 1, 4, 5, 60]
    Distance_Skills[75] = ["Energy Ball", 4, 4, 5, 60]
    Distance_Skills[77] = ["Energy Ball", 3, 4, 5, 60]
    Distance_Skills[79] = ["Energy Ball", 5, 4, 5, 60]
    #------------------------------------------------------------------------------
    # Abilità con animazioni
    # Per creare un'abiltà con animazione copiare: Animate_Skills[X] = ["Y", Z] e impostare:
    # X:ID della skill nel database e Y per il prefisso del nome del chara che raffigura 
    #l'eroe che utilizza l'abilità (per esempio se il chara del protagonista si chiama "Actor3", il chara 
    #del protagonista che usa la skill si dovrà chiamare "Actor3_preffisso", quel prefisso dovrete 
    #inserirlo al posto della Y), e Z per l'idice del Chara
    #MODIFICA----------------------------------------------------------------------
    #la nuova struttura è Animate_Skills[X] = ["Y", Z, W], dove X, "Y", Z sono rimasti invariati
    #rispetto alla struttura precedente, mentre W è il tempo dell'animazione dell'abilità
    #se W viene posto uguale a 0, la durata dell'animazione sarà pari alla durata dell'abilità
    #MODIFICA----------------------------------------------------------------------
    Animate_Skills = {}
    #MODIFICA----------------------------------------------------------------------
    Animate_Skills[83] = ["_attescudo", 1, 0]
    Animate_Skills[84] = ["_attescudo", 2, 15]
    #MODIFICA----------------------------------------------------------------------
    #------------------------------------------------------------------------------
    # Oggetti utilizabili a distanza
    # Per creare un oggetto utilizzabile a distanza copiare: Distance_Items[U] = [V, W, X, Y, Z] e impostare:
    # U:ID dell'oggetto, V:Chara dell'oggetto, W:Indice del Chara, X:Velocità, Y:Distanza, Z:Tempo da aspettare prima di compiere un altro attacco.
    Distance_Items = {}
    Distance_Items[16] = ["Energy Ball", 0, 5, 5, 30]
    Distance_Items[18] = ["Energy Ball", 7, 5, 5, 30]
    Distance_Items[20] = ["Energy Ball", 3, 5, 5, 30]
    #------------------------------------------------------------------------------
    #  Oggeti con animazioni
    # Per creare un oggetto con animazione copiare: Animate_Items[X] = ["Y", Z] e impostare:
    # X:ID dell'oggetto nel database e Y per il prefisso del nome del chara che raffigura 
    #l'eroe che usa l'oggetto (per esempio se il chara del protagonista si chiama "Actor3", il chara 
    #del protagonista che usa l'oggetto si dovrà chiamare "Actor3_preffisso", quel prefisso dovrete 
    #inserirlo al posto della Y), e Z per l'idice del Chara
    Animate_Items = {}
    Animate_Items[0] = ["_UsingItem", 0]
    #------------------------------------------------------------------------------
    #  Animazio per l'utilizzo di uno scudo
    # Per creare l'animazione dell'eroe che usa uno scudo copiare: Animate_Shields[X] = ["Y", Z] e impostare:
    # X:ID dello scudo nel database e Y per il prefisso del nome del chara che raffigura 
    #l'eroe che usa lo scudo (per esempio se il chara del protagonista si chiama "Actor3", il chara 
    #del protagonista che usa lo scudo si dovrà chiamare "Actor3_preffisso", quel prefisso dovrete 
    #inserirlo al posto della Y), e Z per l'idice del Chara
    Shields = {}
    Shields[1] = ["_attescudo", 0]
    #------------------------------------------------------------------------------
    # Oggetti, armi e armature perse dai nemici
    # Per creare il grafico di un oggetto, arma o armatura che viene perso da un nemico sconfitto copiare: Items_Drop[X] = ["Y",Z] e impostare:
    # X per l'ID dell'oggetto, arma o armatura nel database, Y per il chara dell'oggetto, arma o armatura e Z per l'idice del chara
    Items_Drop = {}
    Items_Drop[1] = ["Potions",0]
    Items_Drop[2] = ["Potions",0]
    Items_Drop[4] = ["Potions",1]
    
    Weapons_Drop = {}
    Weapons_Drop[0] = ["",0]
    
    Armors_Drop = {}
    Armors_Drop[0] = ["",0]
    #------------------------------------------------------------------------------
    Drop_Duration_Time = 450 # Tempo per cui l'oggetto rimane a terra prima di scomparire
    Drop_Item_SE = "DropItem" # Suono per l'oggetto che cade
    Drop_Money_SE = "DropMoney" # Suono per il denaro che cade
    Get_Reward_SE = "GetReward" # Suono udibile quando si raccoglie il denaro o un oggetto, arma o armatura
    
    Gold_Drop = ["$Gold",0] # Chara del denaro quando cade
    Default_Items_Drop = ["$Box",0] # Chara standard di un oggetto che cade
    Default_Weapons_Drop = ["$Box",0] # Chara standard di un'arma che cade
    Default_Armors_Drop = ["$Box",0] # Chara standard di un'armatura che cade
    #------------------------------------------------------------------------------
    # Animazione quando l'eroe passa di livello .
    # Il numero dopo LevelUp_animation indica l'ID nel database dell'animazione da visualizzare quando l'ero sale di livello.
    LevelUp_Animation = 40
    #------------------------------------------------------------------------------
    # Animazioni dei nemici
    # Copiare  Enemy_animations[X] = [Y, Z] e impostare:
    # X per l'ID del nemico, Y per l'ID dell'animazione d'attacco del nemico, e Z per l'ID dell'animazione da visualizzare alla morte del nemico.
    Enemy_animations = {}
    Enemy_animations[1] = [0,56]
    Enemy_animations[2] = [13,56]
    Enemy_animations[3] = [19,56]
    Enemy_animations[4] = [0,56]
    Enemy_animations[32] = [13,82]
    #------------------------------------------------------------------------------
    end
    #==============================================================================
    
    #------------------------------------------------------------------------------
    # Game Character
    #------------------------------------------------------------------------------
    class Game_Character
     alias crissaegrim_abs_gchar_initialize initialize
     alias crissaegrim_abs_gchar_update update
     attr_accessor :damage
     attr_accessor :critical
     def initialize
    crissaegrim_abs_gchar_initialize
    @damage = nil
    @critical = false
     end
     def update
    crissaegrim_abs_gchar_update
    $scene = Scene_Gameover.new if $game_party.members[0].dead?
     end
     def move_toward(object)
    sx = distance_x_from(object)
    sy = distance_y_from(object)
    if sx != 0 or sy != 0
      if sx.abs > sy.abs
    	sx > 0 ? move_left : move_right
    	if @move_failed and sy != 0
    	  sy > 0 ? move_up : move_down
    	end
      else
    	sy > 0 ? move_up : move_down 
    	if @move_failed and sx != 0
    	  sx > 0 ? move_left : move_right
    	end
      end
    end
     end
     def distance_x_from(object)
    sx = @x - object.x
    if $game_map.loop_horizontal?
      if sx.abs > $game_map.width / 2
    	sx -= $game_map.width
      end
    end
    return sx
     end
     def distance_y_from(object)
    sy = @y - object.y
    if $game_map.loop_vertical?
      if sy.abs > $game_map.height / 2
    	sy -= $game_map.height
      end
    end
    return sy
     end
     def in_range?(element, object, range)
    x = (element.x - object.x) * (element.x - object.x)
    y = (element.y - object.y) * (element.y - object.y)
    r = x + y
    return true if r <= (range * range)
    return false
     end
     def in_direction?(element, object)
    return true if element.direction == 2 and object.y >= element.y and object.x == element.x
    return true if element.direction == 4 and object.x <= element.x and object.y == element.y
    return true if element.direction == 6 and object.x >= element.x and object.y == element.y
    return true if element.direction == 8 and object.y <= element.y and object.x == element.x
    return false
     end 
    end
    
    #------------------------------------------------------------------------------
    # Game Event
    #------------------------------------------------------------------------------
    class Game_Event < Game_Character
     attr_reader :in_battle
     attr_reader :enemy_called
     attr_reader :kill_weapon
     attr_reader :kill_skill
     attr_reader :kill_item
     attr_accessor :life
     attr_accessor :mana
     attr_accessor :skill_id
     attr_accessor :deffending
     alias crissaegrim_abs_gevent_initialize initialize
     alias crissaegrim_abs_gevent_update update
     alias crissaegrim_abs_gevent_refresh refresh
     def initialize(map_id, event)
    @enemy_id = 0
    @life = 0
    @mana = 0
    @attack_time = 0
    @in_battle = false
    @deffending = false
    crissaegrim_abs_gevent_initialize(map_id, event)
     end
     def update
    if @in_battle and @life > 0
      make_attack($data_enemies[@enemy_id])
    elsif @in_battle and @life <= 0
      kill_enemy
    end
    @attack_time -= 1 if @attack_time > 0
    crissaegrim_abs_gevent_update
     end
     def refresh
    crissaegrim_abs_gevent_refresh
    @in_battle = false
    @enemy_id = check_comment("Enemy")
    @follow_distance = check_comment("Follow")
    @erase = check_com("Die Erase")
    @switch_local_a = check_com("Die Switch Local A")
    @switch_local_b = check_com("Die Switch Local B")
    @switch_local_c = check_com("Die Switch Local C")
    @switch_local_d = check_com("Die Switch Local D")
    @switch = check_comment("Die Switch")
    @variable = check_comment("Die Variable")
    @kill_weapon = check_comment("Kill Weapon")
    @kill_skill = check_comment("Kill Skill")
    @kill_item = check_comment("Kill Item")
    if @enemy_id > 0
      @in_battle = true
      @enemy_called = GameABS_Enemy.new(@enemy_id)
      @life = @enemy_called.maxhp if @life <= 0
      @mana = @enemy_called.maxmp if @mana <= 0
    end
     end
     def make_attack(enemy)
    return false if $game_map.interpreter.running?
     for action in enemy.actions
       @ranting = action.rating if @attack_time <= 0
       next if enemy_pre_attack(@enemy_called, action)
       case action.kind
       when 0
    	 case action.basic
    	 when 0
    	   attack_normal
    	 when 1
    	   @deffending = true
    	 end
       when 1
    	 @skill_id = action.skill_id
    	 next if $data_skills[action.skill_id] == nil
    	 case $data_skills[action.skill_id].scope
    	 when 1..6
    	   if Crissaegrim_ABS::Distance_Skills.has_key?(action.skill_id)
    		 see_range = Crissaegrim_ABS::Distance_Skills[action.skill_id][3]
    		 if @direction == 2 and $game_player.x == @x and $game_player.y <= (@y + see_range) and $game_player.y > @y
    		   skill_range
    		 elsif @direction == 4 and $game_player.x >= (@x - see_range) and $game_player.x < @x and $game_player.y == @y
    		   skill_range
    		 elsif @direction == 6 and $game_player.x <= (@x + see_range) and $game_player.x > @x and $game_player.y == @y
    		   skill_range
    		 elsif @direction == 8 and $game_player.x == @x and $game_player.y >= (@y - see_range) and $game_player.y < @y
    		   skill_range
    		 elsif action.rating == 10
    		   skill_range
    		 end
    	   else
    		 skill_normal
    	   end
    		when 7..11
    		  skill_recover
    		end
    	  end
    	end
      end
      def enemy_pre_attack(enemy, action)
       case action.condition_type
       when 1
    	 n = $game_troop.turn_count
    	 a = action.condition_param1
    	 b = action.condition_param2
    	 return false if (b == 0 and n != a)
    	 return false if (b > 0 and (n < 1 or n < a or n % b != a % b))
       when 2
    	 hp_rate = enemy.hp * 100.0 / enemy.maxhp
    	 return false if hp_rate < action.condition_param1
    	 return false if hp_rate > action.condition_param2
       when 3
    	 mp_rate = enemy.mp * 100.0 / enemy.maxmp
    	 return false if mp_rate < action.condition_param1
    	 return false if mp_rate > action.condition_param2
       when 4
    	 return false unless state?(action.condition_param1)
       when 5
    	 return false if $game_party.max_level < action.condition_param1
       when 6
    	 switch_id = action.condition_param1
    	 return false if $game_switches[switch_id] == false
       end
       r = rand(11)
       return true if action.rating < r
       return false
     end
     def attack_normal
       new_x = (@x + (@direction == 4 ? -1 : @direction == 6 ? 1 : 0))
       new_y = (@y + (@direction == 8 ? -1 : @direction == 2 ? 1 : 0))
       guard_x = (@x + ($game_player.direction == 4 ? 1 : $game_player.direction == 6 ? -1 : 0))
       guard_y = (@y + ($game_player.direction == 8 ? 1 : $game_player.direction == 2 ? -1 : 0))
       if $game_player.x == new_x and $game_player.y == new_y and @attack_time <= 0
    	 dmg = $game_party.members[0].make_attack_damage_value(@enemy_called)
    	 if Crissaegrim_ABS::Enemy_animations[@enemy_id] != nil and Crissaegrim_ABS::Enemy_animations[@enemy_id][0] != 0
    	   $game_player.animation_id = Crissaegrim_ABS::Enemy_animations[@enemy_id][0]
    	 else
    	   $game_player.animation_id = 1
    	 end
    	 if $game_player.deffending == true and $game_player.x == guard_x and $game_player.y == guard_y
    	   $game_player.damage = "Guard"
    	 else
    	   $game_party.members[0].attack_effect(@enemy_called)
    	   $game_player.damage = dmg
    	   $game_player.jump(0,0)
    	 end
    	 @attack_time = 60 - (($data_enemies[@enemy_id].agi / @ranting * 10) / 100)
       end
     end
     def skill_normal 
       new_x = (@x + (@direction == 4 ? -1 : @direction == 6 ? 1 : 0))
       new_y = (@y + (@direction == 8 ? -1 : @direction == 2 ? 1 : 0))
       guard_x = (@x + ($game_player.direction == 4 ? 1 : $game_player.direction == 6 ? -1 : 0))
       guard_y = (@y + ($game_player.direction == 8 ? 1 : $game_player.direction == 2 ? -1 : 0))
       if @mana >= $data_skills[@skill_id].mp_cost and $game_player.x == new_x and $game_player.y == new_y and @attack_time <= 0
    	 @mana -= $data_skills[@skill_id].mp_cost
    	 $game_temp.common_event_id = $data_skills[@skill_id].common_event_id if $data_skills[@skill_id].common_event_id > 0
    	 dmg = $game_party.members[0].make_obj_damage_value(@enemy_called, $data_skills[@skill_id])
    	 $game_player.animation_id = $data_skills[@skill_id].animation_id
    	 if $game_player.deffending == true and $game_player.x == guard_x and $game_player.y == guard_y and !$data_skills[@skill_id].ignore_defense
    	   $game_player.damage = "Guard"
    	 else
    	   $game_party.members[0].skill_effect(@enemy_called, $data_skills[@skill_id])
    	   $game_player.damage = dmg
    	   $game_player.jump(0,0)
    	 end
    	 @attack_time = 60 - (($data_enemies[@enemy_id].agi / @ranting * 10) / 100)
       end
     end
     def skill_range
       if @mana >= $data_skills[@skill_id].mp_cost and @attack_time <= 0
    	 @mana -= $data_skills[@skill_id].mp_cost
    	 $game_temp.common_event_id = $data_skills[@skill_id].common_event_id if $data_skills[@skill_id].common_event_id > 0
    	 $game_range.push(Game_Range.new(self,Crissaegrim_ABS::Distance_Skills[@skill_id][0],Crissaegrim_ABS::Distance_Skills[@skill_id][1],Crissaegrim_ABS::Distance_Skills[@skill_id][2],Crissaegrim_ABS::Distance_Skills[@skill_id][3]))
    	 @attack_time = Crissaegrim_ABS::Distance_Skills[@skill_id][4]
       end
     end
     def skill_recover
       hp_percent = (@enemy_called.maxhp * 25) / 100
       if @mana >= $data_skills[@skill_id].mp_cost and @life <= hp_percent
    	 @mana -= $data_skills[@skill_id].mp_cost
    	 $game_temp.common_event_id = $data_skills[@skill_id].common_event_id if $data_skills[@skill_id].common_event_id > 0
    	 rec = @enemy_called.make_obj_damage_value(@enemy_called, $data_skills[@skill_id])
    	 @enemy_called.skill_effect(@enemy_called, $data_skills[@skill_id])
    	 @life -= rec
    	 @life = @enemy_called.maxhp if @life > @enemy_called.maxhp
    	 self.damage = rec
    	 @animation_id = $data_skills[@skill_id].animation_id
       end
       @attack_time = 60 - (($data_enemies[@enemy_id].agi / @ranting * 10) / 100)
     end
     def update_self_movement
       if in_range?(self,$game_player,@follow_distance)
    	 return unless movable?
    	 move_toward_player
       elsif @stop_count > 30 * (5 - @move_frequency)
    	 case @move_type
    	 when 1;  move_type_random
    	 when 2;  move_type_toward_player
    	 when 3;  move_type_custom
    	 end
       end
     end
     def movable?
       return false if moving?
       return false if @move_route_forcing
       return true
     end
     def check_comment(comentario)
       com = comentario.downcase
       return 0 if @list.nil? or @list.size <= 0 
       for item in @list
    	 if item.code == 108 or item.code == 408
    	   if item.parameters[0].downcase =~ /#{com}[ ]?(\d+)?/
    		 return $1.to_i
    	   end
    	 end
       end
       return 0
     end
     def check_com(comentario)
       return false if @list.nil? or @list.size <= 0 
       for item in @list
    	 if item.code == 108 or item.code == 408
    	   if item.parameters[0].downcase.include?(comentario.downcase)
    		 return true
    		 end
    	   end
    	 end
       end
    def kill_enemy
     $game_party.members[0].gain_exp(@enemy_called.exp, 1)
     make_drop
     if Crissaegrim_ABS::Enemy_animations[@enemy_id] != nil and Crissaegrim_ABS::Enemy_animations[@enemy_id][1] != 0
    @animation_id = Crissaegrim_ABS::Enemy_animations[@enemy_id][1]
     end
     if @erase == true
    self.erase
     elsif @switch_local_a == true
    key = [$game_map.map_id, self.id, "A"]
     if $game_self_switches[key] == false
    $game_self_switches[key] = true
    elsif $game_self_switches[key] == true
      $game_self_switches[key] = false
    end
     elsif @switch_local_b == true
    key = [$game_map.map_id, self.id, "B"]
    if $game_self_switches[key] == false
      $game_self_switches[key] = true
    elsif $game_self_switches[key] == true
      $game_self_switches[key] = false
    end
     elsif @switch_local_c == true
    key = [$game_map.map_id, self.id, "C"]
    if $game_self_switches[key] == false
      $game_self_switches[key] = true
    elsif $game_self_switches[key] == true
      $game_self_switches[key] = false
    end
     elsif @switch_local_d == true
    key = [$game_map.map_id, self.id, "D"]
    if $game_self_switches[key] == false
      $game_self_switches[key] = true
    elsif $game_self_switches[key] == true
      $game_self_switches[key] = false
    end
     elsif @switch > 0 and
    if $game_switches[@switch] == false
      $game_switches[@switch] = true
    elsif $game_switches[@switch] == true
      $game_switches[@switch] = false
    end
     elsif @variable > 0
    $game_variables[@variable] += 1
     end
     $game_map.need_refresh = true
     refresh
    end
    def make_drop
     for item in make_items1
    next if item == nil
    case item
    when RPG::Item
      graphic = Crissaegrim_ABS::Default_Items_Drop[0]
      index = Crissaegrim_ABS::Default_Items_Drop[1]
      graphic = Crissaegrim_ABS::Items_Drop[item.id][0] if Crissaegrim_ABS::Items_Drop[item.id] != nil
      index = Crissaegrim_ABS::Items_Drop[item.id][1] if Crissaegrim_ABS::Items_Drop[item.id] != nil
      $game_drop.push(Game_Drop.new(self,graphic,index,[item],0))
    when RPG::Weapon
      graphic = Crissaegrim_ABS::Default_Weapons_Drop[0]
      index = Crissaegrim_ABS::Default_Weapons_Drop[1]
      graphic = Crissaegrim_ABS::Weapons_Drop[item.id][0] if Crissaegrim_ABS::Weapons_Drop[item.id] != nil
      index = Crissaegrim_ABS::Weapons_Drop[item.id][1] if Crissaegrim_ABS::Weapons_Drop[item.id] != nil
      $game_drop.push(Game_Drop.new(self,graphic,index,[item],0))
    when RPG::Armor
      graphic = Crissaegrim_ABS::Default_Armors_Drop[0]
      index = Crissaegrim_ABS::Default_Armors_Drop[1]
      graphic = Crissaegrim_ABS::Armors_Drop[item.id][0] if Crissaegrim_ABS::Armors_Drop[item.id] != nil
      index = Crissaegrim_ABS::Armors_Drop[item.id][1] if Crissaegrim_ABS::Armors_Drop[item.id] != nil
      $game_drop.push(Game_Drop.new(self,graphic,index,[item],0))
    end
     end
     for item in make_items2
      next if item == nil
      case item
    when RPG::Item
      graphic = Crissaegrim_ABS::Default_Items_Drop[0]
      index = Crissaegrim_ABS::Default_Items_Drop[1]
      graphic = Crissaegrim_ABS::Items_Drop[item.id][0] if Crissaegrim_ABS::Items_Drop[item.id] != nil
      index = Crissaegrim_ABS::Items_Drop[item.id][1] if Crissaegrim_ABS::Items_Drop[item.id] != nil
      $game_drop.push(Game_Drop.new(self,graphic,index,[item],0))
    when RPG::Weapon
      graphic = Crissaegrim_ABS::Default_Weapons_Drop[0]
      index = Crissaegrim_ABS::Default_Weapons_Drop[1]
      graphic = Crissaegrim_ABS::Weapons_Drop[item.id][0] if Crissaegrim_ABS::Weapons_Drop[item.id] != nil
      index = Crissaegrim_ABS::Weapons_Drop[item.id][1] if Crissaegrim_ABS::Weapons_Drop[item.id] != nil
      $game_drop.push(Game_Drop.new(self,graphic,index,[item],0))
    when RPG::Armor
      graphic = Crissaegrim_ABS::Default_Armors_Drop[0]
      index = Crissaegrim_ABS::Default_Armors_Drop[1]
      graphic = Crissaegrim_ABS::Armors_Drop[item.id][0] if Crissaegrim_ABS::Armors_Drop[item.id] != nil
      index = Crissaegrim_ABS::Armors_Drop[item.id][1] if Crissaegrim_ABS::Armors_Drop[item.id] != nil
      $game_drop.push(Game_Drop.new(self,graphic,index,[item],0))
    end
     end
     if @enemy_called.gold > 0
    $game_drop.push(Game_Drop.new(self,Crissaegrim_ABS::Gold_Drop[0],0,[],self.enemy_called.gold))
     end
    end
    def make_items1
     drop_items = []
     for di in [@enemy_called.drop_item1]
    next if di.kind == 0
    next if rand(di.denominator) != 0
    if di.kind == 1
      drop_items.push($data_items[di.item_id])
    elsif di.kind == 2
      drop_items.push($data_weapons[di.weapon_id])
    elsif di.kind == 3
      drop_items.push($data_armors[di.armor_id])
    end
     end
     return drop_items
    end
    def make_items2
     drop_items = []
     for di in [@enemy_called.drop_item2]
    next if di.kind == 0
    next if rand(di.denominator) != 0
    if di.kind == 1
      drop_items.push($data_items[di.item_id])
    elsif di.kind == 2
      drop_items.push($data_weapons[di.weapon_id])
    elsif di.kind == 3
      drop_items.push($data_armors[di.armor_id])
    end
     end
     return drop_items
    end
    end
    
    #------------------------------------------------------------------------------
    # Game Player
    #------------------------------------------------------------------------------
    class Game_Player < Game_Character
     attr_accessor :deffending
     attr_accessor :assigned_skill
     attr_accessor :assigned_item
     attr_accessor :right_attack
     attr_accessor :left_attack
     attr_accessor :skill_attack
     attr_accessor :item_attack
     alias crissaegrim_abs_gplayer_initialize initialize
     alias crissaegrim_abs_gplayer_update update
     alias crissaegrim_abs_gplayer_perform_transfer perform_transfer
     def initialize
    @old_character_name = @character_name
    @old_character_index = @character_index
    @right_attack_time = 0
    @left_attack_time = 0
    @skill_attack_time = 0
    @item_attack_time = 0
    @anime_attack_time = 0
    @right_attack = false
    @left_attack = false
    @skill_attack = false
    @item_attack = false
    @deffending = false
    crissaegrim_abs_gplayer_initialize
     end
     def update
    crissaegrim_abs_gplayer_update
    @actor = $game_party.members[0]
    $scene = Scene_Gameover.new if @actor.hp <= 0
    @right_attack_time -= 1 if @right_attack_time > 0
    @left_attack_time -= 1 if @left_attack_time > 0
    @skill_attack_time -= 1 if @skill_attack_time > 0
    @item_attack_time -= 1 if @item_attack_time > 0
    @anime_attack_time -= 1 if @anime_attack_time > 0
    if @anime_attack_time <= 0 and @deffending == false
      self.set_graphic($game_actors[$game_party.members[0].id].character_name, $game_actors[$game_party.members[0].id].character_index)
      @step_anime = false
    end
    if Input.trigger?(Crissaegrim_ABS::Right_Attack_Button) and @deffending == false
      @attack_weapon = @actor.weapon_id
      anime_hero_attack if @anime_attack_time <= 0
      if Crissaegrim_ABS::Distance_Weapons.has_key?(@attack_weapon) and @right_attack_time <= 0
    	@right_attack = true
    	@left_attack = false
    	@skill_attack = false
    	@item_attack = false
    	@deffending = false
    	range_attack_right
    	if $game_party.has_item?($data_items[Crissaegrim_ABS::Distance_Weapons[@attack_weapon][5]])
    	  Audio.se_play("Audio/SE/"+Crissaegrim_ABS::Weapon_Shot_SE[@attack_weapon],100,100) if Crissaegrim_ABS::Weapon_Shot_SE[@attack_weapon] != nil or Crissaegrim_ABS::Weapon_Shot_SE[@attack_weapon] != ""
    	else
    	  Sound.play_buzzer
    	end
      else
    	normal_attack_right
      end
    end
    if Input.pressed?(Crissaegrim_ABS::Left_Attack_and_Shield_Button)
      if !@actor.two_swords_style or !@actor.two_hands_legal? and @actor.armor1_id != 0
    	use_shield
    	@deffending = true
      end
    else
      @deffending = false
    end
    if Input.trigger?(Crissaegrim_ABS::Left_Attack_and_Shield_Button) and @deffending == false
      anime_hero_attack
      if @actor.two_swords_style
    	@attack_weapon_and_Shield = @actor.armor1_id
      else
    	@attack_weapon_and_Shield = @actor.weapon_id
      end
      if Crissaegrim_ABS::Distance_Weapons.has_key?(@attack_weapon_and_Shield) and @left_attack_time <= 0
    	@right_attack = false
    	@left_attack = true
    	@skill_attack = false
    	@item_attack = false
    	range_attack_left
    	if $game_party.has_item?($data_items[Crissaegrim_ABS::Distance_Weapons[@attack_weapon_and_Shield][5]])
    	  Audio.se_play("Audio/SE/"+Crissaegrim_ABS::Weapon_Shot_SE[@attack_weapon_and_Shield],100,100) if Crissaegrim_ABS::Weapon_Shot_SE[@attack_weapon_and_Shield] != nil or Crissaegrim_ABS::Weapon_Shot_SE[@attack_weapon_and_Shield] != ""
    	else
    	  Sound.play_buzzer
    	end
      else
    	normal_attack_left
      end
    end
    for button in Crissaegrim_ABS::Skill_Button.keys
    if Input.trigger?(button) and Crissaegrim_ABS::Skill_Button[button] != nil and Crissaegrim_ABS::Skill_Button[button] != 0
      @assigned_skill = Crissaegrim_ABS::Skill_Button[button]
      case $data_skills[@assigned_skill].scope
      when 1
    	if Crissaegrim_ABS::Distance_Skills.has_key?(@assigned_skill)
    	  @right_attack = false
    	  @left_attack = false
    	  @skill_attack = true
    	  @item_attack = false
    	  skill_attack_range
    #MODIFICA----------------------------------------------------------------------	  
    	  if Crissaegrim_ABS::Animate_Skills.has_key?(@assigned_skill) and ( (Crissaegrim_ABS::Animate_Skills[@assigned_skill][2] == 0 and @skill_attack_time > 0) or (Crissaegrim_ABS::Animate_Skills[@assigned_skill][2] > 0 and @skill_attack_time == Crissaegrim_ABS::Distance_Skills[@assigned_skill][4]) )
    		anime_hero_skill if @anime_attack_time <= 0
    	  end
    #MODIFICA----------------------------------------------------------------------
    	  else
    	  skill_attack_normal
    	end
      when 2
    	skill_attack_all
      when 7..11
    	skill_recover
      end
    end
     end
     for button in Crissaegrim_ABS::Item_Button.keys
    if Input.trigger?(button) and Crissaegrim_ABS::Item_Button[button] != nil and Crissaegrim_ABS::Item_Button[button] != 0
      @assigned_item = Crissaegrim_ABS::Item_Button[button]
      if Crissaegrim_ABS::Distance_Items.has_key?(@assigned_item)
    	@right_attack = false
    	@left_attack = false
    	@skill_attack = false
    	@item_attack = true
    	item_attack_range
      else
    	case $data_items[@assigned_item].scope
    	when 1..6
    	  item_normal_attack
    	when 7..11
    	  item_recover
    	end
      end
    end
     end
    end
    def normal_attack_right
     if Input.trigger?(Crissaegrim_ABS::Right_Attack_Button)
    @attack_weapon = @actor.weapon_id
    for event in $game_map.events.values
      if event.in_battle
    	new_x = (@x + (@direction == 4 ? -1 : @direction == 6 ? 1 : 0))
    	new_y = (@y + (@direction == 8 ? -1 : @direction == 2 ? 1 : 0))
    	guard_x = (@x + (event.direction == 4 ? 1 : event.direction == 6 ? -1 : 0))
    	guard_y = (@y + (event.direction == 8 ? 1 : event.direction == 2 ? -1 : 0))
    	if event.x == new_x and event.y == new_y and @right_attack_time <= 0
    	  dmg = event.enemy_called.make_attack_damage_value(@actor)
    	  event.animation_id = @actor.atk_animation_id
    	  if event.deffending == true and event.x == guard_x and event.y == guard_y or event.kill_weapon > 0 and @attack_weapon != event.kill_weapon or event.kill_skill > 0 or event.kill_item > 0
    		event.damage = "guard"
    	  else
    		event.enemy_called.attack_effect(@actor)
    		event.life -= dmg
    		event.damage = dmg
    		event.jump(0,0)
    	  end
    	  @right_attack_time = 60 - (@actor.agi / 100)
    	end
      end
    end
     end
    end
    def range_attack_right
     if $game_party.has_item?($data_items[Crissaegrim_ABS::Distance_Weapons[@attack_weapon][5]])
    $game_party.consume_item($data_items[Crissaegrim_ABS::Distance_Weapons[@attack_weapon][5]])
    $game_range.push(Game_Range.new(self,Crissaegrim_ABS::Distance_Weapons[@attack_weapon][0],Crissaegrim_ABS::Distance_Weapons[@attack_weapon][1],Crissaegrim_ABS::Distance_Weapons[@attack_weapon][2],Crissaegrim_ABS::Distance_Weapons[@attack_weapon][3]))
    @right_attack_time = Crissaegrim_ABS::Distance_Weapons[@attack_weapon][4]
     end
    end
    def normal_attack_left
     for event in $game_map.events.values
    if event.in_battle
       new_x = (@x + (@direction == 4 ? -1 : @direction == 6 ? 1 : 0))
       new_y = (@y + (@direction == 8 ? -1 : @direction == 2 ? 1 : 0))
       guard_x = (@x + (event.direction == 4 ? 1 : event.direction == 6 ? -1 : 0))
       guard_y = (@y + (event.direction == 8 ? 1 : event.direction == 2 ? -1 : 0))
      if event.x == new_x and event.y == new_y and @left_attack_time <= 0
    	dmg = event.enemy_called.make_attack_damage_value(@actor)
    	event.animation_id = @actor.atk_animation_id2
    	if event.deffending == true and event.x == guard_x and event.y == guard_y or event.kill_weapon > 0 and @attack_weapon_and_Shield != event.kill_weapon or event.kill_skill > 0 or event.kill_item > 0
    	  event.damage = "guard"
    	else
    	  event.enemy_called.attack_effect(@actor)
    	  event.life -= dmg
    	  event.damage = dmg
    	  event.jump(0,0)
    	end
    	@left_attack_time = 60 - (@actor.agi / 100)
      end
    end
     end
    end
    def range_attack_left
     if $game_party.has_item?($data_items[Crissaegrim_ABS::Distance_Weapons[@attack_weapon_and_Shield][6]])
    $game_party.consume_item($data_items[Crissaegrim_ABS::Distance_Weapons[@attack_weapon_and_Shield][6]])
    $game_range.push(Game_Range.new(self,Crissaegrim_ABS::Distance_Weapons[@attack_weapon_and_Shield][0],Crissaegrim_ABS::Distance_Weapons[@attack_weapon_and_Shield][1],Crissaegrim_ABS::Distance_Weapons[@attack_weapon_and_Shield][2],Crissaegrim_ABS::Distance_Weapons[@attack_weapon_and_Shield][3]))
    @left_attack_time = Crissaegrim_ABS::Distance_Weapons[@attack_weapon_and_Shield][4]
     end
    end
    def skill_attack_normal
     for event in $game_map.events.values
    if event.in_battle
      new_x = (@x + (@direction == 4 ? -1 : @direction == 6 ? 1 : 0))
      new_y = (@y + (@direction == 8 ? -1 : @direction == 2 ? 1 : 0))
      guard_x = (@x + (event.direction == 4 ? 1 : event.direction == 6 ? -1 : 0))
      guard_y = (@y + (event.direction == 8 ? 1 : event.direction == 2 ? -1 : 0))
      if event.x == new_x and event.y == new_y and @skill_attack_time <= 0
    	if @actor.mp >= $data_skills[@assigned_skill].mp_cost and @skill_attack_time <= 0
    	  @actor.mp -= @actor.calc_mp_cost($data_skills[@assigned_skill])
    	  $game_temp.common_event_id = $data_skills[@assigned_skill].common_event_id if $data_skills[@assigned_skill].common_event_id > 0
    	  dmg = event.enemy_called.make_obj_damage_value(@actor, $data_skills[@assigned_skill])
    	  event.animation_id = $data_skills[@assigned_skill].animation_id
    	  if event.deffending == true and event.x == guard_x and event.y == guard_y or event.kill_weapon > 0 or event.kill_skill > 0 or event.kill_item > 0 and !$data_skills[@assigned_skill].ignore_defense
    		event.damage = "guard"
    	  else
    		event.enemy_called.skill_effect(@actor, $data_skills[@assigned_skill])
    		event.life -= dmg
    		event.damage = dmg
    		event.jump(0,0)
    	  end
    	  @skill_attack_time = 60 - (@actor.agi / 100)
    	end
      end
    end
     end
    end
    def skill_attack_range
     if @actor.mp >= $data_skills[@assigned_skill].mp_cost and @skill_attack_time <= 0
    @actor.mp -= @actor.calc_mp_cost($data_skills[@assigned_skill])
    $game_temp.common_event_id = $data_skills[@assigned_skill].common_event_id if $data_skills[@assigned_skill].common_event_id > 0
    $game_range.push(Game_Range.new(self,Crissaegrim_ABS::Distance_Skills[@assigned_skill][0],Crissaegrim_ABS::Distance_Skills[@assigned_skill][1],Crissaegrim_ABS::Distance_Skills[@assigned_skill][2],Crissaegrim_ABS::Distance_Skills[@assigned_skill][3]))
    @skill_attack_time = Crissaegrim_ABS::Distance_Skills[@assigned_skill][4]
     end
    end
    def skill_attack_all
     for event in $game_map.events.values
    if event.in_battle
      if @actor.mp >= $data_skills[@assigned_skill].mp_cost and @skill_attack_time <= 0
    	 @actor.mp -= @actor.calc_mp_cost($data_skills[@assigned_skill])
    	 $game_temp.common_event_id = $data_skills[@assigned_skill].common_event_id if $data_skills[@assigned_skill].common_event_id > 0
    	 dmg = event.enemy_called.make_obj_damage_value(@actor, $data_skills[@assigned_skill])
    	 event.animation_id = $data_skills[@assigned_skill].animation_id
    	 if event.deffending == true and event.x == guard_x and event.y == guard_y or event.kill_weapon > 0 or event.kill_skill > 0 or event.kill_item > 0 and !$data_skills[@assigned_skill].ignore_defense
    	   event.damage = "guard"
    	 else
    	   event.enemy_called.skill_effect(@actor, $data_skills[@assigned_skill])
    	   event.life -= dmg
    	   event.damage = dmg
    	   event.jump(0,0)
    	 end
    	 @skill_attack_time = 60 - (@actor.agi / 100)
       end
     end
      end
    end
    def skill_recover
     if @actor.mp >= $data_skills[@assigned_skill].mp_cost and @skill_attack_time <= 0
    @actor.mp -= @actor.calc_mp_cost($data_skills[@assigned_skill])
    $game_temp.common_event_id = $data_skills[@assigned_skill].common_event_id if $data_skills[@assigned_skill].common_event_id > 0
    dmg = @actor.make_obj_damage_value(@actor, $data_skills[@assigned_skill])
    @actor.skill_effect(@actor, $data_skills[@assigned_skill])
    @animation_id = $data_skills[@assigned_skill].animation_id
    @damage = dmg
    @skill_attack_time = 60 - (@actor.agi / 100)
     end
    end
    def item_normal_attack
     for event in $game_map.events.values
    if event.in_battle
      new_x = (@x + (@direction == 4 ? -1 : @direction == 6 ? 1 : 0))
      new_y = (@y + (@direction == 8 ? -1 : @direction == 2 ? 1 : 0))
      guard_x = (@x + (event.direction == 4 ? 1 : event.direction == 6 ? -1 : 0))
      guard_y = (@y + (event.direction == 8 ? 1 : event.direction == 2 ? -1 : 0))
      if event.x == new_x and event.y == new_y and @item_attack_time <= 0
    	if $game_party.has_item?($data_items[@assigned_item]) and @item_attack_time <= 0
    	  $game_party.lose_item($data_items[@assigned_item],1)
    	  $game_temp.common_event_id = $data_items[@assigned_item].common_event_id if $data_items[@assigned_item].common_event_id > 0
    	  dmg = event.enemy_called.make_obj_damage_value(@actor, $data_items[@assigned_item])
    	  event.animation_id = $data_items[@assigned_item].animation_id
    	if event.deffending == true and event.x == guard_x and event.y == guard_y or event.kill_weapon > 0 or event.kill_skill > 0 or event.kill_item > 0 and !$data_items[@assigned_item].ignore_defense
    	  event.damage = "guard"
    	else
    	  event.enemy_called.item_effect(@actor, $data_items[@assigned_item])
    	  event.life -= dmg
    	  event.damage = dmg
    	  event.jump(0,0)
    	end
    	@item_attack_time = 60 - (@actor.agi / 100)
      end
    end
     end
    end
    end
    def item_attack_range
     if $game_party.has_item?($data_items[@assigned_item]) and @item_attack_time <= 0
    $game_party.lose_item($data_items[@assigned_item],1)
    $game_temp.common_event_id = $data_items[@assigned_item].common_event_id if $data_items[@assigned_item].common_event_id > 0
    $game_range.push(Game_Range.new(self,Crissaegrim_ABS::Distance_Items[@assigned_item][0],Crissaegrim_ABS::Distance_Items[@assigned_item][1],Crissaegrim_ABS::Distance_Items[@assigned_item][2],Crissaegrim_ABS::Distance_Items[@assigned_item][3]))
    @item_attack_time = Crissaegrim_ABS::Distance_Items[@assigned_item][4]
     end
    end
    def item_recover
     if $game_party.has_item?($data_items[@assigned_item]) and @item_attack_time <= 0
    $game_party.lose_item($data_items[@assigned_item],1)
    $game_temp.common_event_id = $data_items[@assigned_item].common_event_id if $data_items[@assigned_item].common_event_id > 0
    dmg = @actor.calc_mp_recovery(@actor, $data_items[@assigned_item]) if $data_items[@assigned_item].mp_recovery > 0
    dmg = @actor.calc_hp_recovery(@actor, $data_items[@assigned_item]) if $data_items[@assigned_item].hp_recovery > 0
    @actor.item_effect(@actor, $data_items[@assigned_item])
    @animation_id = $data_items[@assigned_item].animation_id
    @damage = dmg
    @item_attack_time = 60 - (@actor.agi / 100)
     end
    end
    def anime_hero_attack
     if @attack_weapon != 0 and Crissaegrim_ABS::Animate_Weapons[@attack_weapon] != nil and Crissaegrim_ABS::Animate_Weapons[@attack_weapon] != 0 and Crissaegrim_ABS::Animate_Weapons[@attack_weapon][0] != "" and @anime_attack_time <= 0
    self.set_graphic(@character_name + Crissaegrim_ABS::Animate_Weapons[@attack_weapon][0], Crissaegrim_ABS::Animate_Weapons[@attack_weapon][1])
    @step_anime = true
    @anime_attack_time = 30
     end
    end
    def use_shield
     if Crissaegrim_ABS::Shields[@actor.armor1_id] != nil and Crissaegrim_ABS::Shields[@actor.armor1_id] != 0 and Crissaegrim_ABS::Shields[@actor.armor1_id][0] != ""
    self.set_graphic($game_actors[$game_party.members[0].id].character_name + Crissaegrim_ABS::Shields[@actor.armor1_id][0], Crissaegrim_ABS::Shields[@actor.armor1_id][1])
     end
    end
    #MODIFICA--------------------------------------------------------------
    def anime_hero_skill
     if @assigned_skill != 0 and Crissaegrim_ABS::Animate_Skills[@assigned_skill] != nil and Crissaegrim_ABS::Animate_Skills[@assigned_skill] != 0 and Crissaegrim_ABS::Animate_Skills[@assigned_skill][0] != "" and @anime_attack_time <= 0
    self.set_graphic(@character_name + Crissaegrim_ABS::Animate_Skills[@assigned_skill][0], Crissaegrim_ABS::Animate_Skills[@assigned_skill][1])
    @step_anime = true
    @anime_attack_time = (Crissaegrim_ABS::Animate_Skills[@assigned_skill][2] == 0) ? @skill_attack_time : Crissaegrim_ABS::Animate_Skills[@assigned_skill][2]
     end
    end
    #MODIFICA--------------------------------------------------------------
    def perform_transfer
     crissaegrim_abs_gplayer_perform_transfer
     for range in $game_range
    next if range == nil
    range.destroy = true
     end
     for drop in $game_drop
    next if drop == nil
    drop.destroy = true
     end
    end
    end
    
    #------------------------------------------------------------------------------
    # Game Range
    #------------------------------------------------------------------------------
    class Game_Range < Game_Character
     attr_accessor :draw
     attr_accessor :destroy
     attr_accessor :character_name
     def initialize(parent,chara_name="",chara_index=0,speed=4,range=0)
    super()
    @parent = parent
    @character_name = chara_name
    @character_index = chara_index
    @move_speed = speed
    @range = range
    @step = 0
    moveto(@parent.x,@parent.y)
    pd = @parent.direction
    turn_down if pd == 2
    turn_left if pd == 4
    turn_right if pd == 6
    turn_up if pd == 8
    @destroy = false
    @draw = false
     end
     def update
    super
    return @destroy = true if @step >= @range
    move_route
    check_event_trigger_touch(@x, @y)
     end
     def move_route
    return unless movable?
    d = @direction
    move_down if d == 2
    move_left if d == 4
    move_right if d == 6
    move_up if d == 8
    @step += 1
    $game_variables[100] = @step
     end
     def movable?
    return false if moving?
    return false if @move_route_forcing
    return true
     end
     def check_event_trigger_touch(x, y)
    return if @destroy
    for event in $game_map.events.values
      if event.in_battle
    	hurt_hero(@parent) if $game_player.x == x and $game_player.y == y and @parent.is_a?(Game_Event)
    	hurt_enemy_weapon_right(event) if event.x == x and event.y == y and $game_player.right_attack == true and @parent.is_a?(Game_Player)
    	hurt_enemy_weapon_left(event) if event.x == x and event.y == y and $game_player.left_attack == true and @parent.is_a?(Game_Player)
    	hurt_enemy_skill(event) if event.x == x and event.y == y and $game_player.skill_attack == true and @parent.is_a?(Game_Player)
    	hurt_enemy_item(event) if event.x == x and event.y == y and $game_player.item_attack == true and @parent.is_a?(Game_Player)
      end
    end
     end
     def hurt_hero(enemy)
    @destroy = true
    moveto(0,0)
    dmg = $game_party.members[0].make_obj_damage_value(enemy.enemy_called, $data_skills[enemy.skill_id])
    $game_player.animation_id = $data_skills[enemy.skill_id].animation_id
    if $game_player.deffending == true and guard($game_player, enemy) and !$data_skills[enemy.skill_id].ignore_defense
      $game_player.damage = "Guard"
    else
      $game_party.members[0].skill_effect(enemy.enemy_called, $data_skills[enemy.skill_id])
      $game_player.damage = dmg
      $game_player.jump(0,0)
    end
     end
     def hurt_enemy_weapon_right(enemy)
    @destroy = true
    moveto(0,0)
    guard_x = (@x + (enemy.direction == 4 ? 1 : enemy.direction == 6 ? -1 : 0))
    guard_y = (@y + (enemy.direction == 8 ? 1 : enemy.direction == 2 ? -1 : 0))
    dmg = enemy.enemy_called.make_attack_damage_value($game_party.members[0])
    enemy.animation_id = $data_items[Crissaegrim_ABS::Distance_Weapons[$game_party.members[0].weapon_id][5]].animation_id
    if enemy.deffending == true and guard(self, enemy) or enemy.kill_weapon > 0 and $game_party.members[0].weapon_id != enemy.kill_weapon or enemy.kill_skill > 0 or enemy.kill_item > 0
      enemy.damage = "Guard"
    else
      enemy.damage = dmg
      enemy.life -= dmg
      enemy.jump(0,0)
    end
     end
     def hurt_enemy_weapon_left(enemy)
    @destroy = true
    moveto(0,0)
    guard_x = (@x + (enemy.direction == 4 ? 1 : enemy.direction == 6 ? -1 : 0))
    guard_y = (@y + (enemy.direction == 8 ? 1 : enemy.direction == 2 ? -1 : 0))
    dmg = enemy.enemy_called.make_attack_damage_value($game_party.members[0])
    if $game_party.members[0].two_swords_style
      @weapon = $game_party.members[0].armor1_id
    else
      @weapon = $game_party.members[0].weapon_id
    end
    enemy.animation_id = $data_items[Crissaegrim_ABS::Distance_Weapons[@weapon][6]].animation_id
    if enemy.deffending == true and guard(self, enemy) or enemy.kill_weapon > 0 and @weapon != enemy.kill_weapon or enemy.kill_skill > 0 or enemy.kill_item > 0
      enemy.damage = "Guard"
    else
      enemy.damage = dmg
      enemy.life -= dmg
      enemy.jump(0,0)
    end
     end
     def hurt_enemy_skill(enemy)
    @destroy = true
    moveto(0,0)
    guard_x = (@x + (enemy.direction == 4 ? 1 : enemy.direction == 6 ? -1 : 0))
    guard_y = (@y + (enemy.direction == 8 ? 1 : enemy.direction == 2 ? -1 : 0))
    skl = $game_player.assigned_skill
    #MODIFICA----------------------------------------------------------------------
    if @step < 2
      spi_f_perc = $data_skills[skl].spi_f*9/10
      $data_skills[skl].spi_f -= spi_f_perc
    end
    #MODIFICA----------------------------------------------------------------------
    dmg = enemy.enemy_called.make_obj_damage_value($game_party.members[0], $data_skills[skl])
    #MODIFICA----------------------------------------------------------------------
    $data_skills[skl].spi_f += spi_f_perc if @step < 2
    #MODIFICA----------------------------------------------------------------------
    enemy.animation_id = $data_skills[skl].animation_id
    if enemy.deffending == true and guard(self, enemy) or enemy.kill_weapon > 0 or enemy.kill_skill > 0 and $game_player.assigned_skill != enemy.kill_skill or enemy.kill_item > 0
      enemy.damage = "Guard"
    else
      enemy.damage = dmg
      enemy.life -= dmg
      enemy.jump(0,0)
    end
     end
     def hurt_enemy_item(enemy)
    @destroy = true
    moveto(0,0)
    guard_x = (@x + (enemy.direction == 4 ? 1 : enemy.direction == 6 ? -1 : 0))
    guard_y = (@y + (enemy.direction == 8 ? 1 : enemy.direction == 2 ? -1 : 0))
    itm = $game_player.assigned_item
    dmg = enemy.enemy_called.make_obj_damage_value($game_party.members[0], $data_items[itm])
    enemy.animation_id = $data_items[itm].animation_id
    if enemy.deffending == true and guard(self, enemy) or enemy.kill_weapon > 0 or enemy.kill_skill > 0 or enemy.kill_item > 0 and $game_player.assigned_item != enemy.kill_item
      enemy.damage = "Guard"
    else
      enemy.damage = dmg
      enemy.life -= dmg
      enemy.jump(0,0)
    end
     end
     def guard(attacker, target)
    if attacker.direction == 2 and target.direction == 8
      return true
    elsif attacker.direction == 4 and target.direction == 6
      return true
    elsif attacker.direction == 6 and target.direction == 4
      return true
    elsif attacker.direction == 8 and target.direction == 2
      return true
    else
      return false
    end
     end
    end
    
    #------------------------------------------------------------------------------
    # Game Drop
    #------------------------------------------------------------------------------
    class Game_Drop < Game_Character
     attr_accessor :draw
     attr_accessor :destroy
     attr_accessor :character_name
     def initialize(parent,chara_name="",chara_index=0,items=[],gold=0)
    super()
    @character_name = chara_name
    @character_index = chara_index
    @items = items
    @gold = gold
    @drop_time = Crissaegrim_ABS::Drop_Duration_Time
    moveto(parent.x,parent.y)
    move_random
    Audio.se_play("Audio/SE/"+Crissaegrim_ABS::Drop_Item_SE,100,100) if Crissaegrim_ABS::Drop_Item_SE != "" and @items != nil
    Audio.se_play("Audio/SE/"+Crissaegrim_ABS::Drop_Money_SE,100,100) if Crissaegrim_ABS::Drop_Money_SE != "" and @gold > 0
    @destroy = false
    @draw = false
     end
     def update
    super
    return if @destroy == true
    if Input.trigger?(Input::C)
      if in_range?($game_player,self,1) and in_direction?($game_player,self)
    	get_reward
      end
    end
    @drop_time -= 1 if @drop_time > 0
    @destroy = true if @drop_time <= 0
     end
     def get_reward
    Audio.se_play("Audio/SE/"+Crissaegrim_ABS::Get_Reward_SE,100,100) if Crissaegrim_ABS::Get_Reward_SE != ""
    $game_party.gain_gold(@gold)
    for item in @items
      case item
      when RPG::Item
    	$game_party.gain_item($data_items[item.id],1)
      when RPG::Weapon
    	$game_party.gain_item($data_weapons[item.id],1)
      when RPG::Armor
    	$game_party.gain_item($data_armors[item.id],1)
      end
    end
    @destroy = true
     end
     def move_random
    return false if moving?
    case rand(3)
    when 0
      move_down
    when 1
      move_left
    when 2
      move_right
    when 3
      move_up
    end
     end
     def check_event_trigger_touch(x, y)
     end
    end
    
    #------------------------------------------------------------------------------
    # Game ABS Enemy
    #------------------------------------------------------------------------------
    class GameABS_Enemy < Game_Battler
     attr_reader   :enemy_id
     def initialize(enemy_id)
    super()
    @enemy_id = enemy_id
    enemy = $data_enemies[@enemy_id]
     end
     def actor?
    return false
     end
     def enemy
    return $data_enemies[@enemy_id]
     end
     def base_maxhp
    return enemy.maxhp
     end
     def base_maxmp
    return enemy.maxmp
     end
     def base_atk
    return enemy.atk
     end
     def base_def
    return enemy.def
     end
     def base_spi
    return enemy.spi
     end
     def base_agi
    return enemy.agi
     end
     def hit
    return enemy.hit
     end
     def eva
    return enemy.eva
     end
     def cri
    return enemy.has_critical ? 10 : 0
     end
     def odds
    return 1
     end
     def element_rate(element_id)
    rank = enemy.element_ranks[element_id]
    result = [0,200,150,100,50,0,-100][rank]
    for state in states
      result /= 2 if state.element_set.include?(element_id)
    end
    return result
     end
     def state_probability(state_id)
    if $data_states[state_id].nonresistance
      return 100
    else
      rank = enemy.state_ranks[state_id]
      return [0,100,80,60,40,20,0][rank]
    end
     end
     def exp
    return enemy.exp
     end
     def gold
    return enemy.gold
     end
     def drop_item1
    return enemy.drop_item1
     end
     def drop_item2
    return enemy.drop_item2
     end
     def use_sprite?
    return true
     end
     def perform_collapse
    if $game_temp.in_battle and dead?
      @collapse = true
      Sound.play_enemy_collapse
    end
     end
     def escape
    @hidden = true
    @action.clear
     end
     def transform(enemy_id)
    @enemy_id = enemy_id
    if enemy.name != @original_name
      @original_name = enemy.name
      @letter = ''
      @plural = false
    end
    @battler_name = enemy.battler_name
    @battler_hue = enemy.battler_hue
    make_action
     end
     def conditions_met?(action)
    case action.condition_type
    when 1
      n = $game_troop.turn_count
      a = action.condition_param1
      b = action.condition_param2
      return false if (b == 0 and n != a)
      return false if (b > 0 and (n < 1 or n < a or n % b != a % b))
    when 2
      hp_rate = hp * 100.0 / maxhp
      return false if hp_rate < action.condition_param1
      return false if hp_rate > action.condition_param2
    when 3
      mp_rate = mp * 100.0 / maxmp
      return false if mp_rate < action.condition_param1
      return false if mp_rate > action.condition_param2
    when 4
      return false unless state?(action.condition_param1)
    when 5
      return false if $game_party.max_level < action.condition_param1
    when 6
      switch_id = action.condition_param1
      return false if $game_switches[switch_id] == false
    end
    return true
     end
     def make_action
    @action.clear
    return unless movable?
    available_actions = []
    rating_max = 0
    for action in enemy.actions
      next unless conditions_met?(action)
      if action.kind == 1
    	next unless skill_can_use?($data_skills[action.skill_id])
      end
      available_actions.push(action)
      rating_max = [rating_max, action.rating].max
    end
    ratings_total = 0
    rating_zero = rating_max - 3
    for action in available_actions
      next if action.rating <= rating_zero
      ratings_total += action.rating - rating_zero
    end
    return if ratings_total == 0
    value = rand(ratings_total)
    for action in available_actions
      next if action.rating <= rating_zero
      if value < action.rating - rating_zero
    	@action.kind = action.kind
    	@action.basic = action.basic
    	@action.skill_id = action.skill_id
    	@action.decide_random_target
    	return
      else
    	value -= action.rating - rating_zero
      end
    end
     end
    end
    
    #------------------------------------------------------------------------------
    # Game Actor
    #------------------------------------------------------------------------------
    class Game_Actor
     alias crissaegrim_abs_change_exp change_exp
     def change_exp(exp, show)
    last_level = @level
    last_skills = skills
    @exp = [[exp, 9999999].min, 0].max
    while @exp >= @exp_list[@level+1] and @exp_list[@level+1] > 0
      level_up
    end
    while @exp < @exp_list[@level]
      level_down
    end
    @hp = [@hp, maxhp].min
    @mp = [@mp, maxmp].min
    if show and @level > last_level
      show_level_up
    end
    crissaegrim_abs_change_exp(exp,show)
     end
     def show_level_up
    $game_player.animation_id = Crissaegrim_ABS::LevelUp_Animation
    $game_party.members[0].hp = $game_party.members[0].maxhp
    $game_party.members[0].mp = $game_party.members[0].maxmp
    $game_player.damage = "Level Up"
     end
     def atk_animation_id2
    if two_swords_style
      return weapons[1] == nil ? 1 : weapons[1].animation_id
    else
      return 1
    end
     end
    end
    
    #------------------------------------------------------------------------------
    # Game Map
    #------------------------------------------------------------------------------
    class Game_Map
     alias crissaegrim_abs_gmap_passable passable?
    def passable?(x, y, flag = 0x01)
     for drop in $game_drop
    next if drop.nil?
    return false if drop.x == x and drop.y == y
     end
     crissaegrim_abs_gmap_passable(x, y, flag = 0x01)
    end
    end
    
    #------------------------------------------------------------------------------
    # Sprite Base
    #------------------------------------------------------------------------------
    class Sprite_Base 
     alias animation animation_set_sprites
     def animation_set_sprites(frame)
    cell_data = frame.cell_data
    for i in 0..15
      sprite = @animation_sprites[i]
      next if sprite == nil
      pattern = cell_data[i, 0]
      if pattern == nil or pattern == -1
    	sprite.visible = false
    	next
      end
      if pattern < 100
    	sprite.bitmap = @animation_bitmap1
      else
    	sprite.bitmap = @animation_bitmap2
      end
      sprite.visible = true
      sprite.src_rect.set(pattern % 5 * 192,
    	pattern % 100 / 5 * 192, 192, 192)
      if @animation_mirror
    	sprite.x = @animation_ox - cell_data[i, 1] / 2
    	sprite.y = @animation_oy - cell_data[i, 2] / 2
    	sprite.angle = (360 - cell_data[i, 4])
    	sprite.mirror = (cell_data[i, 5] == 0)
      else
    	sprite.x = @animation_ox + cell_data[i, 1] / 2
    	sprite.y = @animation_oy + cell_data[i, 2] / 2
    	sprite.angle = cell_data[i, 4]
    	sprite.mirror = (cell_data[i, 5] == 1)
      end
      sprite.z = self.z + 300
      sprite.ox = 96
      sprite.oy = 96
      sprite.zoom_x = cell_data[i, 3] / 200.0
      sprite.zoom_y = cell_data[i, 3] / 200.0
      sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
      sprite.blend_type = cell_data[i, 7]
    end
     end
    end
    
    #------------------------------------------------------------------------------
    # Sprite Character
    #------------------------------------------------------------------------------
    class Sprite_Character < Sprite_Base
     alias crissaegrim_abs_spchar_update update
     alias crissaegrim_abs_spchar_dispose dispose
     def initialize(viewport, character = nil)
    super(viewport)
    @character = character
    @balloon_duration = 0
    @_damage_duration = 0
    update
     end
     def update
    super
    if @_damage_duration > 0
      @_damage_duration -=1
    	@_damage_sprite.x = self.x
    	if @_damage_duration <= 0
    	  dispose_damage
    	end
      end
      if @character != nil and @character.damage != nil
      damage(@character.damage, @character.critical)
      @character.damage = nil
      @character.critical = false
    end
    crissaegrim_abs_spchar_update
     end
     def dispose
    crissaegrim_abs_spchar_dispose
    dispose_damage
     end
     def damage(value, critical)
      dispose_damage
      if value.is_a?(Numeric)
    	damage_string = value.abs.to_s
      else
    	damage_string = value.to_s
      end
      bitmap = Bitmap.new(160, 48)
      bitmap.font.name = "Georgia"
      bitmap.font.size = 22
      bitmap.font.italic = true
      if value.is_a?(Numeric) and value <= 0
    	bitmap.font.color.set(255, 255, 128)
      else
    	bitmap.font.color.set(255, 255, 255)
      end
      bitmap.draw_text(1, 13, 160, 36, damage_string, 1)
      bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
      if critical
    	bitmap.font.color.set(0, 0, 0)
    	bitmap.draw_text(1, 6, 160, 20, "Critical", 1)
    	bitmap.font.color.set(255, 255, 128)
    	bitmap.draw_text(0, 5, 160, 20, "Critical", 1)
      end
      @_damage_sprite = ::Sprite.new(self.viewport)
      @_damage_sprite.bitmap = bitmap
      @_damage_sprite.ox = 80
      @_damage_sprite.oy = 20
      @_damage_sprite.x = self.x
      @_damage_sprite.y = self.y - self.oy / 2 - 40
      @_damage_sprite.z += 99999
      @_damage_duration = 30
    end
    def show_text(string, size=16, color=0)
      dispose_damage
      damage_string = string
      if string.is_a?(Array)
    	array = true
      else
    	array = false
      end
      bitmap = Bitmap.new(160, 48)
      bitmap.font.name = "Georgia"
      bitmap.font.size = size
      bitmap.font.italic = true
      if array
    	for i in 0..string.size
    	  next if damage_string[i] == nil
    	  bitmap.font.color.set(96, 96-20, 0) if color == 0
    	  bitmap.font.color.set(0, 0, 0) if color != 0 
    	  bitmap.draw_text(-1, (12+(16*i)-1)-16, 160, 36, damage_string[i], 1)
    	  bitmap.draw_text(+1, (12+(16*i)-1)-16, 160, 36, damage_string[i], 1)
    	  bitmap.draw_text(-1, (12+(16*i)+1)-16, 160, 36, damage_string[i], 1)
    	  bitmap.draw_text(+1, (12+(16*i)+1)-16, 160, 36, damage_string[i], 1)
    	  bitmap.font.color.set(255, 245, 155) if color == 0
    	  bitmap.font.color.set(144, 199, 150) if color == 1
    	  bitmap.font.color.set(197, 147, 190)if color == 2
    	  bitmap.font.color.set(138, 204, 198)if color == 3
    	  bitmap.draw_text(0, (12+(16*i))-16, 160, 36, damage_string[i], 1)
    	end
      else
    	bitmap.font.color.set(96, 96-20, 0) if color == 0
    	bitmap.font.color.set(0, 0, 0) if color != 0 
    	bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
    	bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
    	bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
    	bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
    	bitmap.font.color.set(255, 245, 155) if color == 0
    	bitmap.font.color.set(144, 199, 150) if color == 1
    	bitmap.font.color.set(197, 147, 190)if color == 2
    	bitmap.font.color.set(138, 204, 198)if color == 3
    	bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
      end
      @_damage_sprite = ::Sprite.new(self.viewport)
      @_damage_sprite.bitmap = bitmap
      @_damage_sprite.ox = 80
      @_damage_sprite.oy = 20
      @_damage_sprite.x = self.x
      @_damage_sprite.y = self.y - self.oy / 2
      @_damage_sprite.z = 3000
      @_damage_duration = 30
    end 
    def dispose_damage
    if @_damage_sprite != nil
      @_damage_sprite.dispose
      @_damage_sprite = nil
    end
     end
    end
    
    #------------------------------------------------------------------------------
    # Spriteset Map
    #------------------------------------------------------------------------------
    class Spriteset_Map
     alias crissaegrim_abs_sp_map_create_characters create_characters
     alias crissaegrim_abs_sp_map_update_characters update_characters
     alias crissaegrim_abs_sp_map_dispose dispose
     def create_characters
    @range_sprites = []
    for range in $game_range
      next if range == nil
      @range_sprites.push(Sprite_Character.new(@viewport1,range))
    end
    @drop_sprites = []
    for drop in $game_drop
      next if drop == nil
      @drop_sprites.push(Sprite_Character.new(@viewport1,drop))
    end
    crissaegrim_abs_sp_map_create_characters
     end
     def update_characters
    crissaegrim_abs_sp_map_update_characters
    for range in @range_sprites
      next if range == nil
      range.update
    end
    for drop in @drop_sprites
      next if drop == nil
      drop.update
    end
    for range in $game_range
      next if range == nil
      if range.draw == false
    	@range_sprites.push(Sprite_Character.new(@viewport1,range))
    	range.draw = true
      end
      if range.destroy == true
    	$game_range.delete(range)
    	range.character_name = ""
      end
    end
    for drop in $game_drop
      next if drop == nil
      if drop.draw == false
    	@drop_sprites.push(Sprite_Character.new(@viewport1,drop))
    	drop.draw = true
      end
      if drop.destroy == true
    	$game_drop.delete(drop)
    	drop.character_name = "" 
      end
    end
     end
     def dispose
    for range in @range_sprites
      next if range == nil
      range.dispose
    end
    for drop in @drop_sprites
      next if drop == nil
      drop.dispose
    end
    crissaegrim_abs_sp_map_dispose
     end
    end
    
    #------------------------------------------------------------------------------
    # Scene Map
    #------------------------------------------------------------------------------
    class Scene_Map < Scene_Base
     alias crissaegrim_abs_smap_update update
     def update
    for range in $game_range
      next if range == nil
      range.update
    end
    for drop in $game_drop
      next if drop == nil
      drop.update
    end
    crissaegrim_abs_smap_update
     end
    end
    
    #------------------------------------------------------------------------------
    # Scene File
    #------------------------------------------------------------------------------
    class Scene_File < Scene_Base
     alias crissaegrim_abs_sfile_write_save_data write_save_data
     alias crissaegrim_abs_sfile_read_save_data read_save_data
     def write_save_data(file)
    crissaegrim_abs_sfile_write_save_data(file)
    Marshal.dump($game_range,		 file)
    Marshal.dump($game_drop,		 file)
     end
     def read_save_data(file)
    crissaegrim_abs_sfile_read_save_data(file)
    $game_range		 = Marshal.load(file)
    $game_drop		  = Marshal.load(file)
     end
    end
    
    #------------------------------------------------------------------------------
    # Scene Title
    #------------------------------------------------------------------------------
    class Scene_Title < Scene_Base
     alias crissaegrim_abs_scenetitle_command_new_game command_new_game
     def command_new_game
    $game_range = []
    $game_drop = []
    crissaegrim_abs_scenetitle_command_new_game
     end
    end
    
    #------------------------------------------------------------------------------
    # Window Skill
    #------------------------------------------------------------------------------
    #MODIFICA----------------------------------------------------------------------
    =begin
    class Window_Skill < Window_Selectable
     def update_help
    if $skill_lock_description <= 0
      @help_window.set_text(skill == nil ? "" : skill.description)
    else
      @help_window.set_text(skill == nil ? "" : "Skill Memorizada!")
    end
     end
    end
    class Scene_Skill < Scene_Base
     alias crissaegrim_abs_sskill_start start
     alias crissaegrim_abs_sskill_update update
     alias crissaegrim_abs_sskill_update_skill_selection update_skill_selection
     alias crissaegrim_abs_sitem_use_skill_nontarget use_skill_nontarget
     def start
    $skill_lock_description = 0
    crissaegrim_abs_sskill_start
     end
     def update
    crissaegrim_abs_sskill_update
    $skill_lock_description -= 1 if $skill_lock_description > 0
     end
     def update_skill_selection
    for button in Crissaegrim_ABS::Skill_Button.keys
      if Input.trigger?(button)
    	Sound.play_decision
    	Crissaegrim_ABS::Skill_Button[button] = @skill_window.skill.id
    	$skill_lock_description = 120
      end
    end
    crissaegrim_abs_sskill_update_skill_selection
     end
     def use_skill_nontarget
    return if @skill.scope == 1 or
    @skill.scope == 2 or
    @skill.scope == 3 or
    @skill.scope == 4 or
    @skill.scope == 5 or
    @skill.scope == 6 or
    crissaegrim_abs_sitem_use_skill_nontarget
     end
    end
    =end
    #MODIFICA----------------------------------------------------------------------
    #------------------------------------------------------------------------------
    # Window Item
    #------------------------------------------------------------------------------
    class Window_Item < Window_Selectable
     alias crissaegrim_abs_witem_initialize initialize
     def initialize(x, y, width, height)
    $item_lock_description = 0
    crissaegrim_abs_witem_initialize(x, y, width, height)
     end
     def update_help
    if $item_lock_description <= 0
    @help_window.set_text(item == nil ? "" : item.description)
     else
    @help_window.set_text(item == nil ? "" : "Item Memorizado!")
     end
    end
    end
    class Scene_Item < Scene_Base
     alias crissaegrim_abs_sitem_start start
     alias crissaegrim_abs_sitem_update update
     alias crissaegrim_abs_sitem_update_item_selection update_item_selection
     alias crissaegrim_abs_sitem_use_item_nontarget use_item_nontarget
     def start
    $item_lock_description = 0
    crissaegrim_abs_sitem_start
     end
     def update
    crissaegrim_abs_sitem_update
    $item_lock_description -= 1 if $item_lock_description > 0
     end
     def update_item_selection
    for button in Crissaegrim_ABS::Item_Button.keys
      if Input.trigger?(button)
    	Sound.play_decision
    	Crissaegrim_ABS::Item_Button[button] = @item_window.item.id
    	$item_lock_description = 120
      end
    end
    crissaegrim_abs_sitem_update_item_selection
     end
     def use_item_nontarget
    return if @item.scope == 1 or
    @item.scope == 2 or
    @item.scope == 3 or
    @item.scope == 4 or
    @item.scope == 5 or
    @item.scope == 6 or
    crissaegrim_abs_sitem_use_item_nontarget
     end
    end
    
    #------------------------------------------------------------------------------
    # Fine dell' ABS
    #------------------------------------------------------------------------------

     

     

    Qui le modifiche sono un pochino più numerose e sostanziose... comunque sia sono sempre tutte racchiuse entro i commenti #MODIFICA---

    1) ho levato la possibilità di utilizzare armi e scudi in favore delle abilità a distanza, i cui tasti di utilizzo sono sempre A ( Tira Pugni, abilità a distanza 1 casella, solo da vicino quindi ) ed S ( Lancia Sfera, abilità a distanza 6 caselle, ovviamente puoi cambiare la distanza come vuoi, è semplicemente un'abilità a distanza dell'ABS );

    2) ora puoi assegnare 5 oggetti differenti ai seguenti tasti: 1, 2, 3, 4, 5;

    3) anche se non hai scritto nulla al riguardo, ho pensato che avresti voluto "animare" anche l'eroe mentre esegue le sue mosse, quindi ho pensato di sfruttare l'array "Animate_Skills" (dichiarato e inizializzato ma mai utilizzato nel resto del codice) per associare un'animazione dell'eroe ad una particolare abilità a distanza( solo alle Distance_Skills quindi ), così come avveniva per le armi e scudi in generale; Inoltre, ho ampliato l'array "Animate_Skills" stesso in modo da aggiungere un terzo valore, la durata dell'animazione, che se posto a 0 durerà per tutta la durata dell'abilità, altrimenti se posto maggiore di 0 avrà la durata così scelta;

    4) se Lancia Sfera colpisce un nemico adiacente all'Eroe, quello subirà un danno ridotto rispetto a quello a distanza superiore, poiché viene ridotta del 90% la Forza Spirituale dell'abilità ( nel caso del Tira Pugni, la Forza Spirituale, è 0 perché è un'attacco fisico e quindi capirai che solo le abilità con Forza Spirituale sono affette da questo difetto, come Lancia Sfera, e quindi poi puoi regolarti facendo prove sui valori basandoti sulla formula del calcolo del danno presente nell'HELP di rpg maker );

    5) infine, ho levato la possibilità di cambiare i tasti assegnati, attraverso il menù, alle abilità ( visto che non volevi più lo slot abilità e che ho utilizzato quest'ultime proprio per Tira Pugni e Lancia Sfere come attacchi base ).

     

    Per poter sfruttare queste modifiche è comunque necessario saper utilizzare questo ABS ( ovvero, saper aggiungere abilità, creare nemici etc. etc. ).

    Gli ID 83 e 84 che compaiono per le abilità a distanza, sono quelli che corrispondono alle abilità che ho creato, rispettivamente Tira Pugni e Lancia Sfera.

     

     

    Inoltre, ti consiglio di imparare a programmare in ruby o trovarti uno scripter, altrimenti non riuscirai andare molto avanti chiedendo sempre aiuto in questo modo ;)

     

    Infine ti lascio alla demo dell'ABS in cui sono presenti tali modifiche ( così puoi anche vedere le abilità Tira Pugni e Lancia Sfera che ho creato nel database ):

    http://ultrasonic.altervista.org/_altervis...MOD-Freddo).rar

     

     

    PS: come potrai vedere, ho utilizzato l'animazione della spada e dello scudo rispettivamente per Tira Pugni e Lancia Sfera perché non ne avevo di già pronte; inoltre noterai che ho assegnato una grafica anche all'abilità Tira Pugni ( una sfera gialla ), ovviamente puoi anche decidere che non si veda niente semplicemente lasciando vuoto ( "" ) il valore che corrisponde al nome del chara da utilizzare.

  14. Si sono tornato a rompere :\

    La nuova versione va benissimo, a parte un particolare.

    Cioé, quando tento di salvare il file RTP_RT da errore.

    Ho provato anche a sostituire il database\rtp_rt ma il problema sussiste.

    Se non c'è soluzione lo rifaccio daccapo :3. però prima vorrei sapere ^O^

     

    EDIT: mi sono accorto che succede con TUTTi i progetti.

    Anche re-installando Rpg Maker 2003 il problema sussiste.

     

    EDIT: risolto, a quanto pare era proprio un problema di quella versione, cioé quella di White Dragon :\

    Potresti passarmi uno di questi progetti?

    Perché io in effetti non riesco ad avere problemi con la versione di White Dragon... e ci ho aperto/modificato progetti creati da altri ( che suppongo non siano stati fatti tutti con la versione di White Dragon ) e progetti che ho creato più o meno... uhm... 8 anni fa... forse ne ho pure qualcuno che ho creato con una delle prime versione di RPG Maker 2000 tradotte in inglese da Don Miliguel.

     

     

    PS: per file RTP_RT intendi "RPG_RT"? Se sì, quale dei 3? ".exe", ".ldb" o ".lmt"?

  15. E potrei scaricarla...?
    Certo che potresti: "Volere è Potere".

     

     

     

     

     

     

     

     

     

    Vabbè: RPG MAKER 2003 v1.09a [iTALIANO]

     

     

     

     

     

     

     

     

     

     

    Faccio finta che tu abbia già cercato le parole chiave "RPG MAKER 2003 WHITE DRAGON" su google e che abbia fatto accesso al secondo risultato della ricerca ( il primo è wikipedia... ).

    Avrai scoperto quindi che da lì ( http://armaiden.altervista.org/prog.htm ) non ti è possibile scaricarlo direttamente, ma che dovresti mandare una e-mail a White Dragon ( come feci anche io tempo fa ).

    Solo se sei fortunato ti risponderà in tempi brevi, tanto nel mentre puoi continuare a lavorare con la versione di RPG Maker 2003 che hai attualmente...

     

     

     

     

     

     

     

     

     

     

    Vabbé, entro oggi te lo passo in privato °°

    ( scommetto che tu, al posto mio, ti saresti fermato alla prima risposta che ho dato, considerata la domanda :E )

  16. Stessa cosa,mancano le rtp
    Ho verificato su una installazione pulita di Windows XP e in effetti richiede ancora le RTP... mi son fidato di RMTool ( Revisione: 2000-1.0 ).

     

    Ho usato un altro programma e successivamente verificato sempre nell'installazione di Windows XP pulita: questo ti funzionerà sicuramente anche senza RTP.

    [TD]Trasparenza_Edificio_con_risorse_C.zip

     

     

     

    EDIT:

    Per chi fosse interessato, ho utilizzato Rm2kUtility ( altri possibili nomi con cui è possibile trovarlo sono: "RM2K General Utility" e "RM2K Plugin Utility" ), precisamente il plugin "Rast's RTP Dependancy Scanner Plugin" fra quelli disponibili ( se non erro c'era pure una traduzione in italiano a cura di Infernet89 ).

    Quest'ultimo fa davvero una scansione completa perché mi ha aggiunto anche delle risorse che non erano "esattamente" utilizzate nel progetto [ ad esempio, se cancelli tutti i "Terreni" e poi vai a cancellare tutti i "Gruppi di Mostri", gli rimane comunque associato lo Sfondo del Terreno che aveva in precedenza prima di cancellare tutti i "Terreni"; perché questo si aggiorni e diventi nero ( ovvero non cerchi più tale risorsa sull'hard disk ) bisogna fare doppio click sul Terreno vuoto rimasto ( visto che anche se li cancelli tutti, ne rimane comunque uno anche se vuoto ); RMTool quindi questo sfondo non me lo aveva trovato, mentre invece il plugin di Rm2kUtility sì( ovviamente vale lo stesso discorso anche per altre schede del database con lo stesso difetto ) ].

  17. Perché nonostante abbia rpgmaker 2003 non me lo apre ç_ç
    L'ho fatto con RPG Maker 2000 perché fosse compatibile sia col 2000 che col 2003, però le risorse ( RTP ) non sono esattamente uguali ( alcune hanno nome diverso, altre sono proprio differenti a livello grafico ).

    Fammi sapere se questa versione comprensiva delle risorse che ho utilizzato nel progetto ti funziona:

    [TD]Trasparenza Edificio con risorse.zip <--- RIMANDO AL MESSAGGIO COL LINK AGGIORNATO

  18. Youtube - Trasparenza Edificio

    [TD]Trasparenza_Edificio.rar

    [TD]Trasparenza_Edificio_con_risorse_C.zip <-- per chi non ha le RTP di RPG Maker 2000

    Questo è un metodo. L'unico difetto rispetto a quello del video "straniero"( anche se nel mio video non si può notare il difetto che sto per scrivere e quindi potrebbe avercelo pure il metodo "straniero" ) è che il passaggio da una mappa all'altra non è sempre immediato: a volte appare, per qualche frazione di secondo, una schermata nera durante la transizione.

     

     

    se si facesse a eventi non sarebbe possibile dare quell'effetto di fading progressivo fino alla trasparenza.

    A meno che pure il chara non sia una picture, direi che è una combo di picture che includono il chara (tanto lì deve stare quando entra in una stanza, in questo modo posso sostituire il pavimento che in teoria lo coprirebbe in quanto picture) e panorami da mettere a fine transizione in modo da farci camminare sopra il chara.

    Insomma un lavorone, ma a eventi sarebbe ancora più lavorone, solo per il lag.

    In realtà, si possono applicare gli effetti di transizione tra una mappa e l'altra, anche ad eventi e picture: l'effetto "Dissolvi" di "Mostra Schermo" ( così si chiamano in RPG Maker 2000 ) ad esempio, permette di mostrare un evento o una picture con una diminuzione progressiva della trasparenza, da 100% a 0% ( basta semplicemente porre dopo ad esempio un cambio di grafica di un evento, il comando "Mostra Schermo" con effetto "Dissolvi"; anche altri effetti sono comunque utilizzabili per eventi e picture ).

    Il vero problema è che, durante l'esecuzione di un effetto, non è possibile fare nient'altro e quindi, se l'Eroe si sposta da una parte all'altra dell'edificio, quando è il momento di mostrare le pareti, egli sarebbe costretto a rimanere fermo fino a che queste non vengono mostrate completamente.

    Comunque, è più pratico usare delle picture invece che star lì a creare gli eventi uno e per uno e predisporli in tal senso( oltre al fatto che si dovrebbero creare chara appositi visto che non si può accedere al livello inferiore del chipset per la grafica di un evento ).

  19. Ecco il mio problema.

    Ho messo nel mio evento "enter hero name".

    E già qui è strano, visto che mi chiede se devo scrivere in Katakana e un altro alfabeto giapponese...

    e allora mi dico "Va bé, questa sarà una svista nella traduzione in inglese..."

    Però effettivamente quando attivo l'evento...i caratteri escono scorretti e il nome iniziale del giocatore (RAPHAEL) viene sostituito dalle Q.

     

    Il tutto con il 2003. Come posso risolvere?

     

    Cambia versione. Quella di White Dragon corregge questo difetto.

  20. La prossima volta sarebbe meglio se usassi il tag "code" ( sempre all'interno del tag spoiler ovviamente ) per poter racchiudere correttamente il codice, altrimenti rendi difficile sia la copia che la lettura del codice stesso.

     

    Per tale motivo, ho preso il codice direttamente da qua:

    http://www.rpg2s.net/forum/index.php?showtopic=5903

    ( dovrebbe essere lo stesso a meno che tu non abbia apportato modifiche )

     

    Qui il codice modificato:

     

     

    #==============================================================================
    # Crissaegrim ABS tradotto in italiano
    #==============================================================================
    #------------------------------------------------------------------------------
    # Crediti:
    # Vlad: autore 
    # Ciri: traduttore
    #------------------------------------------------------------------------------
    # Per creare un nemico collocare i seguenti commenti in un evento:
    
    # Enemy ID - dove ID sta per l'ID del nemico nel database;
    # Die Erase - fa in modo che il nemico contro cui si combatte scompaia se sconfitto;
    # Die Switch Local A - Attiva la Switch locale A quando il nemico con cui si combatte viene ucciso;
    # Die Switch Local B - Attiva la Switch locale B quando il nemico con cui si combatte viene ucciso;
    # Die Switch Local C - Attiva la Switch locale C quando il nemico con cui si combatte viene ucciso;
    # Die Switch Local D - Attiva la Switch locale D quando il nemico con cui si combatte viene ucciso;
    # Die Switch X - Attiva la Switch X quando il nemico con cui si combatte viene ucciso;
    # Die Variable X - Aggiunge +1 alla variabile x quando il nemico con cui si sta combattendo muore;
    # Follow X - serve a fare si che il nemico segua automaticamente l'eroe, quando questo è a X passi di distanza da lui.
    # Kill Weapon ID - Questo ID indica l'ID di un'arma nel database;il commento serve a fare in modo che il nemico muoia solo se viene usata tale arma. 
    # Kill Skill ID - Questo ID indica l'ID di una skill nel database;il commento serve a fare in modo che il nemico muoia solo se viene usata tale skill.
    # Kill Item ID - Questo ID indica l'ID di un oggetto nel database;il commento serve a fare in modo che il nemico muoia solo se viene usato tale oggetto.
    
    #------------------------------------------------------------------------------
    # CONFIGURAZIONE GENERALE
    #------------------------------------------------------------------------------
    module Crissaegrim_ABS
    #------------------------------------------------------------------------------
    #Tasto per l'attacco con la mano destra:
    Right_Attack_Button = Input::Letters["A"]
    #------------------------------------------------------------------------------
    #Tasto per l'attacco con la mano sinistra, o con lo scudo:
    Left_Attack_and_Shield_Button = Input::Letters["S"]
    #------------------------------------------------------------------------------
    # Tasti per la memorizzazione e l'utilizzo delle abilità:
    Skill_Button = {Input::Numberkeys[1] => 0, Input::Numberkeys[2] => 0, Input::Numberkeys[3] => 0,}
    #------------------------------------------------------------------------------
    # Tasti per la memorizzazione e l'utilizzo di oggetti:
    Item_Button = {Input::Numberkeys[4] => 0, Input::Numberkeys[5] => 0, Input::Numberkeys[6] => 0,}
    #------------------------------------------------------------------------------
    # Arma da distanza.
    # Per creare un arma da distanza copiare: Distance_Weapons[S] = [T, U, V, W, X, Y, Z] e inserire:
    # S:ID dell' Arma, T:Chara del proiettile dell'arma, U:Indice del chara, V:Velocità, W:Distanza, X:Tempo di attasa per attacare nuovamente, Y: database ID  del primo tipo di munizioni, Z:database ID del secondo tipo di munizioni 
    Distance_Weapons = {}
    Distance_Weapons[4] = ["$Arrow", 0, 6, 5, 30, 21, 22]
    #------------------------------------------------------------------------------
    # Armi con animazioni
    # Per creare un'arma con animazione copiare: Animate_Weapons[X] = ["Y", Z] e impostare:
    # X:ID dell'arma nel database e Y per il prefisso del nome del chara che raffigura 
    #l'attacco (per esempio se il chara del protagonista si chiama "Actor3", il chara 
    #del protagonista che attacca si dovrà chiamare "Actor3_preffisso", quel prefisso dovrete 
    #inserirlo al posto della Y), e Z per l'idice del Chara
    Animate_Weapons = {}
    Animate_Weapons[2] = ["_attescudo", 1]
    Animate_Weapons[4] = ["_attescudo", 2]
    #------------------------------------------------------------------------------
    # Armi con suono
    # Per creare un'arma con suono copiare: Weapon_Shot_SE[X] = "Y" e impostare:
    # X per l'ID dell'arma nel database, e Y per il nome del suono contenuto nella cartella SE
    Weapon_Shot_SE = {}
    Weapon_Shot_SE[4] = "Blow7"
    #------------------------------------------------------------------------------
    # Abilità a distanza
    # Per creare una skill utilizzabile a distanza copiare: Distance_Skills[U] = [V, W, X, Y, Z] e impostare:
    # U:ID della skill, V:Chara della skill, W:Indice del Chara, X:Velocità, Y:Distanza, Z:Tempo da aspettare prima di compiere un nuovo attacco.
    Distance_Skills = {}
    Distance_Skills[84] = ["", 0, 1.5, 2, 60]
    Distance_Skills[59] = ["$FireBall", 0, 4, 5, 60]
    Distance_Skills[63] = ["Energy Ball", 7, 4, 5, 60]
    Distance_Skills[67] = ["Energy Ball", 3, 4, 5, 60]
    Distance_Skills[71] = ["Energy Ball", 2, 4, 5, 60]
    Distance_Skills[73] = ["Energy Ball", 1, 4, 5, 60]
    Distance_Skills[75] = ["Energy Ball", 4, 4, 5, 60]
    Distance_Skills[77] = ["Energy Ball", 3, 4, 5, 60]
    Distance_Skills[79] = ["Energy Ball", 5, 4, 5, 60]
    #------------------------------------------------------------------------------
    # Abilità con animazioni
    # Per creare un'abiltà con animazione copiare: Animate_Skills[X] = ["Y", Z] e impostare:
    # X:ID della skill nel database e Y per il prefisso del nome del chara che raffigura 
    #l'eroe che utilizza l'abilità (per esempio se il chara del protagonista si chiama "Actor3", il chara 
    #del protagonista che usa la skill si dovrà chiamare "Actor3_preffisso", quel prefisso dovrete 
    #inserirlo al posto della Y), e Z per l'idice del Chara
    Animate_Skills = {}
    Animate_Skills[0] = ["_prefisso", 0]
    #------------------------------------------------------------------------------
    # Oggetti utilizabili a distanza
    # Per creare un oggetto utilizzabile a distanza copiare: Distance_Items[U] = [V, W, X, Y, Z] e impostare:
    # U:ID dell'oggetto, V:Chara dell'oggetto, W:Indice del Chara, X:Velocità, Y:Distanza, Z:Tempo da aspettare prima di compiere un altro attacco.
    Distance_Items = {}
    Distance_Items[16] = ["Energy Ball", 0, 5, 5, 30]
    Distance_Items[18] = ["Energy Ball", 7, 5, 5, 30]
    Distance_Items[20] = ["Energy Ball", 3, 5, 5, 30]
    #------------------------------------------------------------------------------
    #  Oggeti con animazioni
    # Per creare un oggetto con animazione copiare: Animate_Items[X] = ["Y", Z] e impostare:
    # X:ID dell'oggetto nel database e Y per il prefisso del nome del chara che raffigura 
    #l'eroe che usa l'oggetto (per esempio se il chara del protagonista si chiama "Actor3", il chara 
    #del protagonista che usa l'oggetto si dovrà chiamare "Actor3_preffisso", quel prefisso dovrete 
    #inserirlo al posto della Y), e Z per l'idice del Chara
    Animate_Items = {}
    Animate_Items[0] = ["_UsingItem", 0]
    #------------------------------------------------------------------------------
    #  Animazio per l'utilizzo di uno scudo
    # Per creare l'animazione dell'eroe che usa uno scudo copiare: Animate_Shields[X] = ["Y", Z] e impostare:
    # X:ID dello scudo nel database e Y per il prefisso del nome del chara che raffigura 
    #l'eroe che usa lo scudo (per esempio se il chara del protagonista si chiama "Actor3", il chara 
    #del protagonista che usa lo scudo si dovrà chiamare "Actor3_preffisso", quel prefisso dovrete 
    #inserirlo al posto della Y), e Z per l'idice del Chara
    Shields = {}
    Shields[1] = ["_attescudo", 0]
    #------------------------------------------------------------------------------
    # Oggetti, armi e armature perse dai nemici
    # Per creare il grafico di un oggetto, arma o armatura che viene perso da un nemico sconfitto copiare: Items_Drop[X] = ["Y",Z] e impostare:
    # X per l'ID dell'oggetto, arma o armatura nel database, Y per il chara dell'oggetto, arma o armatura e Z per l'idice del chara
    Items_Drop = {}
    Items_Drop[1] = ["Potions",0]
    Items_Drop[2] = ["Potions",0]
    Items_Drop[4] = ["Potions",1]
    
    Weapons_Drop = {}
    Weapons_Drop[0] = ["",0]
    
    Armors_Drop = {}
    Armors_Drop[0] = ["",0]
    #------------------------------------------------------------------------------
    Drop_Duration_Time = 450 # Tempo per cui l'oggetto rimane a terra prima di scomparire
    Drop_Item_SE = "DropItem" # Suono per l'oggetto che cade
    Drop_Money_SE = "DropMoney" # Suono per il denaro che cade
    Get_Reward_SE = "GetReward" # Suono udibile quando si raccoglie il denaro o un oggetto, arma o armatura
    
    Gold_Drop = ["$Gold",0] # Chara del denaro quando cade
    Default_Items_Drop = ["$Box",0] # Chara standard di un oggetto che cade
    Default_Weapons_Drop = ["$Box",0] # Chara standard di un'arma che cade
    Default_Armors_Drop = ["$Box",0] # Chara standard di un'armatura che cade
    #------------------------------------------------------------------------------
    # Animazione quando l'eroe passa di livello .
    # Il numero dopo LevelUp_animation indica l'ID nel database dell'animazione da visualizzare quando l'ero sale di livello.
    LevelUp_Animation = 40
    #------------------------------------------------------------------------------
    # Animazioni dei nemici
    # Copiare  Enemy_animations[X] = [Y, Z] e impostare:
    # X per l'ID del nemico, Y per l'ID dell'animazione d'attacco del nemico, e Z per l'ID dell'animazione da visualizzare alla morte del nemico.
    Enemy_animations = {}
    Enemy_animations[1] = [0,56]
    Enemy_animations[2] = [13,56]
    Enemy_animations[3] = [19,56]
    Enemy_animations[4] = [0,56]
    Enemy_animations[32] = [13,82]
    #------------------------------------------------------------------------------
    end
    #==============================================================================
    
    #------------------------------------------------------------------------------
    # Game Character
    #------------------------------------------------------------------------------
    class Game_Character
     alias crissaegrim_abs_gchar_initialize initialize
     alias crissaegrim_abs_gchar_update update
     attr_accessor :damage
     attr_accessor :critical
     def initialize
    crissaegrim_abs_gchar_initialize
    @damage = nil
    @critical = false
     end
     def update
    crissaegrim_abs_gchar_update
    $scene = Scene_Gameover.new if $game_party.members[0].dead?
     end
     def move_toward(object)
    sx = distance_x_from(object)
    sy = distance_y_from(object)
    if sx != 0 or sy != 0
      if sx.abs > sy.abs
    	sx > 0 ? move_left : move_right
    	if @move_failed and sy != 0
    	  sy > 0 ? move_up : move_down
    	end
      else
    	sy > 0 ? move_up : move_down 
    	if @move_failed and sx != 0
    	  sx > 0 ? move_left : move_right
    	end
      end
    end
     end
     def distance_x_from(object)
    sx = @x - object.x
    if $game_map.loop_horizontal?
      if sx.abs > $game_map.width / 2
    	sx -= $game_map.width
      end
    end
    return sx
     end
     def distance_y_from(object)
    sy = @y - object.y
    if $game_map.loop_vertical?
      if sy.abs > $game_map.height / 2
    	sy -= $game_map.height
      end
    end
    return sy
     end
     def in_range?(element, object, range)
    x = (element.x - object.x) * (element.x - object.x)
    y = (element.y - object.y) * (element.y - object.y)
    r = x + y
    return true if r <= (range * range)
    return false
     end
     def in_direction?(element, object)
    return true if element.direction == 2 and object.y >= element.y and object.x == element.x
    return true if element.direction == 4 and object.x <= element.x and object.y == element.y
    return true if element.direction == 6 and object.x >= element.x and object.y == element.y
    return true if element.direction == 8 and object.y <= element.y and object.x == element.x
    return false
     end 
    end
    
    #------------------------------------------------------------------------------
    # Game Event
    #------------------------------------------------------------------------------
    class Game_Event < Game_Character
     attr_reader :in_battle
     attr_reader :enemy_called
     attr_reader :kill_weapon
     attr_reader :kill_skill
     attr_reader :kill_item
     attr_accessor :life
     attr_accessor :mana
     attr_accessor :skill_id
     attr_accessor :deffending
     alias crissaegrim_abs_gevent_initialize initialize
     alias crissaegrim_abs_gevent_update update
     alias crissaegrim_abs_gevent_refresh refresh
     def initialize(map_id, event)   
    #AGGIUNTA--------------------------------------------------------------
    @chara_name_E = ""
    @anime_attack_time_E = 0
    @suffix = "_attacco"
    #AGGIUNTA--------------------------------------------------------------
    @enemy_id = 0
    @life = 0
    @mana = 0
    @attack_time = 0
    @in_battle = false
    @deffending = false
    crissaegrim_abs_gevent_initialize(map_id, event)
     end
     def update
    if @in_battle and @life > 0
      make_attack($data_enemies[@enemy_id])
    elsif @in_battle and @life <= 0
      kill_enemy
    end
    @attack_time -= 1 if @attack_time > 0
    #AGGIUNTA--------------------------------------------------------------
    @anime_attack_time_E -= 1 if @anime_attack_time_E  > 0
    self.agg_anim
    #AGGIUNTA--------------------------------------------------------------
    crissaegrim_abs_gevent_update
     end
     def refresh
    crissaegrim_abs_gevent_refresh	
    @in_battle = false
    @enemy_id = check_comment("Enemy")
    @follow_distance = check_comment("Follow")
    @erase = check_com("Die Erase")
    @switch_local_a = check_com("Die Switch Local A")
    @switch_local_b = check_com("Die Switch Local B")
    @switch_local_c = check_com("Die Switch Local C")
    @switch_local_d = check_com("Die Switch Local D")
    @switch = check_comment("Die Switch")
    @variable = check_comment("Die Variable")
    @kill_weapon = check_comment("Kill Weapon")
    @kill_skill = check_comment("Kill Skill")
    @kill_item = check_comment("Kill Item")
    if @enemy_id > 0
    #AGGIUNTA--------------------------------------------------------------
      @chara_name_E = @character_name
      @chara_name_E.slice!(@suffix)
    #AGGIUNTA--------------------------------------------------------------
      @in_battle = true
      @enemy_called = GameABS_Enemy.new(@enemy_id)
      @life = @enemy_called.maxhp if @life <= 0
      @mana = @enemy_called.maxmp if @mana <= 0
    end
     end
    #AGGIUNTA--------------------------------------------------------------
     def agg_anim(anime_E=0)
    @anime_attack_time_E = anime_E if anime_E > 0
    if @character_name == @chara_name_E+@suffix and @anime_attack_time_E <= 0
      @character_name = @chara_name_E
      @step_anime = false
    elsif @character_name == @chara_name_E and @anime_attack_time_E > 0
      @character_name = @chara_name_E+@suffix
      @step_anime = true
    end
     end
    #AGGIUNTA--------------------------------------------------------------
     def make_attack(enemy)
    return false if $game_map.interpreter.running?
     for action in enemy.actions
       @ranting = action.rating if @attack_time <= 0
       next if enemy_pre_attack(@enemy_called, action)
       case action.kind
       when 0
    	 case action.basic
    	 when 0
    	   attack_normal
    	 when 1
    	   @deffending = true
    	 end
       when 1
    	 @skill_id = action.skill_id
    	 next if $data_skills[action.skill_id] == nil
    	 case $data_skills[action.skill_id].scope
    	 when 1..6
    	   if Crissaegrim_ABS::Distance_Skills.has_key?(action.skill_id)
    		 see_range = Crissaegrim_ABS::Distance_Skills[action.skill_id][3]
    		 if @direction == 2 and $game_player.x == @x and $game_player.y <= (@y + see_range) and $game_player.y > @y
    		   skill_range
    		 elsif @direction == 4 and $game_player.x >= (@x - see_range) and $game_player.x < @x and $game_player.y == @y
    		   skill_range
    		 elsif @direction == 6 and $game_player.x <= (@x + see_range) and $game_player.x > @x and $game_player.y == @y
    		   skill_range
    		 elsif @direction == 8 and $game_player.x == @x and $game_player.y >= (@y - see_range) and $game_player.y < @y
    		   skill_range
    		 elsif action.rating == 10
    		   skill_range
    		 end
    	   else
    		 skill_normal
    	   end
    		when 7..11
    		  skill_recover
    		end
    	  end
    	end
      end
      def enemy_pre_attack(enemy, action)
       case action.condition_type
       when 1
    	 n = $game_troop.turn_count
    	 a = action.condition_param1
    	 b = action.condition_param2
    	 return false if (b == 0 and n != a)
    	 return false if (b > 0 and (n < 1 or n < a or n % b != a % b))
       when 2
    	 hp_rate = enemy.hp * 100.0 / enemy.maxhp
    	 return false if hp_rate < action.condition_param1
    	 return false if hp_rate > action.condition_param2
       when 3
    	 mp_rate = enemy.mp * 100.0 / enemy.maxmp
    	 return false if mp_rate < action.condition_param1
    	 return false if mp_rate > action.condition_param2
       when 4
    	 return false unless state?(action.condition_param1)
       when 5
    	 return false if $game_party.max_level < action.condition_param1
       when 6
    	 switch_id = action.condition_param1
    	 return false if $game_switches[switch_id] == false
       end
       r = rand(11)
       return true if action.rating < r
       return false
     end
     def attack_normal
       new_x = (@x + (@direction == 4 ? -1 : @direction == 6 ? 1 : 0))
       new_y = (@y + (@direction == 8 ? -1 : @direction == 2 ? 1 : 0))
       guard_x = (@x + ($game_player.direction == 4 ? 1 : $game_player.direction == 6 ? -1 : 0))
       guard_y = (@y + ($game_player.direction == 8 ? 1 : $game_player.direction == 2 ? -1 : 0))
       if $game_player.x == new_x and $game_player.y == new_y and @attack_time <= 0				  
    	 dmg = $game_party.members[0].make_attack_damage_value(@enemy_called)
    	 if Crissaegrim_ABS::Enemy_animations[@enemy_id] != nil and Crissaegrim_ABS::Enemy_animations[@enemy_id][0] != 0
    	   $game_player.animation_id = Crissaegrim_ABS::Enemy_animations[@enemy_id][0]
    	 else
    	   $game_player.animation_id = 1
    	 end
    #AGGIUNTA--------------------------------------------------------------
    	 self.agg_anim($data_animations[$game_player.animation_id].frame_max * 4 + 1)
    #AGGIUNTA--------------------------------------------------------------
    	 if $game_player.deffending == true and $game_player.x == guard_x and $game_player.y == guard_y
    	   $game_player.damage = "Guard"
    	 else
    	   $game_party.members[0].attack_effect(@enemy_called)
    #MODIFICA--------------------------------------------------------------
    	   #$game_player.damage = dmg
    	   #$game_player.jump(0,0)
    #MODIFICA--------------------------------------------------------------
    	 end
    	 @attack_time = 60 - (($data_enemies[@enemy_id].agi / @ranting * 10) / 100)	 
       end
     end
     def skill_normal 
       new_x = (@x + (@direction == 4 ? -1 : @direction == 6 ? 1 : 0))
       new_y = (@y + (@direction == 8 ? -1 : @direction == 2 ? 1 : 0))
       guard_x = (@x + ($game_player.direction == 4 ? 1 : $game_player.direction == 6 ? -1 : 0))
       guard_y = (@y + ($game_player.direction == 8 ? 1 : $game_player.direction == 2 ? -1 : 0))
       if @mana >= $data_skills[@skill_id].mp_cost and $game_player.x == new_x and $game_player.y == new_y and @attack_time <= 0
    	 @mana -= $data_skills[@skill_id].mp_cost
    	 $game_temp.common_event_id = $data_skills[@skill_id].common_event_id if $data_skills[@skill_id].common_event_id > 0
    	 dmg = $game_party.members[0].make_obj_damage_value(@enemy_called, $data_skills[@skill_id])
    	 $game_player.animation_id = $data_skills[@skill_id].animation_id
    #AGGIUNTA--------------------------------------------------------------
    	 self.agg_anim($data_animations[$game_player.animation_id].frame_max * 4 + 1)
    #AGGIUNTA--------------------------------------------------------------
    	 if $game_player.deffending == true and $game_player.x == guard_x and $game_player.y == guard_y and !$data_skills[@skill_id].ignore_defense
    	   $game_player.damage = "Guard"
    	 else
    	   $game_party.members[0].skill_effect(@enemy_called, $data_skills[@skill_id])
    #MODIFICA--------------------------------------------------------------
    	   #$game_player.damage = dmg
    	   #$game_player.jump(0,0)
    #MODIFICA--------------------------------------------------------------
    	 end
    	 @attack_time = 60 - (($data_enemies[@enemy_id].agi / @ranting * 10) / 100)
       end
     end
     def skill_range
       if @mana >= $data_skills[@skill_id].mp_cost and @attack_time <= 0
    	 @mana -= $data_skills[@skill_id].mp_cost
    	 $game_temp.common_event_id = $data_skills[@skill_id].common_event_id if $data_skills[@skill_id].common_event_id > 0
    	 $game_range.push(Game_Range.new(self,Crissaegrim_ABS::Distance_Skills[@skill_id][0],Crissaegrim_ABS::Distance_Skills[@skill_id][1],Crissaegrim_ABS::Distance_Skills[@skill_id][2],Crissaegrim_ABS::Distance_Skills[@skill_id][3]))
    	 @attack_time = Crissaegrim_ABS::Distance_Skills[@skill_id][4]
       end
     end
     def skill_recover
       hp_percent = (@enemy_called.maxhp * 25) / 100
       if @mana >= $data_skills[@skill_id].mp_cost and @life <= hp_percent
    	 @mana -= $data_skills[@skill_id].mp_cost
    	 $game_temp.common_event_id = $data_skills[@skill_id].common_event_id if $data_skills[@skill_id].common_event_id > 0
    	 rec = @enemy_called.make_obj_damage_value(@enemy_called, $data_skills[@skill_id])
    	 @enemy_called.skill_effect(@enemy_called, $data_skills[@skill_id])
    	 @life -= rec
    	 @life = @enemy_called.maxhp if @life > @enemy_called.maxhp
    	 self.damage = rec
    	 @animation_id = $data_skills[@skill_id].animation_id
       end
       @attack_time = 60 - (($data_enemies[@enemy_id].agi / @ranting * 10) / 100)
     end
     def update_self_movement
       if in_range?(self,$game_player,@follow_distance)
    	 return unless movable?
    	 move_toward_player
       elsif @stop_count > 30 * (5 - @move_frequency)
    	 case @move_type
    	 when 1;  move_type_random
    	 when 2;  move_type_toward_player
    	 when 3;  move_type_custom
    	 end
       end
     end
     def movable?
       return false if moving?
       return false if @move_route_forcing
       return true
     end
     def check_comment(comentario)
       com = comentario.downcase
       return 0 if @list.nil? or @list.size <= 0 
       for item in @list
    	 if item.code == 108 or item.code == 408
    	   if item.parameters[0].downcase =~ /#{com}[ ]?(\d+)?/
    		 return $1.to_i
    	   end
    	 end
       end
       return 0
     end
     def check_com(comentario)
       return false if @list.nil? or @list.size <= 0 
       for item in @list
    	 if item.code == 108 or item.code == 408
    	   if item.parameters[0].downcase.include?(comentario.downcase)
    		 return true
    		 end
    	   end
    	 end
       end
    def kill_enemy
     $game_party.members[0].gain_exp(@enemy_called.exp, 1)
     make_drop
     if Crissaegrim_ABS::Enemy_animations[@enemy_id] != nil and Crissaegrim_ABS::Enemy_animations[@enemy_id][1] != 0
    @animation_id = Crissaegrim_ABS::Enemy_animations[@enemy_id][1]
     end
     if @erase == true
    self.erase
     elsif @switch_local_a == true
    key = [$game_map.map_id, self.id, "A"]
     if $game_self_switches[key] == false
    $game_self_switches[key] = true
    elsif $game_self_switches[key] == true
      $game_self_switches[key] = false
    end
     elsif @switch_local_b == true
    key = [$game_map.map_id, self.id, "B"]
    if $game_self_switches[key] == false
      $game_self_switches[key] = true
    elsif $game_self_switches[key] == true
      $game_self_switches[key] = false
    end
     elsif @switch_local_c == true
    key = [$game_map.map_id, self.id, "C"]
    if $game_self_switches[key] == false
      $game_self_switches[key] = true
    elsif $game_self_switches[key] == true
      $game_self_switches[key] = false
    end
     elsif @switch_local_d == true
    key = [$game_map.map_id, self.id, "D"]
    if $game_self_switches[key] == false
      $game_self_switches[key] = true
    elsif $game_self_switches[key] == true
      $game_self_switches[key] = false
    end
     elsif @switch > 0 and
    if $game_switches[@switch] == false
      $game_switches[@switch] = true
    elsif $game_switches[@switch] == true
      $game_switches[@switch] = false
    end
     elsif @variable > 0
    $game_variables[@variable] += 1
     end
     $game_map.need_refresh = true
     refresh
    end
    def make_drop
     for item in make_items1
    next if item == nil
    case item
    when RPG::Item
      graphic = Crissaegrim_ABS::Default_Items_Drop[0]
      index = Crissaegrim_ABS::Default_Items_Drop[1]
      graphic = Crissaegrim_ABS::Items_Drop[item.id][0] if Crissaegrim_ABS::Items_Drop[item.id] != nil
      index = Crissaegrim_ABS::Items_Drop[item.id][1] if Crissaegrim_ABS::Items_Drop[item.id] != nil
      $game_drop.push(Game_Drop.new(self,graphic,index,[item],0))
    when RPG::Weapon
      graphic = Crissaegrim_ABS::Default_Weapons_Drop[0]
      index = Crissaegrim_ABS::Default_Weapons_Drop[1]
      graphic = Crissaegrim_ABS::Weapons_Drop[item.id][0] if Crissaegrim_ABS::Weapons_Drop[item.id] != nil
      index = Crissaegrim_ABS::Weapons_Drop[item.id][1] if Crissaegrim_ABS::Weapons_Drop[item.id] != nil
      $game_drop.push(Game_Drop.new(self,graphic,index,[item],0))
    when RPG::Armor
      graphic = Crissaegrim_ABS::Default_Armors_Drop[0]
      index = Crissaegrim_ABS::Default_Armors_Drop[1]
      graphic = Crissaegrim_ABS::Armors_Drop[item.id][0] if Crissaegrim_ABS::Armors_Drop[item.id] != nil
      index = Crissaegrim_ABS::Armors_Drop[item.id][1] if Crissaegrim_ABS::Armors_Drop[item.id] != nil
      $game_drop.push(Game_Drop.new(self,graphic,index,[item],0))
    end
     end
     for item in make_items2
      next if item == nil
      case item
    when RPG::Item
      graphic = Crissaegrim_ABS::Default_Items_Drop[0]
      index = Crissaegrim_ABS::Default_Items_Drop[1]
      graphic = Crissaegrim_ABS::Items_Drop[item.id][0] if Crissaegrim_ABS::Items_Drop[item.id] != nil
      index = Crissaegrim_ABS::Items_Drop[item.id][1] if Crissaegrim_ABS::Items_Drop[item.id] != nil
      $game_drop.push(Game_Drop.new(self,graphic,index,[item],0))
    when RPG::Weapon
      graphic = Crissaegrim_ABS::Default_Weapons_Drop[0]
      index = Crissaegrim_ABS::Default_Weapons_Drop[1]
      graphic = Crissaegrim_ABS::Weapons_Drop[item.id][0] if Crissaegrim_ABS::Weapons_Drop[item.id] != nil
      index = Crissaegrim_ABS::Weapons_Drop[item.id][1] if Crissaegrim_ABS::Weapons_Drop[item.id] != nil
      $game_drop.push(Game_Drop.new(self,graphic,index,[item],0))
    when RPG::Armor
      graphic = Crissaegrim_ABS::Default_Armors_Drop[0]
      index = Crissaegrim_ABS::Default_Armors_Drop[1]
      graphic = Crissaegrim_ABS::Armors_Drop[item.id][0] if Crissaegrim_ABS::Armors_Drop[item.id] != nil
      index = Crissaegrim_ABS::Armors_Drop[item.id][1] if Crissaegrim_ABS::Armors_Drop[item.id] != nil
      $game_drop.push(Game_Drop.new(self,graphic,index,[item],0))
    end
     end
     if @enemy_called.gold > 0
    $game_drop.push(Game_Drop.new(self,Crissaegrim_ABS::Gold_Drop[0],0,[],self.enemy_called.gold))
     end
    end
    def make_items1
     drop_items = []
     for di in [@enemy_called.drop_item1]
    next if di.kind == 0
    next if rand(di.denominator) != 0
    if di.kind == 1
      drop_items.push($data_items[di.item_id])
    elsif di.kind == 2
      drop_items.push($data_weapons[di.weapon_id])
    elsif di.kind == 3
      drop_items.push($data_armors[di.armor_id])
    end
     end
     return drop_items
    end
    def make_items2
     drop_items = []
     for di in [@enemy_called.drop_item2]
    next if di.kind == 0
    next if rand(di.denominator) != 0
    if di.kind == 1
      drop_items.push($data_items[di.item_id])
    elsif di.kind == 2
      drop_items.push($data_weapons[di.weapon_id])
    elsif di.kind == 3
      drop_items.push($data_armors[di.armor_id])
    end
     end
     return drop_items
    end
    end
    
    #------------------------------------------------------------------------------
    # Game Player
    #------------------------------------------------------------------------------
    class Game_Player < Game_Character
     attr_accessor :deffending
     attr_accessor :assigned_skill
     attr_accessor :assigned_item
     attr_accessor :right_attack
     attr_accessor :left_attack
     attr_accessor :skill_attack
     attr_accessor :item_attack
     alias crissaegrim_abs_gplayer_initialize initialize
     alias crissaegrim_abs_gplayer_update update
     alias crissaegrim_abs_gplayer_perform_transfer perform_transfer
     def initialize
    @old_character_name = @character_name
    @old_character_index = @character_index
    @right_attack_time = 0
    @left_attack_time = 0
    @skill_attack_time = 0
    @item_attack_time = 0
    @anime_attack_time = 0
    @right_attack = false
    @left_attack = false
    @skill_attack = false
    @item_attack = false
    @deffending = false
    crissaegrim_abs_gplayer_initialize
     end
     def update
    crissaegrim_abs_gplayer_update
    @actor = $game_party.members[0]
    $scene = Scene_Gameover.new if @actor.hp <= 0
    @right_attack_time -= 1 if @right_attack_time > 0
    @left_attack_time -= 1 if @left_attack_time > 0
    @skill_attack_time -= 1 if @skill_attack_time > 0
    @item_attack_time -= 1 if @item_attack_time > 0
    @anime_attack_time -= 1 if @anime_attack_time > 0
    if @anime_attack_time <= 0 and @deffending == false
      self.set_graphic($game_actors[$game_party.members[0].id].character_name, $game_actors[$game_party.members[0].id].character_index)
      @step_anime = false
    end
    if Input.trigger?(Crissaegrim_ABS::Right_Attack_Button) and @deffending == false
      @attack_weapon = @actor.weapon_id
      anime_hero_attack if @anime_attack_time <= 0
      if Crissaegrim_ABS::Distance_Weapons.has_key?(@attack_weapon) and @right_attack_time <= 0
    	@right_attack = true
    	@left_attack = false
    	@skill_attack = false
    	@item_attack = false
    	@deffending = false
    	range_attack_right
    	if $game_party.has_item?($data_items[Crissaegrim_ABS::Distance_Weapons[@attack_weapon][5]])
    	  Audio.se_play("Audio/SE/"+Crissaegrim_ABS::Weapon_Shot_SE[@attack_weapon],100,100) if Crissaegrim_ABS::Weapon_Shot_SE[@attack_weapon] != nil or Crissaegrim_ABS::Weapon_Shot_SE[@attack_weapon] != ""
    	else
    	  Sound.play_buzzer
    	end
      else
    	normal_attack_right
      end
    end
    if Input.pressed?(Crissaegrim_ABS::Left_Attack_and_Shield_Button)
      if !@actor.two_swords_style or !@actor.two_hands_legal? and @actor.armor1_id != 0
    	use_shield
    	@deffending = true
      end
    else
      @deffending = false
    end
    if Input.trigger?(Crissaegrim_ABS::Left_Attack_and_Shield_Button) and @deffending == false
      anime_hero_attack
      if @actor.two_swords_style
    	@attack_weapon_and_Shield = @actor.armor1_id
      else
    	@attack_weapon_and_Shield = @actor.weapon_id
      end
      if Crissaegrim_ABS::Distance_Weapons.has_key?(@attack_weapon_and_Shield) and @left_attack_time <= 0
    	@right_attack = false
    	@left_attack = true
    	@skill_attack = false
    	@item_attack = false
    	range_attack_left
    	if $game_party.has_item?($data_items[Crissaegrim_ABS::Distance_Weapons[@attack_weapon_and_Shield][5]])
    	  Audio.se_play("Audio/SE/"+Crissaegrim_ABS::Weapon_Shot_SE[@attack_weapon_and_Shield],100,100) if Crissaegrim_ABS::Weapon_Shot_SE[@attack_weapon_and_Shield] != nil or Crissaegrim_ABS::Weapon_Shot_SE[@attack_weapon_and_Shield] != ""
    	else
    	  Sound.play_buzzer
    	end
      else
    	normal_attack_left
      end
    end
    for button in Crissaegrim_ABS::Skill_Button.keys
    if Input.trigger?(button) and Crissaegrim_ABS::Skill_Button[button] != nil and Crissaegrim_ABS::Skill_Button[button] != 0
      @assigned_skill = Crissaegrim_ABS::Skill_Button[button]
      case $data_skills[@assigned_skill].scope
      when 1
    	if Crissaegrim_ABS::Distance_Skills.has_key?(@assigned_skill)
    	  @right_attack = false
    	  @left_attack = false
    	  @skill_attack = true
    	  @item_attack = false
    	  skill_attack_range
    	else
    	  skill_attack_normal
    	end
      when 2
    	skill_attack_all
      when 7..11
    	skill_recover
      end
    end
     end
     for button in Crissaegrim_ABS::Item_Button.keys
    if Input.trigger?(button) and Crissaegrim_ABS::Item_Button[button] != nil and Crissaegrim_ABS::Item_Button[button] != 0
      @assigned_item = Crissaegrim_ABS::Item_Button[button]
      if Crissaegrim_ABS::Distance_Items.has_key?(@assigned_item)
    	@right_attack = false
    	@left_attack = false
    	@skill_attack = false
    	@item_attack = true
    	item_attack_range
      else
    	case $data_items[@assigned_item].scope
    	when 1..6
    	  item_normal_attack
    	when 7..11
    	  item_recover
    	end
      end
    end
     end
    end
    def normal_attack_right
     if Input.trigger?(Crissaegrim_ABS::Right_Attack_Button)
    @attack_weapon = @actor.weapon_id
    for event in $game_map.events.values
      if event.in_battle
    	new_x = (@x + (@direction == 4 ? -1 : @direction == 6 ? 1 : 0))
    	new_y = (@y + (@direction == 8 ? -1 : @direction == 2 ? 1 : 0))
    	guard_x = (@x + (event.direction == 4 ? 1 : event.direction == 6 ? -1 : 0))
    	guard_y = (@y + (event.direction == 8 ? 1 : event.direction == 2 ? -1 : 0))
    	if event.x == new_x and event.y == new_y and @right_attack_time <= 0
    	  dmg = event.enemy_called.make_attack_damage_value(@actor)
    	  event.animation_id = @actor.atk_animation_id
    	  if event.deffending == true and event.x == guard_x and event.y == guard_y or event.kill_weapon > 0 and @attack_weapon != event.kill_weapon or event.kill_skill > 0 or event.kill_item > 0
    		event.damage = "guard"
    	  else
    		event.enemy_called.attack_effect(@actor)
    		event.life -= dmg
    		event.damage = dmg
    		event.jump(0,0)
    	  end
    	  @right_attack_time = 60 - (@actor.agi / 100)
    	end
      end
    end
     end
    end
    def range_attack_right
     if $game_party.has_item?($data_items[Crissaegrim_ABS::Distance_Weapons[@attack_weapon][5]])
    $game_party.consume_item($data_items[Crissaegrim_ABS::Distance_Weapons[@attack_weapon][5]])
    $game_range.push(Game_Range.new(self,Crissaegrim_ABS::Distance_Weapons[@attack_weapon][0],Crissaegrim_ABS::Distance_Weapons[@attack_weapon][1],Crissaegrim_ABS::Distance_Weapons[@attack_weapon][2],Crissaegrim_ABS::Distance_Weapons[@attack_weapon][3]))
    @right_attack_time = Crissaegrim_ABS::Distance_Weapons[@attack_weapon][4]
     end
    end
    def normal_attack_left
     for event in $game_map.events.values
    if event.in_battle
       new_x = (@x + (@direction == 4 ? -1 : @direction == 6 ? 1 : 0))
       new_y = (@y + (@direction == 8 ? -1 : @direction == 2 ? 1 : 0))
       guard_x = (@x + (event.direction == 4 ? 1 : event.direction == 6 ? -1 : 0))
       guard_y = (@y + (event.direction == 8 ? 1 : event.direction == 2 ? -1 : 0))
      if event.x == new_x and event.y == new_y and @left_attack_time <= 0
    	dmg = event.enemy_called.make_attack_damage_value(@actor)
    	event.animation_id = @actor.atk_animation_id2
    	if event.deffending == true and event.x == guard_x and event.y == guard_y or event.kill_weapon > 0 and @attack_weapon_and_Shield != event.kill_weapon or event.kill_skill > 0 or event.kill_item > 0
    	  event.damage = "guard"
    	else
    	  event.enemy_called.attack_effect(@actor)
    	  event.life -= dmg
    	  event.damage = dmg
    	  event.jump(0,0)
    	end
    	@left_attack_time = 60 - (@actor.agi / 100)
      end
    end
     end
    end
    def range_attack_left
     if $game_party.has_item?($data_items[Crissaegrim_ABS::Distance_Weapons[@attack_weapon_and_Shield][6]])
    $game_party.consume_item($data_items[Crissaegrim_ABS::Distance_Weapons[@attack_weapon_and_Shield][6]])
    $game_range.push(Game_Range.new(self,Crissaegrim_ABS::Distance_Weapons[@attack_weapon_and_Shield][0],Crissaegrim_ABS::Distance_Weapons[@attack_weapon_and_Shield][1],Crissaegrim_ABS::Distance_Weapons[@attack_weapon_and_Shield][2],Crissaegrim_ABS::Distance_Weapons[@attack_weapon_and_Shield][3]))
    @left_attack_time = Crissaegrim_ABS::Distance_Weapons[@attack_weapon_and_Shield][4]
     end
    end
    def skill_attack_normal
     for event in $game_map.events.values
    if event.in_battle
      new_x = (@x + (@direction == 4 ? -1 : @direction == 6 ? 1 : 0))
      new_y = (@y + (@direction == 8 ? -1 : @direction == 2 ? 1 : 0))
      guard_x = (@x + (event.direction == 4 ? 1 : event.direction == 6 ? -1 : 0))
      guard_y = (@y + (event.direction == 8 ? 1 : event.direction == 2 ? -1 : 0))
      if event.x == new_x and event.y == new_y and @skill_attack_time <= 0
    	if @actor.mp >= $data_skills[@assigned_skill].mp_cost and @skill_attack_time <= 0
    	  @actor.mp -= @actor.calc_mp_cost($data_skills[@assigned_skill])
    	  $game_temp.common_event_id = $data_skills[@assigned_skill].common_event_id if $data_skills[@assigned_skill].common_event_id > 0
    	  dmg = event.enemy_called.make_obj_damage_value(@actor, $data_skills[@assigned_skill])
    	  event.animation_id = $data_skills[@assigned_skill].animation_id
    	  if event.deffending == true and event.x == guard_x and event.y == guard_y or event.kill_weapon > 0 or event.kill_skill > 0 or event.kill_item > 0 and !$data_skills[@assigned_skill].ignore_defense
    		event.damage = "guard"
    	  else
    		event.enemy_called.skill_effect(@actor, $data_skills[@assigned_skill])
    		event.life -= dmg
    		event.damage = dmg
    		event.jump(0,0)
    	  end
    	  @skill_attack_time = 60 - (@actor.agi / 100)
    	end
      end
    end
     end
    end
    def skill_attack_range
     if @actor.mp >= $data_skills[@assigned_skill].mp_cost and @skill_attack_time <= 0
    @actor.mp -= @actor.calc_mp_cost($data_skills[@assigned_skill])
    $game_temp.common_event_id = $data_skills[@assigned_skill].common_event_id if $data_skills[@assigned_skill].common_event_id > 0
    $game_range.push(Game_Range.new(self,Crissaegrim_ABS::Distance_Skills[@assigned_skill][0],Crissaegrim_ABS::Distance_Skills[@assigned_skill][1],Crissaegrim_ABS::Distance_Skills[@assigned_skill][2],Crissaegrim_ABS::Distance_Skills[@assigned_skill][3]))
    @skill_attack_time = Crissaegrim_ABS::Distance_Skills[@assigned_skill][4]
     end
    end
    def skill_attack_all
     for event in $game_map.events.values
    if event.in_battle
      if @actor.mp >= $data_skills[@assigned_skill].mp_cost and @skill_attack_time <= 0
    	 @actor.mp -= @actor.calc_mp_cost($data_skills[@assigned_skill])
    	 $game_temp.common_event_id = $data_skills[@assigned_skill].common_event_id if $data_skills[@assigned_skill].common_event_id > 0
    	 dmg = event.enemy_called.make_obj_damage_value(@actor, $data_skills[@assigned_skill])
    	 event.animation_id = $data_skills[@assigned_skill].animation_id
    	 if event.deffending == true and event.x == guard_x and event.y == guard_y or event.kill_weapon > 0 or event.kill_skill > 0 or event.kill_item > 0 and !$data_skills[@assigned_skill].ignore_defense
    	   event.damage = "guard"
    	 else
    	   event.enemy_called.skill_effect(@actor, $data_skills[@assigned_skill])
    	   event.life -= dmg
    	   event.damage = dmg
    	   event.jump(0,0)
    	 end
    	 @skill_attack_time = 60 - (@actor.agi / 100)
       end
     end
      end
    end
    def skill_recover
     if @actor.mp >= $data_skills[@assigned_skill].mp_cost and @skill_attack_time <= 0
    @actor.mp -= @actor.calc_mp_cost($data_skills[@assigned_skill])
    $game_temp.common_event_id = $data_skills[@assigned_skill].common_event_id if $data_skills[@assigned_skill].common_event_id > 0
    dmg = @actor.make_obj_damage_value(@actor, $data_skills[@assigned_skill])
    @actor.skill_effect(@actor, $data_skills[@assigned_skill])
    @animation_id = $data_skills[@assigned_skill].animation_id
    @damage = dmg
    @skill_attack_time = 60 - (@actor.agi / 100)
     end
    end
    def item_normal_attack
     for event in $game_map.events.values
    if event.in_battle
      new_x = (@x + (@direction == 4 ? -1 : @direction == 6 ? 1 : 0))
      new_y = (@y + (@direction == 8 ? -1 : @direction == 2 ? 1 : 0))
      guard_x = (@x + (event.direction == 4 ? 1 : event.direction == 6 ? -1 : 0))
      guard_y = (@y + (event.direction == 8 ? 1 : event.direction == 2 ? -1 : 0))
      if event.x == new_x and event.y == new_y and @item_attack_time <= 0
    	if $game_party.has_item?($data_items[@assigned_item]) and @item_attack_time <= 0
    	  $game_party.lose_item($data_items[@assigned_item],1)
    	  $game_temp.common_event_id = $data_items[@assigned_item].common_event_id if $data_items[@assigned_item].common_event_id > 0
    	  dmg = event.enemy_called.make_obj_damage_value(@actor, $data_items[@assigned_item])
    	  event.animation_id = $data_items[@assigned_item].animation_id
    	if event.deffending == true and event.x == guard_x and event.y == guard_y or event.kill_weapon > 0 or event.kill_skill > 0 or event.kill_item > 0 and !$data_items[@assigned_item].ignore_defense
    	  event.damage = "guard"
    	else
    	  event.enemy_called.item_effect(@actor, $data_items[@assigned_item])
    	  event.life -= dmg
    	  event.damage = dmg
    	  event.jump(0,0)
    	end
    	@item_attack_time = 60 - (@actor.agi / 100)
      end
    end
     end
    end
    end
    def item_attack_range
     if $game_party.has_item?($data_items[@assigned_item]) and @item_attack_time <= 0
    $game_party.lose_item($data_items[@assigned_item],1)
    $game_temp.common_event_id = $data_items[@assigned_item].common_event_id if $data_items[@assigned_item].common_event_id > 0
    $game_range.push(Game_Range.new(self,Crissaegrim_ABS::Distance_Items[@assigned_item][0],Crissaegrim_ABS::Distance_Items[@assigned_item][1],Crissaegrim_ABS::Distance_Items[@assigned_item][2],Crissaegrim_ABS::Distance_Items[@assigned_item][3]))
    @item_attack_time = Crissaegrim_ABS::Distance_Items[@assigned_item][4]
     end
    end
    def item_recover
     if $game_party.has_item?($data_items[@assigned_item]) and @item_attack_time <= 0
    $game_party.lose_item($data_items[@assigned_item],1)
    $game_temp.common_event_id = $data_items[@assigned_item].common_event_id if $data_items[@assigned_item].common_event_id > 0
    dmg = @actor.calc_mp_recovery(@actor, $data_items[@assigned_item]) if $data_items[@assigned_item].mp_recovery > 0
    dmg = @actor.calc_hp_recovery(@actor, $data_items[@assigned_item]) if $data_items[@assigned_item].hp_recovery > 0
    @actor.item_effect(@actor, $data_items[@assigned_item])
    @animation_id = $data_items[@assigned_item].animation_id
    @damage = dmg
    @item_attack_time = 60 - (@actor.agi / 100)
     end
    end
    def anime_hero_attack
     if @attack_weapon != 0 and Crissaegrim_ABS::Animate_Weapons[@attack_weapon] != nil and Crissaegrim_ABS::Animate_Weapons[@attack_weapon] != 0 and Crissaegrim_ABS::Animate_Weapons[@attack_weapon][0] != "" and @anime_attack_time <= 0
    self.set_graphic(@character_name + Crissaegrim_ABS::Animate_Weapons[@attack_weapon][0], Crissaegrim_ABS::Animate_Weapons[@attack_weapon][1])
    @step_anime = true
    @anime_attack_time = 30
     end
    end
    def use_shield
     if Crissaegrim_ABS::Shields[@actor.armor1_id] != nil and Crissaegrim_ABS::Shields[@actor.armor1_id] != 0 and Crissaegrim_ABS::Shields[@actor.armor1_id][0] != ""
    self.set_graphic($game_actors[$game_party.members[0].id].character_name + Crissaegrim_ABS::Shields[@actor.armor1_id][0], Crissaegrim_ABS::Shields[@actor.armor1_id][1])
     end
    end
    def perform_transfer
     crissaegrim_abs_gplayer_perform_transfer
     for range in $game_range
    next if range == nil
    range.destroy = true
     end
     for drop in $game_drop
    next if drop == nil
    drop.destroy = true
     end
    end
    end
    
    #------------------------------------------------------------------------------
    # Game Range
    #------------------------------------------------------------------------------
    class Game_Range < Game_Character
     attr_accessor :draw
     attr_accessor :destroy
     attr_accessor :character_name
     def initialize(parent,chara_name="",chara_index=0,speed=4,range=0)
    super()
    @parent = parent
    @character_name = chara_name
    @character_index = chara_index
    @move_speed = speed
    @range = range
    @step = 0
    moveto(@parent.x,@parent.y)
    pd = @parent.direction
    turn_down if pd == 2
    turn_left if pd == 4
    turn_right if pd == 6
    turn_up if pd == 8
    @destroy = false
    @draw = false
     end
     def update
    super
    return @destroy = true if @step >= @range
    move_route
    check_event_trigger_touch(@x, @y)
     end
     def move_route
    return unless movable?
    d = @direction
    move_down if d == 2
    move_left if d == 4
    move_right if d == 6
    move_up if d == 8
    @step += 1
     end
     def movable?
    return false if moving?
    return false if @move_route_forcing
    return true
     end
     def check_event_trigger_touch(x, y)
    return if @destroy
    for event in $game_map.events.values
      if event.in_battle
    	hurt_hero(@parent) if $game_player.x == x and $game_player.y == y and @parent.is_a?(Game_Event)
    	hurt_enemy_weapon_right(event) if event.x == x and event.y == y and $game_player.right_attack == true and @parent.is_a?(Game_Player)
    	hurt_enemy_weapon_left(event) if event.x == x and event.y == y and $game_player.left_attack == true and @parent.is_a?(Game_Player)
    	hurt_enemy_skill(event) if event.x == x and event.y == y and $game_player.skill_attack == true and @parent.is_a?(Game_Player)
    	hurt_enemy_item(event) if event.x == x and event.y == y and $game_player.item_attack == true and @parent.is_a?(Game_Player)
      end
    end
     end
     def hurt_hero(enemy)
    @destroy = true
    moveto(0,0)
    dmg = $game_party.members[0].make_obj_damage_value(enemy.enemy_called, $data_skills[enemy.skill_id])
    $game_player.animation_id = $data_skills[enemy.skill_id].animation_id
    if $game_player.deffending == true and guard($game_player, enemy) and !$data_skills[enemy.skill_id].ignore_defense
      $game_player.damage = "Guard"
    else
      $game_party.members[0].skill_effect(enemy.enemy_called, $data_skills[enemy.skill_id])
    #MODIFICA--------------------------------------------------------------
      #$game_player.damage = dmg
      #$game_player.jump(0,0)
    #MODIFICA--------------------------------------------------------------
    end
     end
     def hurt_enemy_weapon_right(enemy)
    @destroy = true
    moveto(0,0)
    guard_x = (@x + (enemy.direction == 4 ? 1 : enemy.direction == 6 ? -1 : 0))
    guard_y = (@y + (enemy.direction == 8 ? 1 : enemy.direction == 2 ? -1 : 0))
    dmg = enemy.enemy_called.make_attack_damage_value($game_party.members[0])
    enemy.animation_id = $data_items[Crissaegrim_ABS::Distance_Weapons[$game_party.members[0].weapon_id][5]].animation_id
    if enemy.deffending == true and guard(self, enemy) or enemy.kill_weapon > 0 and $game_party.members[0].weapon_id != enemy.kill_weapon or enemy.kill_skill > 0 or enemy.kill_item > 0
      enemy.damage = "Guard"
    else
      enemy.damage = dmg
      enemy.life -= dmg
      enemy.jump(0,0)
    end
     end
     def hurt_enemy_weapon_left(enemy)
    @destroy = true
    moveto(0,0)
    guard_x = (@x + (enemy.direction == 4 ? 1 : enemy.direction == 6 ? -1 : 0))
    guard_y = (@y + (enemy.direction == 8 ? 1 : enemy.direction == 2 ? -1 : 0))
    dmg = enemy.enemy_called.make_attack_damage_value($game_party.members[0])
    if $game_party.members[0].two_swords_style
      @weapon = $game_party.members[0].armor1_id
    else
      @weapon = $game_party.members[0].weapon_id
    end
    enemy.animation_id = $data_items[Crissaegrim_ABS::Distance_Weapons[@weapon][6]].animation_id
    if enemy.deffending == true and guard(self, enemy) or enemy.kill_weapon > 0 and @weapon != enemy.kill_weapon or enemy.kill_skill > 0 or enemy.kill_item > 0
      enemy.damage = "Guard"
    else
      enemy.damage = dmg
      enemy.life -= dmg
      enemy.jump(0,0)
    end
     end
     def hurt_enemy_skill(enemy)
    @destroy = true
    moveto(0,0)
    guard_x = (@x + (enemy.direction == 4 ? 1 : enemy.direction == 6 ? -1 : 0))
    guard_y = (@y + (enemy.direction == 8 ? 1 : enemy.direction == 2 ? -1 : 0))
    skl = $game_player.assigned_skill
    dmg = enemy.enemy_called.make_obj_damage_value($game_party.members[0], $data_skills[skl])
    enemy.animation_id = $data_skills[skl].animation_id
    if enemy.deffending == true and guard(self, enemy) or enemy.kill_weapon > 0 or enemy.kill_skill > 0 and $game_player.assigned_skill != enemy.kill_skill or enemy.kill_item > 0
      enemy.damage = "Guard"
    else
      enemy.damage = dmg
      enemy.life -= dmg
      enemy.jump(0,0)
    end
     end
     def hurt_enemy_item(enemy)
    @destroy = true
    moveto(0,0)
    guard_x = (@x + (enemy.direction == 4 ? 1 : enemy.direction == 6 ? -1 : 0))
    guard_y = (@y + (enemy.direction == 8 ? 1 : enemy.direction == 2 ? -1 : 0))
    itm = $game_player.assigned_item
    dmg = enemy.enemy_called.make_obj_damage_value($game_party.members[0], $data_items[itm])
    enemy.animation_id = $data_items[itm].animation_id
    if enemy.deffending == true and guard(self, enemy) or enemy.kill_weapon > 0 or enemy.kill_skill > 0 or enemy.kill_item > 0 and $game_player.assigned_item != enemy.kill_item
      enemy.damage = "Guard"
    else
      enemy.damage = dmg
      enemy.life -= dmg
      enemy.jump(0,0)
    end
     end
     def guard(attacker, target)
    if attacker.direction == 2 and target.direction == 8
      return true
    elsif attacker.direction == 4 and target.direction == 6
      return true
    elsif attacker.direction == 6 and target.direction == 4
      return true
    elsif attacker.direction == 8 and target.direction == 2
      return true
    else
      return false
    end
     end
    end
    
    #------------------------------------------------------------------------------
    # Game Drop
    #------------------------------------------------------------------------------
    class Game_Drop < Game_Character
     attr_accessor :draw
     attr_accessor :destroy
     attr_accessor :character_name
     def initialize(parent,chara_name="",chara_index=0,items=[],gold=0)
    super()
    @character_name = chara_name
    @character_index = chara_index
    @items = items
    @gold = gold
    @drop_time = Crissaegrim_ABS::Drop_Duration_Time
    moveto(parent.x,parent.y)
    move_random
    Audio.se_play("Audio/SE/"+Crissaegrim_ABS::Drop_Item_SE,100,100) if Crissaegrim_ABS::Drop_Item_SE != "" and @items != nil
    Audio.se_play("Audio/SE/"+Crissaegrim_ABS::Drop_Money_SE,100,100) if Crissaegrim_ABS::Drop_Money_SE != "" and @gold > 0
    @destroy = false
    @draw = false
     end
     def update
    super
    return if @destroy == true
    if Input.trigger?(Input::C)
      if in_range?($game_player,self,1) and in_direction?($game_player,self)
    	get_reward
      end
    end
    @drop_time -= 1 if @drop_time > 0
    @destroy = true if @drop_time <= 0
     end
     def get_reward
    Audio.se_play("Audio/SE/"+Crissaegrim_ABS::Get_Reward_SE,100,100) if Crissaegrim_ABS::Get_Reward_SE != ""
    $game_party.gain_gold(@gold)
    for item in @items
      case item
      when RPG::Item
    	$game_party.gain_item($data_items[item.id],1)
      when RPG::Weapon
    	$game_party.gain_item($data_weapons[item.id],1)
      when RPG::Armor
    	$game_party.gain_item($data_armors[item.id],1)
      end
    end
    @destroy = true
     end
     def move_random
    return false if moving?
    case rand(3)
    when 0
      move_down
    when 1
      move_left
    when 2
      move_right
    when 3
      move_up
    end
     end
     def check_event_trigger_touch(x, y)
     end
    end
    
    #------------------------------------------------------------------------------
    # Game ABS Enemy
    #------------------------------------------------------------------------------
    class GameABS_Enemy < Game_Battler
     attr_reader   :enemy_id
     def initialize(enemy_id)
    super()
    @enemy_id = enemy_id
    enemy = $data_enemies[@enemy_id]
     end
     def actor?
    return false
     end
     def enemy
    return $data_enemies[@enemy_id]
     end
     def base_maxhp
    return enemy.maxhp
     end
     def base_maxmp
    return enemy.maxmp
     end
     def base_atk
    return enemy.atk
     end
     def base_def
    return enemy.def
     end
     def base_spi
    return enemy.spi
     end
     def base_agi
    return enemy.agi
     end
     def hit
    return enemy.hit
     end
     def eva
    return enemy.eva
     end
     def cri
    return enemy.has_critical ? 10 : 0
     end
     def odds
    return 1
     end
     def element_rate(element_id)
    rank = enemy.element_ranks[element_id]
    result = [0,200,150,100,50,0,-100][rank]
    for state in states
      result /= 2 if state.element_set.include?(element_id)
    end
    return result
     end
     def state_probability(state_id)
    if $data_states[state_id].nonresistance
      return 100
    else
      rank = enemy.state_ranks[state_id]
      return [0,100,80,60,40,20,0][rank]
    end
     end
     def exp
    return enemy.exp
     end
     def gold
    return enemy.gold
     end
     def drop_item1
    return enemy.drop_item1
     end
     def drop_item2
    return enemy.drop_item2
     end
     def use_sprite?
    return true
     end
     def perform_collapse
    if $game_temp.in_battle and dead?
      @collapse = true
      Sound.play_enemy_collapse
    end
     end
     def escape
    @hidden = true
    @action.clear
     end
     def transform(enemy_id)
    @enemy_id = enemy_id
    if enemy.name != @original_name
      @original_name = enemy.name
      @letter = ''
      @plural = false
    end
    @battler_name = enemy.battler_name
    @battler_hue = enemy.battler_hue
    make_action
     end
     def conditions_met?(action)
    case action.condition_type
    when 1
      n = $game_troop.turn_count
      a = action.condition_param1
      b = action.condition_param2
      return false if (b == 0 and n != a)
      return false if (b > 0 and (n < 1 or n < a or n % b != a % b))
    when 2
      hp_rate = hp * 100.0 / maxhp
      return false if hp_rate < action.condition_param1
      return false if hp_rate > action.condition_param2
    when 3
      mp_rate = mp * 100.0 / maxmp
      return false if mp_rate < action.condition_param1
      return false if mp_rate > action.condition_param2
    when 4
      return false unless state?(action.condition_param1)
    when 5
      return false if $game_party.max_level < action.condition_param1
    when 6
      switch_id = action.condition_param1
      return false if $game_switches[switch_id] == false
    end
    return true
     end
     def make_action
    @action.clear
    return unless movable?
    available_actions = []
    rating_max = 0
    for action in enemy.actions
      next unless conditions_met?(action)
      if action.kind == 1
    	next unless skill_can_use?($data_skills[action.skill_id])
      end
      available_actions.push(action)
      rating_max = [rating_max, action.rating].max
    end
    ratings_total = 0
    rating_zero = rating_max - 3
    for action in available_actions
      next if action.rating <= rating_zero
      ratings_total += action.rating - rating_zero
    end
    return if ratings_total == 0
    value = rand(ratings_total)
    for action in available_actions
      next if action.rating <= rating_zero
      if value < action.rating - rating_zero
    	@action.kind = action.kind
    	@action.basic = action.basic
    	@action.skill_id = action.skill_id
    	@action.decide_random_target
    	return
      else
    	value -= action.rating - rating_zero
      end
    end
     end
    end
    
    #------------------------------------------------------------------------------
    # Game Actor
    #------------------------------------------------------------------------------
    class Game_Actor
     alias crissaegrim_abs_change_exp change_exp
     def change_exp(exp, show)
    last_level = @level
    last_skills = skills
    @exp = [[exp, 9999999].min, 0].max
    while @exp >= @exp_list[@level+1] and @exp_list[@level+1] > 0
      level_up
    end
    while @exp < @exp_list[@level]
      level_down
    end
    @hp = [@hp, maxhp].min
    @mp = [@mp, maxmp].min
    if show and @level > last_level
      show_level_up
    end
    crissaegrim_abs_change_exp(exp,show)
     end
     def show_level_up
    $game_player.animation_id = Crissaegrim_ABS::LevelUp_Animation
    $game_party.members[0].hp = $game_party.members[0].maxhp
    $game_party.members[0].mp = $game_party.members[0].maxmp
    $game_player.damage = "Level Up"
     end
     def atk_animation_id2
    if two_swords_style
      return weapons[1] == nil ? 1 : weapons[1].animation_id
    else
      return 1
    end
     end
    end
    
    #------------------------------------------------------------------------------
    # Game Map
    #------------------------------------------------------------------------------
    class Game_Map
     alias crissaegrim_abs_gmap_passable passable?
    def passable?(x, y, flag = 0x01)
     for drop in $game_drop
    next if drop.nil?
    return false if drop.x == x and drop.y == y
     end
     crissaegrim_abs_gmap_passable(x, y, flag = 0x01)
    end
    end
    
    #------------------------------------------------------------------------------
    # Sprite Base
    #------------------------------------------------------------------------------
    class Sprite_Base 
     alias animation animation_set_sprites
     def animation_set_sprites(frame)
    cell_data = frame.cell_data
    for i in 0..15
      sprite = @animation_sprites[i]
      next if sprite == nil
      pattern = cell_data[i, 0]
      if pattern == nil or pattern == -1
    	sprite.visible = false
    	next
      end
      if pattern < 100
    	sprite.bitmap = @animation_bitmap1
      else
    	sprite.bitmap = @animation_bitmap2
      end
      sprite.visible = true
      sprite.src_rect.set(pattern % 5 * 192,
    	pattern % 100 / 5 * 192, 192, 192)
      if @animation_mirror
    	sprite.x = @animation_ox - cell_data[i, 1] / 2
    	sprite.y = @animation_oy - cell_data[i, 2] / 2
    	sprite.angle = (360 - cell_data[i, 4])
    	sprite.mirror = (cell_data[i, 5] == 0)
      else
    	sprite.x = @animation_ox + cell_data[i, 1] / 2
    	sprite.y = @animation_oy + cell_data[i, 2] / 2
    	sprite.angle = cell_data[i, 4]
    	sprite.mirror = (cell_data[i, 5] == 1)
      end
      sprite.z = self.z + 300
      sprite.ox = 96
      sprite.oy = 96
      sprite.zoom_x = cell_data[i, 3] / 200.0
      sprite.zoom_y = cell_data[i, 3] / 200.0
      sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
      sprite.blend_type = cell_data[i, 7]
    end
     end
    end
    
    #------------------------------------------------------------------------------
    # Sprite Character
    #------------------------------------------------------------------------------
    class Sprite_Character < Sprite_Base
     alias crissaegrim_abs_spchar_update update
     alias crissaegrim_abs_spchar_dispose dispose
     def initialize(viewport, character = nil)
    super(viewport)
    @character = character
    @balloon_duration = 0
    @_damage_duration = 0
    update
     end
     def update
    super
    if @_damage_duration > 0
      @_damage_duration -=1
    	@_damage_sprite.x = self.x
    	if @_damage_duration <= 0
    	  dispose_damage
    	end
      end
      if @character != nil and @character.damage != nil
      damage(@character.damage, @character.critical)
      @character.damage = nil
      @character.critical = false
    end
    crissaegrim_abs_spchar_update
     end
     def dispose
    crissaegrim_abs_spchar_dispose
    dispose_damage
     end
     def damage(value, critical)
      dispose_damage
      if value.is_a?(Numeric)
    	damage_string = value.abs.to_s
      else
    	damage_string = value.to_s
      end
      bitmap = Bitmap.new(160, 48)
      bitmap.font.name = "Georgia"
      bitmap.font.size = 22
      bitmap.font.italic = true
      if value.is_a?(Numeric) and value <= 0
    	bitmap.font.color.set(255, 255, 128)
      else
    	bitmap.font.color.set(255, 255, 255)
      end
      bitmap.draw_text(1, 13, 160, 36, damage_string, 1)
      bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
      if critical
    	bitmap.font.color.set(0, 0, 0)
    	bitmap.draw_text(1, 6, 160, 20, "Critical", 1)
    	bitmap.font.color.set(255, 255, 128)
    	bitmap.draw_text(0, 5, 160, 20, "Critical", 1)
      end
      @_damage_sprite = ::Sprite.new(self.viewport)
      @_damage_sprite.bitmap = bitmap
      @_damage_sprite.ox = 80
      @_damage_sprite.oy = 20
      @_damage_sprite.x = self.x
      @_damage_sprite.y = self.y - self.oy / 2 - 40
      @_damage_sprite.z += 99999
      @_damage_duration = 30
    end
    def show_text(string, size=16, color=0)
      dispose_damage
      damage_string = string
      if string.is_a?(Array)
    	array = true
      else
    	array = false
      end
      bitmap = Bitmap.new(160, 48)
      bitmap.font.name = "Georgia"
      bitmap.font.size = size
      bitmap.font.italic = true
      if array
    	for i in 0..string.size
    	  next if damage_string[i] == nil
    	  bitmap.font.color.set(96, 96-20, 0) if color == 0
    	  bitmap.font.color.set(0, 0, 0) if color != 0 
    	  bitmap.draw_text(-1, (12+(16*i)-1)-16, 160, 36, damage_string[i], 1)
    	  bitmap.draw_text(+1, (12+(16*i)-1)-16, 160, 36, damage_string[i], 1)
    	  bitmap.draw_text(-1, (12+(16*i)+1)-16, 160, 36, damage_string[i], 1)
    	  bitmap.draw_text(+1, (12+(16*i)+1)-16, 160, 36, damage_string[i], 1)
    	  bitmap.font.color.set(255, 245, 155) if color == 0
    	  bitmap.font.color.set(144, 199, 150) if color == 1
    	  bitmap.font.color.set(197, 147, 190)if color == 2
    	  bitmap.font.color.set(138, 204, 198)if color == 3
    	  bitmap.draw_text(0, (12+(16*i))-16, 160, 36, damage_string[i], 1)
    	end
      else
    	bitmap.font.color.set(96, 96-20, 0) if color == 0
    	bitmap.font.color.set(0, 0, 0) if color != 0 
    	bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
    	bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
    	bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
    	bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
    	bitmap.font.color.set(255, 245, 155) if color == 0
    	bitmap.font.color.set(144, 199, 150) if color == 1
    	bitmap.font.color.set(197, 147, 190)if color == 2
    	bitmap.font.color.set(138, 204, 198)if color == 3
    	bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
      end
      @_damage_sprite = ::Sprite.new(self.viewport)
      @_damage_sprite.bitmap = bitmap
      @_damage_sprite.ox = 80
      @_damage_sprite.oy = 20
      @_damage_sprite.x = self.x
      @_damage_sprite.y = self.y - self.oy / 2
      @_damage_sprite.z = 3000
      @_damage_duration = 30
    end 
    def dispose_damage
    if @_damage_sprite != nil
      @_damage_sprite.dispose
      @_damage_sprite = nil
    end
     end
    end
    
    #------------------------------------------------------------------------------
    # Spriteset Map
    #------------------------------------------------------------------------------
    class Spriteset_Map
     alias crissaegrim_abs_sp_map_create_characters create_characters
     alias crissaegrim_abs_sp_map_update_characters update_characters
     alias crissaegrim_abs_sp_map_dispose dispose
     def create_characters
    @range_sprites = []
    for range in $game_range
      next if range == nil
      @range_sprites.push(Sprite_Character.new(@viewport1,range))
    end
    @drop_sprites = []
    for drop in $game_drop
      next if drop == nil
      @drop_sprites.push(Sprite_Character.new(@viewport1,drop))
    end
    crissaegrim_abs_sp_map_create_characters
     end
     def update_characters
    crissaegrim_abs_sp_map_update_characters
    for range in @range_sprites
      next if range == nil
      range.update
    end
    for drop in @drop_sprites
      next if drop == nil
      drop.update
    end
    for range in $game_range
      next if range == nil
      if range.draw == false
    	@range_sprites.push(Sprite_Character.new(@viewport1,range))
    	range.draw = true
      end
      if range.destroy == true
    	$game_range.delete(range)
    	range.character_name = ""
      end
    end
    for drop in $game_drop
      next if drop == nil
      if drop.draw == false
    	@drop_sprites.push(Sprite_Character.new(@viewport1,drop))
    	drop.draw = true
      end
      if drop.destroy == true
    	$game_drop.delete(drop)
    	drop.character_name = "" 
      end
    end
     end
     def dispose
    for range in @range_sprites
      next if range == nil
      range.dispose
    end
    for drop in @drop_sprites
      next if drop == nil
      drop.dispose
    end
    crissaegrim_abs_sp_map_dispose
     end
    end
    
    #------------------------------------------------------------------------------
    # Scene Map
    #------------------------------------------------------------------------------
    class Scene_Map < Scene_Base
     alias crissaegrim_abs_smap_update update
     def update
    for range in $game_range
      next if range == nil
      range.update
    end
    for drop in $game_drop
      next if drop == nil
      drop.update
    end
    crissaegrim_abs_smap_update
     end
    end
    
    #------------------------------------------------------------------------------
    # Scene File
    #------------------------------------------------------------------------------
    class Scene_File < Scene_Base
     alias crissaegrim_abs_sfile_write_save_data write_save_data
     alias crissaegrim_abs_sfile_read_save_data read_save_data
     def write_save_data(file)
    crissaegrim_abs_sfile_write_save_data(file)
    Marshal.dump($game_range,		 file)
    Marshal.dump($game_drop,		 file)
     end
     def read_save_data(file)
    crissaegrim_abs_sfile_read_save_data(file)
    $game_range		 = Marshal.load(file)
    $game_drop		  = Marshal.load(file)
     end
    end
    
    #------------------------------------------------------------------------------
    # Scene Title
    #------------------------------------------------------------------------------
    class Scene_Title < Scene_Base
     alias crissaegrim_abs_scenetitle_command_new_game command_new_game
     def command_new_game
    $game_range = []
    $game_drop = []
    crissaegrim_abs_scenetitle_command_new_game
     end
    end
    
    #------------------------------------------------------------------------------
    # Window Skill
    #------------------------------------------------------------------------------
    class Window_Skill < Window_Selectable
     def update_help
    if $skill_lock_description <= 0
      @help_window.set_text(skill == nil ? "" : skill.description)
    else
      @help_window.set_text(skill == nil ? "" : "Skill Memorizada!")
    end
     end
    end
    class Scene_Skill < Scene_Base
     alias crissaegrim_abs_sskill_start start
     alias crissaegrim_abs_sskill_update update
     alias crissaegrim_abs_sskill_update_skill_selection update_skill_selection
     alias crissaegrim_abs_sitem_use_skill_nontarget use_skill_nontarget
     def start
    $skill_lock_description = 0
    crissaegrim_abs_sskill_start
     end
     def update
    crissaegrim_abs_sskill_update
    $skill_lock_description -= 1 if $skill_lock_description > 0
     end
     def update_skill_selection
    for button in Crissaegrim_ABS::Skill_Button.keys
      if Input.trigger?(button)
    	Sound.play_decision
    	Crissaegrim_ABS::Skill_Button[button] = @skill_window.skill.id
    	$skill_lock_description = 120
      end
    end
    crissaegrim_abs_sskill_update_skill_selection
     end
     def use_skill_nontarget
    return if @skill.scope == 1 or
    @skill.scope == 2 or
    @skill.scope == 3 or
    @skill.scope == 4 or
    @skill.scope == 5 or
    @skill.scope == 6 or
    crissaegrim_abs_sitem_use_skill_nontarget
     end
    end
    
    #------------------------------------------------------------------------------
    # Window Item
    #------------------------------------------------------------------------------
    class Window_Item < Window_Selectable
     alias crissaegrim_abs_witem_initialize initialize
     def initialize(x, y, width, height)
    $item_lock_description = 0
    crissaegrim_abs_witem_initialize(x, y, width, height)
     end
     def update_help
    if $item_lock_description <= 0
    @help_window.set_text(item == nil ? "" : item.description)
     else
    @help_window.set_text(item == nil ? "" : "Item Memorizado!")
     end
    end
    end
    class Scene_Item < Scene_Base
     alias crissaegrim_abs_sitem_start start
     alias crissaegrim_abs_sitem_update update
     alias crissaegrim_abs_sitem_update_item_selection update_item_selection
     alias crissaegrim_abs_sitem_use_item_nontarget use_item_nontarget
     def start
    $item_lock_description = 0
    crissaegrim_abs_sitem_start
     end
     def update
    crissaegrim_abs_sitem_update
    $item_lock_description -= 1 if $item_lock_description > 0
     end
     def update_item_selection
    for button in Crissaegrim_ABS::Item_Button.keys
      if Input.trigger?(button)
    	Sound.play_decision
    	Crissaegrim_ABS::Item_Button[button] = @item_window.item.id
    	$item_lock_description = 120
      end
    end
    crissaegrim_abs_sitem_update_item_selection
     end
     def use_item_nontarget
    return if @item.scope == 1 or
    @item.scope == 2 or
    @item.scope == 3 or
    @item.scope == 4 or
    @item.scope == 5 or
    @item.scope == 6 or
    crissaegrim_abs_sitem_use_item_nontarget
     end
    end
    
    #------------------------------------------------------------------------------
    # Fine dell' ABS
    #------------------------------------------------------------------------------

     

     

     

     

     

    Qui le parti di codice che ho aggiunto/modificato( il numero della riga fa riferimento a quello che ho appena messo su ):

     

    da 238 a 242 ( volendo puoi modificare la stringa "_attacco" per cambiare il nome del charaset per l'attacco; attualmente quindi deve essere "nomecharset.png" quello normale, e "nomecharset_attacco.png" quello per l'attacco )

    #AGGIUNTA--------------------------------------------------------------
    @chara_name_E = ""
    @anime_attack_time_E = 0
    @suffix = "_attacco"
    #AGGIUNTA--------------------------------------------------------------

     

    da 258 a 261

    #AGGIUNTA--------------------------------------------------------------
    @anime_attack_time_E -= 1 if @anime_attack_time_E  > 0
    self.agg_anim
    #AGGIUNTA--------------------------------------------------------------

     

    da 280 a 283

    #AGGIUNTA--------------------------------------------------------------
      @chara_name_E = @character_name
      @chara_name_E.slice!(@suffix)
    #AGGIUNTA--------------------------------------------------------------

     

    da 290 a 301

    #AGGIUNTA--------------------------------------------------------------
     def agg_anim(anime_E=0)
    @anime_attack_time_E = anime_E if anime_E > 0
    if @character_name == @chara_name_E+@suffix and @anime_attack_time_E <= 0
      @character_name = @chara_name_E
      @step_anime = false
    elsif @character_name == @chara_name_E and @anime_attack_time_E > 0
      @character_name = @chara_name_E+@suffix
      @step_anime = true
    end
     end
    #AGGIUNTA--------------------------------------------------------------

     

    da 382 a 384 ( il valore tra parentesi tonde indica la durata della posa d'attacco che ho deciso di mettere pari alla durata dell'animazione d'attacco; puoi mettere qualsivoglia valore numerico )

    #AGGIUNTA--------------------------------------------------------------
    	 self.agg_anim($data_animations[$game_player.animation_id].frame_max * 4 + 1)
    #AGGIUNTA--------------------------------------------------------------

     

    da 389 a 392 ( commentando queste righe ho tolto il mostra danni e il salto per l'eroe )

    #MODIFICA--------------------------------------------------------------
    	   #$game_player.damage = dmg
    	   #$game_player.jump(0,0)
    #MODIFICA--------------------------------------------------------------

     

    da 407 a 409

    #AGGIUNTA--------------------------------------------------------------
    	 self.agg_anim($data_animations[$game_player.animation_id].frame_max * 4 + 1)
    #AGGIUNTA--------------------------------------------------------------

     

    da 414 a 417 ( commentando queste righe ho tolto il mostra danni e il salto per l'eroe )

    #MODIFICA--------------------------------------------------------------
    	   #$game_player.damage = dmg
    	   #$game_player.jump(0,0)
    #MODIFICA--------------------------------------------------------------

     

    da 1013 a 1016 ( commentando queste righe ho tolto il mostra danni e il salto per l'eroe )

    #MODIFICA--------------------------------------------------------------
      #$game_player.damage = dmg
      #$game_player.jump(0,0)
    #MODIFICA--------------------------------------------------------------

     

     

    L'animazione d'attacco del nemico si vedrà solo in due casi: quando esegue un attacco normale e quando esegue una skill(abilità) normale.

    Non l'ho fatto ad esempio per quando esegue skill ad ampio raggio o altro( se non sbaglio anche l'eroe non ce l'ha in quei casi; anzi, l'eroe non ce l'ha nemmeno per la skill normale ).

     

     

    EDIT: ho corretto il link al topic dello script e alcune parti di codice.

  21. Salve community, come da titolo volevo chiedervi se era possibile ridurre la risoluzione di xp da 640x480 a quella di rpg maker 2003 e 2000. Il motivo è semplice non mi piace proprio vedere il tutto così piccolo, xD. Il problema sarebbe risolvibile ingrandendo tutto, ma ci vuole molto più tempo. Qualcuno sa come fare?

    RPG Maker 2000/3 ha una risoluzione nativa pari a 320*240 raddoppiata a 640*240[ in modalità finestra ( a me funziona anche a schermo intero ) basta premere F5 per poter cambiare tra risoluzione raddoppiata e nativa ].

     

    RPG Maker XP invece lavora direttamente alla risoluzione 640*480, ed è per quello che la dimensione della finestra di un progetto fatto con esso è la stessa di quella di un progetto fatto con RPG Maker 2000/3.

     

    Si nota subito però la differenza(a livello di dettagli) ad esempio, fra un charset per RPG Maker 2000/3 e uno per RPG Maker XP. Infatti per quest'ultimo si ha a disposizione il doppio del numero di pixel rispetto al primo.

    Su schermo quindi una posa di RPG Maker 2000/3 di 24*32 pixel, utilizzerà 48*64 pixel ( viene raddoppiata infatti ), mentre una posa di RPG Maker XP di 48*64 pixel, utilizzerà 48*64 pixel: in entrambi i casi viene occupato lo stesso numero di pixel, ma il primo sarà ovviamente di dettaglio inferiore rispetto al secondo.

     

    Credo di averci girato abbastanza intorno xD

     

     

    Non so il motivo per cui tu voglia vedere "più grande", ma do per scontato che non ti basti semplicemente premere ALT+Invio per giocare a tutto schermo con i progetti di RPG Maker XP.

     

    @Per il discorso fatto all'inizio, una soluzione sarebbe appunto quella di raddoppiare le dimensioni delle risorse per RPG Maker 2000/3( volendo anche quelle per XP ) e usarle in RPG Maker XP. Il programma trattato nel seguente topic dovrebbe automattizare tale processo: http://www.rpg2s.net/forum/index.php?showtopic=10920 .

     

    @Un'altra soluzione sarebbe quella di raddoppiare le dimensioni di ogni elemento grafico presente in una mappa, tramite script. Non conosco il linguaggio di programmazione Ruby, ma ho visto che nel seguente topic un utente ha tranquillamente gestito dinamicamente le dimensioni dell'eroe: http://www.rpg2s.net/forum/index.php?showtopic=13146 , dunque darei per scontato che almeno l'eroe e gli eventi si possano raddoppiare via script. Per gli altri elementi, non saprei.

     

    @Un'altra ancora sarebbe proprio quella di raddoppiare la risoluzione con cui lavora RPG Maker XP: da 640*480 a 1280*960, anche questo via script. Questa soluzione però la scarterei perché non tutti hanno la possibilità di avere una risoluzione del genere, oltre al fatto che potrebbe richiedere maggiori risorse hardware.

  22. Prego, aggiungo solo che gli FPS( di cui è possibile scegliere la posizione in uno dei quattro angoli dello schermo ) vengono mostrati solamente quando il gioco viene visualizzato a "schermo intero"( non posso essere certo che sia così per tutti, da me funziona in tal modo ).

     

    PS: non è necessario "acquistare" la versione completa per questo utilizzo, visto che la demo non è della tipologia "tot giorni di prova", bensì vi sono alcune limitazioni come la possibilità di registrare video solo per pochi secondi.

×
×
  • Create New...