Ещё один пример функции "set_damage". Здесь имеются "вылеты" из функции, в виде "exception". Псевдокод:
## Код:
```
function power(attack: Attack): Int;
begin
    case attack of
         Magic: result := 5;
         Melee: result := 4;
    end;
end;

function set_damage(var attacks: List[Attack]; const surprise: Bool; const defense: Int): void;
begin
    if defense < 0 then
        raise Exception("defense < 0");

    while (attacks =:= [attack, ...atks]) do
    begin
        if surprise then
            tmp := 3
        else
            tmp := 2;

        effectiveness := power(attack) * tmp;
        if effectiveness <= 0 then
            raise Exception("effectiveness <= 0");

        case attack of
             Magic: 
                    begin
                        tmp' := effectiveness - defense;
                        if tmp' <= 0 then
                            attack.damage := 0
                        else tmp' >= 1 then
                            attack.damage := tmp'
                        else
                            raise Exception(" tmp' > 0 and tmp' < 1 ");
                    end;

             Melee: attack.damage := effectiveness / defense * 2;
        end;
    end;   
end
```

Р-схема:
Вложение:
set_damage3.PNG [ 26.74 КБ | Просмотров: 18322 ]

Схематическая таблица (здесь функция "power" встроена в таблицу, специально нет никаких цветовых выделений и пр.):
Вложение:
set_dam_schm.PNG [ 27.16 КБ | Просмотров: 18322 ]

Алгоритмическая таблица:
Вложение:
set_dam_algo.PNG [ 31.71 КБ | Просмотров: 18322 ]
