Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
-PacMan- - editor.pas

editor.pas

Caricato da:
Scarica il programma completo

  1. (*Nome modulo:  editor*)
  2. (*Versione:             0.7-beta*)
  3. (*Licenza:              GNU GPL*)
  4. (*Rilascio:             06/09/2010*)
  5. (*Autore:               Francesco Marrone (alias Giarados)*)
  6. (*Descrizione:  modulo contenente l'editor di campo*)
  7.  
  8.  
  9. unit editor;
  10.  
  11. interface
  12.  
  13.         {unica procedura. se utilizzata avvia una nuova sessione dell'editor grafico}
  14.         procedure aneditor;
  15.  
  16. implementation
  17.        
  18.         {per maggiori informazioni a riguardo della classe pulsante si consulti
  19.         la documentazione dell'omonino modulo}
  20.         uses pulsanti,messages,wincrt,wingraph,mura,dos,sysutils;
  21.        
  22.        
  23.         const nome='Pac-Editor   ';             {Titolo delle finestre grafiche}
  24.         CONST NULL='0';                                 {la costante NULL viene utilizzata come input non valido}
  25.        
  26.         {quelli che seguono sono i valori restituibili da getkey}
  27.         const left=1;
  28.         const right=2;
  29.         const up=3;
  30.         const down=4;
  31.        
  32.         const svuota=5;
  33.         const putmuro=6;
  34.         const putcibo=7;
  35.         const putscibo=8;
  36.         const putunpac=9;
  37.         const putungho=10;
  38.         const pos_iniziale_pacman=11;
  39.         const pos_iniziale_fantasma=12;
  40.        
  41.         {la variabile booleana _end fa da flag nella procedura loadmap
  42.         essendo questa una procedura iterativa per stabilire quando vada terminata
  43.         si usa una variabile globale}
  44.         var _end:boolean;
  45.        
  46.         {Attuali e vecchie coordinate del cursore}
  47.         var x_cursore:byte;
  48.         var y_cursore:byte;
  49.         var x_cursore_old:byte;
  50.         var y_cursore_old:byte;
  51.        
  52.         {La mappa su cui si sta lavorando}
  53.         var workingon:string;
  54.        
  55.         {Se alla mappa vengono apportate delle modifiche allora
  56.         modificato diventa true}
  57.         var modificato:boolean;
  58.        
  59.  
  60.         {getkey restituisce una delle costanti sopra dichiarate se
  61.         uno dei tasti viene pressato--altrimenti restituisce il valore 99}
  62.         function getkey():byte;
  63.         var
  64.                 key:char;
  65.         begin
  66.                 if keypressed then
  67.                 begin
  68.                         key:=readkey;
  69.                        
  70.                         case key of
  71.                         chr(72):         getkey:=down;
  72.                         chr(80):         getkey:=up;
  73.                         chr(77):         getkey:=right;
  74.                         chr(75):         getkey:=left;
  75.                        
  76.                         chr(118):        getkey:=svuota;
  77.                         chr(109):        getkey:=putmuro;
  78.                         chr(99):         getkey:=putcibo;
  79.                         chr(115):        getkey:=putscibo;
  80.                         chr(112):        getkey:=putunpac;
  81.                         chr(102):        getkey:=putungho;
  82.                         chr(113):        getkey:=pos_iniziale_pacman;
  83.                         chr(119):        getkey:=pos_iniziale_fantasma;
  84.                         end;
  85.                 end
  86.                 else            getkey:=99;
  87.         end;
  88.        
  89.         {spritetype restituisce una stringa con il nome della cella il cui
  90.         valore è sprite--viene utilizzata in loadmap per stampare a video
  91.         il tipo di cella selezionato dal cursore}
  92.         function spritetype(sprite:smallint):string;
  93.         begin
  94.                 case sprite of
  95.                         cella_vuota:                    spritetype:='Vuoto';
  96.                         cella_muro:                             spritetype:='Muro';
  97.                         cella_cibo:                             spritetype:='Cibo';
  98.                         cella_super_cibo:               spritetype:='Super Cibo';
  99.                         unwalkable_ghosts:              spritetype:='Unw. Ghosts';
  100.                         unwalkable_pacmen:              spritetype:='Unw. Pacmen';
  101.                         pacman:                                 spritetype:='PacMan';
  102.                         ghost:                                  spritetype:='Fantasma';
  103.                 else spritetype:='Fuori Range';
  104.                 end;
  105.         end;
  106.        
  107.         {accendi_cursore accende un cursore rosso alle coordinate ascissa,ordinata}
  108.         procedure accendi_cursore(ascissa,ordinata:integer);
  109.         begin
  110.                 setcolor(red);
  111.                 rectangle((ascissa*dimensione_cella)+1,(ordinata*dimensione_cella)+1,(ascissa*dimensione_cella)+dimensione_cella-3,(ordinata*dimensione_cella)+dimensione_cella-3);
  112.                 rectangle((ascissa*dimensione_cella)+2,(ordinata*dimensione_cella)+2,(ascissa*dimensione_cella)+dimensione_cella-4,(ordinata*dimensione_cella)+dimensione_cella-4);
  113.                 setcolor(black);
  114.         end;
  115.        
  116.         {input_str è una funzione che simula una linea di comando.
  117.         tramite essa si gestisce l'input di stringhe da tastiera.
  118.         a seconda del valore di readingmode la funzione assume comportamenti diversi.
  119.         ordinata è l'ordinata a da cui viene visualizzata la linea di comando}
  120.         function input_str(readingmode:boolean; ordinata:smallint):string;
  121.         var
  122.                 buffer:string;
  123.                 risposta:string[2];
  124.                 bitmap:pointer;
  125.                 f:textfile;
  126.         begin
  127.        
  128.                 {viene fatto uno screenshot della parte di schermo su cui verrà visualizzata
  129.                 la riga di comando}
  130.                 getmem(bitmap,imagesize(0,0,getmaxx,abs(ordinata-getmaxy)));
  131.                 getimage(0,ordinata,getmaxx,getmaxy,bitmap^);
  132.                        
  133.                        
  134.                 SetViewPort(0,ordinata,getmaxx,getmaxy,false);
  135.                
  136.                 clearviewport;
  137.                 setcolor(white);
  138.                 outtextxy(5,ordinata+4,'');
  139.                 writebuf(' > ');
  140.                 readbuf(buffer,0);
  141.                 if readingmode then
  142.                 begin
  143.                         {se è in modalità lettura e il file non esiste allora ritorna un errore}
  144.                         if not thisfileexists(buffer) then
  145.                         begin
  146.                                 clearviewport;
  147.                                 setcolor(red);
  148.                                 outtextxy(5,ordinata+4,'');
  149.                                 if length(buffer)>12 then settextstyle(defaultfont,horizdir,1);
  150.                                 writebuf(' > Error! "'+buffer+'" does not exist!:S');
  151.                                 settextstyle(defaultfont,horizdir,2);
  152.                                 delay(2000);
  153.                                 buffer:=NULL;           {<--costante NULL=Input non valido}
  154.                
  155.                                 setcolor(getbkcolor);
  156.                         end
  157.                         else            {altrimenti se il file esiste stampa a video un messaggio che comunica l'avvenuto caricamento}
  158.                         begin
  159.                                 clearviewport;
  160.                                 setcolor(green);
  161.                                 outtextxy(5,ordinata+4,'');
  162.                                 writebuf(' > File correctly loaded! :) ');
  163.                                 delay(1000);
  164.                                 setcolor(getbkcolor);
  165.                         end;
  166.                 end
  167.                 else    begin           {se è in modalita scrittura...}
  168.                                         if not thisfileexists(buffer) then      {e il file non esiste...allora si preoccupa di crearlo}
  169.                                         begin
  170.                                                 assign(f,buffer);
  171.                                                 rewrite(f);
  172.                                                 write(f,28);
  173.                                                 write(f,' ');
  174.                                                 write(f,28);
  175.                                                 close(f);
  176.                                                 clearviewport;
  177.                                                 setcolor(green);
  178.                                                 outtextxy(5,ordinata+4,'');
  179.                                                 writebuf(' > Done...;)');
  180.                                         end
  181.                                         else    begin   {altrimenti se esiste chiede se si vuole sovrascrivere o no}
  182.                                                                 repeat
  183.                                                                         clearviewport;
  184.                                                                         setcolor(orange);
  185.                                                                         outtextxy(5,ordinata+4,'');
  186.                                                                         writebuf(' > '+buffer+' exists, rewrite? Y/N  ');
  187.                                                                         readbuf(risposta,0);
  188.                                                                 until ((risposta='Y') or (risposta='N') or
  189.                                                                         (risposta='yes') or (risposta='no') or
  190.                                                                         (risposta='y') or (risposta='n'));
  191.                                                                
  192.                                                                 if ((risposta='yes') or (risposta='Y')) then {se la risposta è si allora sovrascrive il file}
  193.                                                                 begin
  194.                                                                         assign(f,buffer);
  195.                                                                         rewrite(f);
  196.                                                                         write(f,28);
  197.                                                                         write(f,' ');
  198.                                                                         write(f,28);
  199.                                                                         close(f);
  200.                                                                         clearviewport;
  201.                                                                         setcolor(green);
  202.                                                                         outtextxy(5,ordinata+4,'');
  203.                                                                         writebuf(' > Done...;)');
  204.                                                                 end
  205.                                                                 else buffer:=NULL;      {altrimenti ritorna un codice di input non valido}
  206.                                                         end;
  207.                                 end;
  208.                                
  209.                 input_str:=buffer;                                                      {<---}
  210.                 delay(500);
  211.                 setviewport(0,0,getmaxx,getmaxy,true);
  212.                 putimage(0,ordinata,bitmap^,normalput);         {viene ripristinato ciò che vi era prima sullo sfondo e liberata la memoria}
  213.                 freemem(bitmap);
  214.         end;
  215.        
  216.         {questa procedura mostra una breve guida all'utilizzo della tastiera
  217.         per editare un file mappa}
  218.         procedure keys;
  219.         var
  220.                 gd,gm:smallint;
  221.                 backtomaimenu:pulsante;         {per info sulla classe pulsante visualizzare l'omonimo modulo}
  222.         begin
  223.                 closegraph;                                             {viene chiusa la finestra grafica da cui è stata chiamata questa procedura}
  224.                 gd:=NoPalette; gm:=mCustom;
  225.                 setwindowsize(360,420);
  226.                 initgraph(gd,gm,nome);
  227.        
  228.                 backtomaimenu.crea(1,   1,      3,      4,      1,      2,'Back');      {si crea il tasto back}
  229.  
  230.                 {ISTRUZIONI PER L'USO DELLA TASTIERA}
  231.                 setcolor(yellow);
  232.                 SetTextStyle(boldfont,HorizDir,5);
  233.                 outtextxy(100,1,'Pac-Keys');
  234.                 SetTextStyle(boldfont,HorizDir,3);
  235.        
  236.                 outtextxy(100,40,'Movimenti');
  237.        
  238.                 SetTextStyle(boldfont,HorizDir,2);
  239.                 outtextxy(10,80,        'Movimento verso l''alto:               Freccia Su');
  240.                 outtextxy(10,100,       'Movimento verso il basso:              Freccia Giù');
  241.                 outtextxy(10,120,       'Movimento verso destra:                Freccia DX');
  242.                 outtextxy(10,140,       'Movimento verso sinistra:              Freccia SX');
  243.                
  244.                 SetTextStyle(boldfont,HorizDir,3);
  245.        
  246.                 outtextxy(100,160,'Modificatori');
  247.        
  248.                 SetTextStyle(boldfont,HorizDir,2);
  249.                
  250.                 outtextxy(10,175,       'Svuota cella:                                  V');
  251.                 outtextxy(10,185,       '       #Rende vuota la cella dal suo contenuto.');
  252.                
  253.                 outtextxy(10,205,       'Crea muro:                                             M');
  254.                 outtextxy(10,215,       '       #Crea un pezzo di muro.');
  255.                
  256.                 outtextxy(10,235,       'Metti cibo:                                            C');
  257.                 outtextxy(10,245,       '       #Del cibo viene posizionato.');
  258.                
  259.                 outtextxy(10,265,       'Metti super cibo:                                      S');
  260.                 outtextxy(10,275,       '       #Del super cibo viene messo.');
  261.                
  262.                 outtextxy(10,295,       'Metti Unwal. Pac:                                      P');
  263.                 outtextxy(10,305,       '       #PacMan non può attraversare queste celle.');
  264.                
  265.                 outtextxy(10,325,       'Metti Unwal. Fan:                                      F');
  266.                 outtextxy(10,335,       '       #I fantasmi non possono attraversare queste');
  267.                 outtextxy(10,345,       '       #celle.');
  268.                
  269.                 outtextxy(10,365,       'Fantasma:                                              W');
  270.                 outtextxy(10,375,       '       #Un fantasma verrà creato qui');
  271.                
  272.                 outtextxy(10,395,       'PacMan  :                                              Q');
  273.                 outtextxy(10,405,       '       #PacMan verrà creato qui');
  274.                 {ISTRUZIONI PER L'USO DELLA TASTIERA}
  275.                
  276.                 while not backtomaimenu.pressato do backtomaimenu.disegna;      {sino a quando back non è premuto disegnalo}
  277.        
  278.                 SetTextStyle(CourierNewFont,HorizDir,2);
  279.                 closegraph;             {chiudi la finestra}
  280.         end;
  281.        
  282.        
  283.         {questa procedura è l'editor vero e proprio..
  284.         essa si occupa di caricare in memoria una mappa
  285.         path e renderla modificabile in tutto e per tutto}
  286.         procedure loadmap(path:string);
  287.         var
  288.                 tmp_map:campo;                          {la mappa viene memorizzata momentaneamente in tmp_map}
  289.                 gd,gm:smallint;
  290.                 allineamentox_campo,allineamentoy_campo:byte;
  291.                 comandi:pulsante;                      
  292.                 incrementax,incrementay:pulsante;
  293.                 decrementax,decrementay:pulsante;
  294.                 _exit:pulsante;
  295.                 save:pulsante;
  296.                 reset:pulsante;
  297.                 clean:pulsante;
  298.                 x_aggiunta,y_aggiunta:string[1];        {per sistemare la formattazione della stringa infos}
  299.                 infos:string;                                           {questa stringa contiene tutti i dati riguardanti la cella su cui si trova il cursore}
  300.                 answer:string[1];
  301.         begin
  302.                 if path<>NULL then {controlla che l'input sia valido}
  303.                 begin
  304.                         closegraph;
  305.                        
  306.                         _end:=false;
  307.                         gd:=NoPalette; gm:=mCustom;
  308.                
  309.                         allineamentox_campo:=0;
  310.                         allineamentoy_campo:=2;
  311.                         tmp_map.crea(allineamentox_campo,allineamentoy_campo,path);
  312.                
  313.                         {si consulti la documentazione per la classe pulsante nell'omonino modulo}
  314.                        
  315.                        
  316.                         {creazione dei tasti}
  317.                         _exit.crea(allineamentox_campo+23,      dimensione_y_campo+allineamentoy_campo+2,       3,      4,      1,      2,'Exit');                     
  318.                         comandi.crea(allineamentox_campo+18,    dimensione_y_campo+allineamentoy_campo+2,       3,      4,      1,      2,'Tasti');
  319.                         clean.crea(allineamentox_campo+13,      dimensione_y_campo+allineamentoy_campo+2,       3,      4,      1,      2,'Clean');
  320.                         reset.crea(allineamentox_campo+8,       dimensione_y_campo+allineamentoy_campo+2,       3,      4,      1,      2,'Reset');
  321.                         save.crea(allineamentox_campo+3,        dimensione_y_campo+allineamentoy_campo+2,       3,      4,      1,      2,'Save');
  322.                         incrementax.crea(dimensione_x_campo+allineamentox_campo+3,      allineamentoy_campo,    2,      2,      1,      2,'+');
  323.                         decrementax.crea(dimensione_x_campo+allineamentox_campo+1,      allineamentoy_campo,    2,      2,      1,      2,'-');
  324.                         incrementay.crea(allineamentox_campo,   dimensione_y_campo+allineamentoy_campo+3,       2,      2,      1,      2,'+');
  325.                         decrementay.crea(allineamentox_campo,   dimensione_y_campo+allineamentoy_campo+1,       2,      2,      1,      2,'-');
  326.  
  327.                         setwindowsize((5+dimensione_x_campo+allineamentox_campo)*dimensione_cella+2,(5+dimensione_y_campo+allineamentoy_campo)*dimensione_cella+2);
  328.                
  329.                         initgraph(gd,gm,nome);
  330.                        
  331.                         {INFOS}
  332.                        
  333.                         {vengono stampati a video i dati iniziali della cella su cui si trova all'inizio il cursore}
  334.                         setviewport(0,0,getmaxx,29,false);
  335.                         clearviewport;
  336.                         settextstyle(boldfont,horizdir,3);
  337.                         if x_cursore<10 then x_aggiunta:=' '
  338.                         else x_aggiunta:='';
  339.                         if y_cursore<10 then y_aggiunta:=' '
  340.                         else y_aggiunta:='';
  341.                        
  342.         {tali dati hanno il formato:
  343.         (X: XX ; Y: YY) Tipo: tipo_cella}                      
  344. infos:='(X: '+x_aggiunta+inttostr(x_cursore)+' ; Y: '+y_aggiunta+inttostr(y_cursore)+')  Tipo: '+spritetype(tmp_map.get_stato_cella(x_cursore,y_cursore,true));
  345.                        
  346.                         setcolor(red);
  347.                         outtextxy(0,0,infos);
  348.                         setcolor(getbkcolor);
  349.                         settextstyle(defaultfont,horizdir,2);
  350.                         setviewport(0,0,getmaxx,getmaxy,true);
  351.                         {INFOS}
  352.                        
  353.                         tmp_map.disegna_mappa(0,0,dimensione_x_campo,dimensione_y_campo,true);
  354.                
  355.                         repeat                          {ciclo principale}
  356.                                 {vengono disegnati i pulsanti}
  357.                                 _exit.disegna;
  358.                                 comandi.disegna;
  359.                                 reset.disegna;
  360.                                 save.disegna;
  361.                                 clean.disegna;
  362.                                 incrementax.disegna;
  363.                                 decrementax.disegna;
  364.                                 incrementay.disegna;
  365.                                 decrementay.disegna;
  366.                                
  367.                                 {viene salvata la vecchia posizione del cursore}
  368.                                 x_cursore_old:=x_cursore;
  369.                                 y_cursore_old:=y_cursore;
  370.                        
  371.  
  372.                                 {si valuta l'input da tastiera}
  373.                                 case getkey of                         
  374.                                 svuota:         begin
  375.                                                                 tmp_map.mod_stato_cella(x_cursore,y_cursore,cella_vuota);
  376.                                                                 tmp_map.disegna_mappa(x_cursore,y_cursore,x_cursore,y_cursore,true);
  377.                                                                 accendi_cursore(x_cursore+allineamentox_campo,y_cursore+allineamentoy_campo);
  378.                                                                 modificato:=true;
  379.                                                         end;
  380.                                                        
  381.                                 putmuro:        begin
  382.                                                                 tmp_map.mod_stato_cella(x_cursore,y_cursore,cella_muro);
  383.                                                                 tmp_map.disegna_mappa(x_cursore,y_cursore,x_cursore,y_cursore,true);
  384.                                                                 accendi_cursore(x_cursore+allineamentox_campo,y_cursore+allineamentoy_campo);  
  385.                                                                 modificato:=true;
  386.                                                         end;
  387.                                                        
  388.                                 putcibo:        begin
  389.                                                                 tmp_map.mod_stato_cella(x_cursore,y_cursore,cella_cibo);
  390.                                                                 tmp_map.disegna_mappa(x_cursore,y_cursore,x_cursore,y_cursore,true);
  391.                                                                 accendi_cursore(x_cursore+allineamentox_campo,y_cursore+allineamentoy_campo);  
  392.                                                                 modificato:=true;
  393.                                                         end;
  394.                                                        
  395.                                 putscibo:       begin
  396.                                                                 tmp_map.mod_stato_cella(x_cursore,y_cursore,cella_super_cibo);
  397.                                                                 tmp_map.disegna_mappa(x_cursore,y_cursore,x_cursore,y_cursore,true);
  398.                                                                 accendi_cursore(x_cursore+allineamentox_campo,y_cursore+allineamentoy_campo);  
  399.                                                                 modificato:=true;
  400.                                                         end;
  401.                                                        
  402.                                 putungho:       begin
  403.                                                                 tmp_map.mod_stato_cella(x_cursore,y_cursore,unwalkable_ghosts);
  404.                                                                 tmp_map.disegna_mappa(x_cursore,y_cursore,x_cursore,y_cursore,true);
  405.                                                                 accendi_cursore(x_cursore+allineamentox_campo,y_cursore+allineamentoy_campo);  
  406.                                                                 modificato:=true;
  407.                                                         end;
  408.                                                        
  409.                                 putunpac:       begin
  410.                                                                 tmp_map.mod_stato_cella(x_cursore,y_cursore,unwalkable_pacmen);
  411.                                                                 tmp_map.disegna_mappa(x_cursore,y_cursore,x_cursore,y_cursore,true);
  412.                                                                 accendi_cursore(x_cursore+allineamentox_campo,y_cursore+allineamentoy_campo);  
  413.                                                                 modificato:=true;
  414.                                                         end;
  415.         pos_iniziale_pacman:    begin
  416.                                                                 tmp_map.mod_stato_cella(x_cursore,y_cursore,pacman);
  417.                                                                 tmp_map.disegna_mappa(x_cursore,y_cursore,x_cursore,y_cursore,true);
  418.                                                                 accendi_cursore(x_cursore+allineamentox_campo,y_cursore+allineamentoy_campo);  
  419.                                                                 modificato:=true;
  420.                                                         end;
  421.         pos_iniziale_fantasma:  begin
  422.                                                                 tmp_map.mod_stato_cella(x_cursore,y_cursore,ghost);
  423.                                                                 tmp_map.disegna_mappa(x_cursore,y_cursore,x_cursore,y_cursore,true);
  424.                                                                 accendi_cursore(x_cursore+allineamentox_campo,y_cursore+allineamentoy_campo);  
  425.                                                                 modificato:=true;
  426.                                                         end;                                           
  427.                                
  428.                                 left:           if x_cursore<>0 then x_cursore:=x_cursore-1;
  429.                                 right:          if x_cursore<>dimensione_x_campo then x_cursore:=x_cursore+1;
  430.                        
  431.                                 up:                     if y_cursore<>dimensione_y_campo then y_cursore:=y_cursore+1;
  432.                                 down:           if  y_cursore<>0 then y_cursore:=y_cursore-1;
  433.                                 end;
  434.                                
  435.                                
  436.                                
  437.                                 delay(10);
  438.                                
  439.                                 {evita che il cursore esca fuori dalla mappa}
  440.                                 if x_cursore>dimensione_x_campo then x_cursore:=dimensione_x_campo;
  441.                                 if y_cursore>dimensione_y_campo then y_cursore:=dimensione_y_campo;
  442.                        
  443.                                 {al cambiare della posizione del cursore cambiano anche i dati della cella
  444.                                 ad esso associata}
  445.                                 if ((y_cursore<>y_cursore_old) or (x_cursore<>x_cursore_old)) then
  446.                                 begin
  447.                                         {INFOS}
  448.                                         setviewport(0,0,getmaxx,29,false);
  449.                                         clearviewport;
  450.                                         settextstyle(boldfont,horizdir,3);
  451.                                         if x_cursore<10 then x_aggiunta:=' '
  452.                                         else x_aggiunta:='';
  453.                                        
  454.                                         if y_cursore<10 then y_aggiunta:=' '
  455.                                         else y_aggiunta:='';
  456.                                        
  457. infos:='(X: '+x_aggiunta+inttostr(x_cursore)+' ; Y: '+y_aggiunta+inttostr(y_cursore)+')  Tipo: '+spritetype(tmp_map.get_stato_cella(x_cursore,y_cursore,true));
  458.                                
  459.                                         setcolor(red);
  460.                                         outtextxy(0,0,infos);
  461.                                         setcolor(getbkcolor);
  462.                                         settextstyle(defaultfont,horizdir,2);
  463.                                         setviewport(0,0,getmaxx,getmaxy,true);
  464.                                         {INFOS}
  465.                        
  466.                                         tmp_map.disegna_mappa(x_cursore_old,y_cursore_old,x_cursore_old,y_cursore_old,true);
  467.                                 end;
  468.                                
  469.                                 {si accende il cursore}
  470.                                 accendi_cursore(x_cursore+allineamentox_campo,y_cursore+allineamentoy_campo);  
  471.                                
  472.                                 {il tasto _exit quando premuto rende true la variabile globale _end e quindi tutte le istanze di questa
  473.                                 procedura vengono interrotte}
  474.                                 if _exit.pressato then _end:=true;
  475.                        
  476.                                 {la pressione del tasto comandi rimanda alla scheda keys}
  477.                                 if comandi.pressato then
  478.                                 begin
  479.                                         keys;
  480.                                         setwindowsize((5+dimensione_x_campo+allineamentox_campo)*dimensione_cella+2,(5+dimensione_y_campo+allineamentoy_campo)*dimensione_cella+2);
  481.                                         initgraph(gd,gm,nome);
  482.                                         tmp_map.disegna_mappa(0,0,dimensione_x_campo,dimensione_y_campo,true);
  483.                                 end;
  484.                                
  485.                                 {se clean è premuto il campo viene svuotato dal suo contenuto e ristampato a video}
  486.                                 if clean.pressato then
  487.                                 begin
  488.                                         tmp_map.svuota_campo;
  489.                                         tmp_map.disegna_mappa(0,0,dimensione_x_campo,dimensione_y_campo,true);
  490.                                         modificato:=true;
  491.                                 end;
  492.                                
  493.                                 {la pressione di reset ripristina la mappa per com'è salvata}
  494.                                 if reset.pressato then
  495.                                 begin
  496.                                         modificato:=false;
  497.                                         loadmap(workingon);
  498.                                 end;
  499.                                
  500.                                 {premendo save la mappa viene esportata..il nome del nuovo file
  501.                                 mappa si ottiene con input_str}
  502.                                 if save.pressato then
  503.                                 begin
  504.                                         if tmp_map.goodmap then
  505.                                         begin
  506.                                                 tmp_map.esporta_mappa(input_str(false,(allineamentoy_campo+dimensione_y_campo+1)*dimensione_cella+2),true);
  507.                                                 modificato:=false;
  508.                                         end
  509.                                         else display('Set pacman and ghosts position!',true,2500,false);
  510.                                 end;
  511.                        
  512.                                 {questo è uno dei nodi principali dell'editor.
  513.                                 se la mappa deve essere ridimensionata tramite la pressione
  514.                                 di uno dei quattro tasti sottostanti si fa come segue:
  515.                                 1- la mappa attuale viene ridimensionata
  516.                                 2- viene esportata in un file temporaneo tmp_map
  517.                                 3- viene richiamata ricorsivamente loadmap sul file tmp_map}
  518.                                 if incrementax.pressato then
  519.                                 begin
  520.                                         tmp_map.scala_campo(1,0);
  521.                                         tmp_map.esporta_mappa('tmp_map',true);
  522.                                         modificato:=true;
  523.                                         loadmap('tmp_map');
  524.                                 end;
  525.                                
  526.                                 if decrementax.pressato then
  527.                                 begin
  528.                                         tmp_map.scala_campo(-1,0);
  529.                                         tmp_map.esporta_mappa('tmp_map',true);
  530.                                         modificato:=true;
  531.                                         loadmap('tmp_map');
  532.                                 end;
  533.                                 if incrementay.pressato then
  534.                                 begin
  535.                                         tmp_map.scala_campo(0,1);
  536.                                         tmp_map.esporta_mappa('tmp_map',true);
  537.                                         modificato:=true;
  538.                                         loadmap('tmp_map');
  539.                                 end;
  540.                                 if decrementay.pressato then
  541.                                 begin
  542.                                         tmp_map.scala_campo(0,-1);
  543.                                         tmp_map.esporta_mappa('tmp_map',true);
  544.                                         modificato:=true;
  545.                                         loadmap('tmp_map');
  546.                                 end;
  547.        
  548.                         {se exit è pressato allora _end diventa true e tutte le istanze di questa procedura si chiudono}
  549.                         until _end;
  550.                        
  551.                         {nel caso in cui sia stata apportata qualche modifica allora viene chiesto se si vuole salvare o meno
  552.                         se la variabile answer assume un valore Y o y allora la mappa viene salvata}
  553.                         if modificato then
  554.                         begin
  555.                                 setviewport(0,(allineamentoy_campo+dimensione_y_campo+1)*dimensione_cella+2,getmaxx,getmaxy,false);
  556.                                
  557.                                 repeat
  558.                                         clearviewport;
  559.                                         outtextxy(5,(allineamentoy_campo+dimensione_y_campo+1)*dimensione_cella+6,'');
  560.                                         setcolor(orange);
  561.                                         writebuf(' > Wanna save the changes? Y/N ');
  562.                                         readbuf(answer,0);
  563.                                 until ((answer='Y') or (answer='N') or (answer='s') or (answer='n'));
  564.                                
  565.                                 if (answer='Y') or (answer='y') then
  566.                                 begin
  567.                                         if tmp_map.goodmap then tmp_map.esporta_mappa(workingon,true)
  568.                                         else    begin
  569.                                                                 _end:=false;
  570.                                                                 setviewport(0,0,getmaxx,getmaxy,true);
  571.                                                                 display('Set pacman and ghosts position!',true,2500,true);
  572.                                                                 modificato:=true;
  573.                                                                 loadmap('tmp_map');
  574.                                                         end;
  575.                                 end;
  576.                                
  577.                                 setcolor(getbkcolor);
  578.                                 setviewport(0,0,getmaxx,getmaxy,true);
  579.                                 modificato:=false;
  580.                         end;
  581.                 end;
  582.         end;
  583.        
  584.        
  585.         {acquisisce il percorso di un file in modalità scrittura
  586.         della funzione input_str. Se tutto fila lisci e strf<>NULL
  587.         allora viene richiamata la procedura loadmap che si preoccupa
  588.         di aprire il nuovo file mappa vuoto di dimensione 28X28}
  589.         procedure newmap;
  590.         var
  591.                 strf:string;
  592.         begin
  593.                 strf:=input_str(false,321);
  594.                 if strf<>NULL then loadmap(strf);
  595.         end;
  596.        
  597.         {menu principale dell'editor
  598.         lo commento poco --> è di facile comprensione}
  599.         procedure menu;
  600.         var
  601.                 new,load,_exit:pulsante;
  602.                 gd,gm:smallint;
  603.                 strf:string;
  604.         begin
  605.                 cleardevice;
  606.                 new.crea(9,7,3,4,1,2,'New');
  607.                 load.crea(9,11,3,4,1,2,'Load');
  608.                 _exit.crea(9,15,3,4,1,2,'Exit');
  609.                 gd:=NoPalette; gm:=mCustom;
  610.                
  611.                 repeat
  612.                         setcolor(white);
  613.                         SetTextStyle(MSSansSerifFont,HorizDir,5);
  614.                         SetTextStyle(BoldFont,HorizDir,5);
  615.                         setcolor(yellow);
  616.                         outtextxy(80,20,nome);
  617.                         setcolor(getbkcolor);
  618.                
  619.                         settextstyle(defaultfont,horizdir,2);
  620.                
  621.                         setcolor(white);
  622.                         line(0,320,350,320);
  623.                         setcolor(getbkcolor);
  624.                
  625.                         new.disegna;
  626.                         delay(10);
  627.                         if new.pressato then
  628.                         begin
  629.                                 newmap;
  630.                                 closegraph;
  631.                                 setwindowsize(350,350);
  632.                                 initgraph(gd,gm,nome);
  633.                         end;
  634.                        
  635.                         load.disegna;
  636.                         delay(10);
  637.                        
  638.                         {alla pressione di load vengono inizializzate tutte le variabili
  639.                         che interessano la procedura load/editor_vero_e_proprio. Infine
  640.                         essa viene lanciata.}
  641.                         if load.pressato then
  642.                         begin
  643.                                 x_cursore:=0;
  644.                                 y_cursore:=0;
  645.                                 x_cursore_old:=0;
  646.                                 y_cursore_old:=0;
  647.                                 strf:=input_str(true,321);
  648.                                 workingon:=strf;
  649.                                 modificato:=false;
  650.                                 loadmap(strf);
  651.                                 _end:=false;
  652.                                 workingon:=NULL;
  653.                                 if strf<>NULL then                      {strf anche se null viene passato a loadmap.
  654.                                                                                         non accade nulla se l'input è NULL}
  655.                                 begin
  656.                                         closegraph;
  657.                                         setwindowsize(350,350);
  658.                                         initgraph(gd,gm,nome);
  659.                                 end;
  660.                         end;
  661.                
  662.                         _exit.disegna;
  663.                         delay(10);
  664.                        
  665.                 until _exit.pressato;
  666.         end;
  667.        
  668.        
  669.         {la procedura ultima che viene chiamata nel main menu del gioco}
  670.         procedure aneditor;
  671.         var
  672.                 gd,gm:smallint;
  673.         begin
  674.                 gd:=NoPalette; gm:=mCustom;
  675.                 setwindowsize(350,350);
  676.                 initgraph(gd,gm,nome);
  677.                
  678.                 menu;
  679.                 closegraph;
  680.         end;
  681.        
  682.  
  683. end.