DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦24dbb9a9b⟧ Ada Source

    Length: 16384 (0x4000)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Serveur, seg_059c4e

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« 
        └─⟦this⟧ 

E3 Source Code



with Text_Io;  
with Asteroide;
with Base;
with Definitions;
use Definitions;
with Tir;
with Vaisseau;


package body Serveur is

    Bid, C : Character := 'C';
    Num_T : Natural := 0;
    Q : Natural range 0 .. 3 := 0;
    Tab_Collision : Definitions.Espace :=
       (others => (others => (Definitions.Rien, 0)));

    Tab_Ptr_Asteroide : array (1 .. 4) of Asteroide.Ptr_Asteroide;
    Tab_Vaisseau : array (1 .. 2) of Vaisseau.Objet;
    Tab_Ptr_Tir : array (1 .. 2) of Tir.Ptr_Tir;


    procedure Inspecter (Acteur1 : in Definitions.Acteur;
                         Pos : in Definitions.Position;
                         Num : in Positive) is
        Acteur2 : Definitions.Cellule;
    begin
        Text_Io.Put_Line ("Acteur1 " & Definitions.Acteur'Image (Acteur1));


        Acteur2 := Tab_Collision (Pos.Colonne, Pos.Ligne);
        Text_Io.Put_Line ("Acteur2 : " &
                          Definitions.Acteur'Image (Acteur2.Nature) & " , " &
                          Integer'Image (Acteur2.Numero));
        --Text_Io.Get (Bid);
        if (Acteur2.Nature = Definitions.Rien) and (Acteur2.Numero = 0) then
            Text_Io.Put_Line ("#######################################rien");
            Asteroide.Deplacer (Tab_Ptr_Asteroide (Num).all);
            Tab_Collision (Pos.Colonne, Pos.Ligne) := (Acteur1, Num);
        else
            if (Acteur2.Nature = Definitions.Ast) or
               (Acteur1 = Definitions.Ast) then
                -- 1 des 2 ou les 2 = Asteroide donc mort des 2 acteurs BOOM !
                Text_Io.Put_Line
                   ("BBBBBBBBBBBBBBOOOOOOOOOOOOOOOOOOOOOOMMMMMMMMMM");

                Tab_Collision (Pos.Colonne, Pos.Ligne) := (Rien, 0);
                if Acteur1 = Ast then
                    Text_Io.Put_Line (" in ++++++++++++++++");

                    Asteroide.Detruire (Tab_Ptr_Asteroide (Num).all);  
                    case Acteur2.Nature is
                        when Ast =>
                            Asteroide.Detruire
                               (Tab_Ptr_Asteroide (Acteur2.Numero).all);  
                        when Vais =>
                            Vaisseau.Detruire (Tab_Vaisseau (Acteur2.Numero));
                        when Definitions.Tir =>
                            Tir.Detruire (Tab_Ptr_Tir (Acteur2.Numero).all);

                        when Definitions.Base =>
                            Base.Detruire (Ma_Base);
                        when others =>
                            null;  
                    end case;

                else
                    Asteroide.Detruire (Tab_Ptr_Asteroide (Acteur2.Numero).all);
                    case Acteur1 is
                        when Ast =>
                            Asteroide.Detruire (Tab_Ptr_Asteroide (Num).all);  
                        when Vais =>
                            Vaisseau.Detruire (Tab_Vaisseau (Num));
                        when Definitions.Tir =>
                            Tir.Detruire (Tab_Ptr_Tir (Num).all);
                        when others =>
                            null; --jamais
                    end case;
                end if;
            else
                if (Acteur2.Nature = Acteur1) then
                    case Acteur1 is
                        when Vais =>
                            Vaisseau.Detruire (Tab_Vaisseau (Num));
                            Vaisseau.Detruire (Tab_Vaisseau (Acteur2.Numero));
                        when Definitions.Tir =>
                            Tir.Detruire (Tab_Ptr_Tir (Num).all);
                            Tir.Detruire (Tab_Ptr_Tir (Acteur2.Numero).all);
                        when others =>
                            null;
                    end case;

                else
                    if (Acteur2.Nature = Definitions.Tir) or
                       (Acteur1 = Definitions.Tir) then
                        if Acteur1 = Definitions.Tir then
                            Tir.Detruire (Tab_Ptr_Tir (Num).all);
                            if Acteur2.Nature = Definitions.Base then
                                Base.Modifier_Niveau_Energie (1, Ma_Base);
                            else
                                Vaisseau.Modifier_Niveau_Energie
                                   (1, Tab_Vaisseau (Acteur2.Numero));
                            end if;
                        else
                            Tir.Detruire (Tab_Ptr_Tir (Acteur2.Numero).all);
                            Vaisseau.Modifier_Niveau_Energie
                               (1, Tab_Vaisseau (Num));
                        end if;
                    else
                        Vaisseau.Modifier_Niveau_Energie
                           (1, Tab_Vaisseau (Num));
                        Base.Modifier_Niveau_Energie (1, Ma_Base);
                    end if;
                end if;
            end if;
        end if;

    end Inspecter;

    task body Serveur is

        Run_Serveur : Boolean := True;
        Pos_Sauve : Definitions.Position;
        Num_Sauve : Integer;

    begin
        accept Go (Position : in Definitions.Position) do
            Tab_Collision (Position.Colonne, Position.Ligne) :=
               (Definitions.Base, 1);
        end Go;

        for I in 1 .. 4 loop
            Tab_Ptr_Asteroide (I) := new Asteroide.Objet;
            accept Ok;
            Text_Io.Put_Line (" Tache aster cree dynamiquement nun : " &
                              Integer'Image (I));
            --Text_Io.Get (Bid);
        end loop;



        Text_Io.Put_Line (" Tache serveur en route ...");

        while Run_Serveur loop
            Text_Io.Put_Line (" Tache serveur en attente de accept ...");
            select
                accept Une_Touche (C : in Character; No : in Integer) do
                    Q := 3;
                    --Text_Io.Put_Line
                    --(" Serveur doit envoyer un message  a un vaisseau ");
                    --sinon Creer Tir
                    -- cap important pour tir !!
                    --if C/=' ' then  -- if c=g h d v ...
                    --Pos_sauve := ... et Num_Sauve :=No
                    --end if;  -- else creer tir apres accept
                    --Tab_Ptr_Asteroide (I) := new Asteroide.Ptr_Asteroide;
                end Une_Touche;
            or
                accept Une_Position_Aster
                          (Position : in Definitions.Position;
                           Num : in Natural;
                           Ancienne_Position : in Definitions.Position) do
                    Q := 2;
                    Text_Io.Put_Line (" serveur sert asteroide " &
                                      Integer'Image (Num) & " coord(L,C) : " &
                                      Integer'Image (Position.Colonne) & " , " &
                                      Integer'Image (Position.Ligne));

                    Text_Io.Put_Line (Integer'Image
                                         (Ancienne_Position.Colonne) &
                                      " , " & Integer'Image
                                                 (Ancienne_Position.Ligne));
                    if Ancienne_Position /= (10, 10) then  
                        Tab_Collision (Ancienne_Position.Colonne,
                                       Ancienne_Position.Ligne) := (Rien, 0);
                        Text_Io.Put_Line (" ok ");
                    end if;

                    Pos_Sauve := Position;
                    Num_Sauve := Num;
                    --Text_Io.Get (Bid);
                end Une_Position_Aster;

            or
                accept Une_Position_Tir (Position : in Definitions.Position;
                                         Num : in Natural) do
                    Q := 1;
                    Text_Io.Put_Line (" serveur sert tir " &
                                      Integer'Image (Num) & " coord(L,C) : " &
                                      Integer'Image (Position.Colonne) & " , " &
                                      Integer'Image (Position.Ligne));

                    Pos_Sauve := Position;
                    Num_Sauve := Num;

                end Une_Position_Tir;

            or
                accept Stop do
                    Text_Io.Put_Line ("Arret du Serveur");
                    Run_Serveur := False;
                end Stop;
           or
                accept Avertir (Position : in Definitions.Position) do
                    Text_Io.Put_Line ("aster se reinit");
                    Tab_Collision (Position.Colonne, Position.Ligne) :=
                       (Rien, 0);  
                end Avertir;
                --else
                --delay 0.01;
            end select;



            case Q is
                when 0 =>
                    null;
                when 2 =>
                    Text_Io.Put_Line (" cas aster ");

                    Inspecter (Definitions.Ast, Pos_Sauve, Num_Sauve);

                when 1 =>
                    Text_Io.Put_Line (" cas tir ");

                    Inspecter (Definitions.Tir, Pos_Sauve, Num_Sauve);  
                when 3 =>
                    Text_Io.Put_Line (" cas vaisseau ");
                    --Inspecter (Definitions.Vais, Pos_Sauve, Num_Sauve);
            end case;
            Q := 0;
        end loop;

        --Run_Serveur = False si on sort de loop
        for I in 1 .. 4 loop  
            Asteroide.Detruire (Tab_Ptr_Asteroide (I).all);
        end loop;
    end Serveur;




    -- terms : array (1..n) of terminal.handle;
    -- Terms (1) := Mon_Terminal.Creer (No => 1);
    -- Mon_Terminal.Ecrire (Terminal => Terms (1),  -- handle
    --                     C => C, -- caractere a ecrire
    --                     X => X,
    --                     Y => Y,
    --                     Blink => Blink);


    -- procedure Traiter_Caractere (C : in Character; No : in Integer) is
    --  begin
    --  Text_Io.Put_Line ("Le terminal " & Integer'Image (No) &
    --                   " a frappe le caractere " & C);
    -- Serveur.rendez-vous(No, C);
    --   end Traiter_Caractere;
end Serveur;


E3 Meta Data

    nblk1=f
    nid=9
    hdr6=16
        [0x00] rec0=22 rec1=00 rec2=01 rec3=08e
        [0x01] rec0=14 rec1=00 rec2=0d rec3=016
        [0x02] rec0=0b rec1=00 rec2=0b rec3=046
        [0x03] rec0=16 rec1=00 rec2=08 rec3=05e
        [0x04] rec0=14 rec1=00 rec2=07 rec3=01c
        [0x05] rec0=1e rec1=00 rec2=06 rec3=008
        [0x06] rec0=18 rec1=00 rec2=05 rec3=052
        [0x07] rec0=10 rec1=00 rec2=04 rec3=064
        [0x08] rec0=1c rec1=00 rec2=0c rec3=002
        [0x09] rec0=1e rec1=00 rec2=0e rec3=000
        [0x0a] rec0=1b rec1=00 rec2=03 rec3=000
        [0x0b] rec0=1b rec1=00 rec2=03 rec3=000
        [0x0c] rec0=1f rec1=00 rec2=03 rec3=048
        [0x0d] rec0=0e rec1=00 rec2=02 rec3=000
        [0x0e] rec0=0c rec1=00 rec2=0a rec3=001
    tail 0x21769033089154fc0ab7a 0x42a00088462060003
Free Block Chain:
  0x9: 0000  00 02 00 99 80 10 69 6e 69 74 69 6f 6e 73 2e 42  ┆      initions.B┆
  0x2: 0000  00 0f 01 ca 80 14 2d 20 63 61 72 61 63 74 65 72  ┆      - caracter┆
  0xf: 0000  00 0a 01 4b 80 0e 73 2e 50 6f 73 69 74 69 6f 6e  ┆   K  s.Position┆
  0xa: 0000  00 00 01 77 80 0b 20 20 20 20 59 20 3d 3e 20 59  ┆   w      Y => Y┆