Пример #1
0
void fronttorture_update(void)
{
    if (torture_state.action != 0)
    {
      if ( torture_sprite_frame != torture_end_sprite )
        torture_sprite_frame += torture_sprite_direction;
    }
    int i;
    for (i = 0; i < TORTURE_DOORS_COUNT; i++)
    {
        struct DoorDesc * door;
        struct DoorSoundState * doorsnd;
        door = &doors[i];
        doorsnd = &door_sound_state[i];
        if ( doorsnd->field_4 )
        {
            int volume;
            volume = doorsnd->field_4 + doorsnd->field_0;
            if (volume <= 0)
            {
                volume = 0;
                doorsnd->field_4 = 0;
                StopSample(0, door->field_28);
            } else
            if (volume >= 127)
            {
                volume = 127;
                doorsnd->field_4 = 0;
            }
            doorsnd->field_0 = volume;
            if (volume > 0)
            {
              SetSampleVolume(0, door->field_28, volume, 0);
            }
        }
    }
}
Пример #2
0
void DoAutofire(TUnit *unit)
{
    int cyc, i, ca, oldcw, oldtu, oldtu2;
    TPoint poz;
    TUnit *u;
    int su, uu;
       
    ConAF_used = FALSE;
    if (ConAF_unit != unit) memset(ConAF_table, 0, sizeof(ConAF_table));
    if (!AF_Reseted) return;
    for (i = 0; i < UNITS_TOP; i++) 
        if (AF_Units[i]) AF_Units[i] = (Units[i] != NULL) && (Units[i]->X != -1);

    DAF_found_units = 0;
    for (cyc = 0; cyc < 1680 /*snek pro r=20*/; cyc++) {
        poz = CartezianSnail(cyc);
        poz.x += unit->X, poz.y += unit->Y;
        if ((poz.x < 0) || (poz.y < 0) || (poz.x >= MapSizeX) || (poz.y >= MapSizeY)) continue;
        uu = GetField(poz.x, poz.y)->Unit;
        if ((uu != NO_UNIT) && (AF_Units[uu]))
            DAF_founds[DAF_found_units++] = uu;
        if (GetAircraftAt(poz.x, poz.y) != NULL) 
            DAF_founds[DAF_found_units++] = GetAircraftAt(poz.x, poz.y)->ID;
            
    }

    StopSample(SampleMoving);   SampleMoving = INVALID_SAMPLE_HANDLE;
    for (cyc = 0; cyc < DAF_found_units; cyc++) {
        i = DAF_founds[cyc];

        if (AF_Units[i]) {
            u = (TUnit*)Units[i];
            uu = unit->ID;
            ca = ChooseAttack(u, unit);
            if (ca != -1) {
                oldcw = u->CurWpn;
                oldtu = u->TimeUnits;
                u->CurWpn = ca;
                su = SelectedUnit->ID;
                u->Select();
                poz = GetRozptyl(unit->X, unit->Y, u);

                if ((u->ID >= BADLIFE) || (ConfirmAF(u, unit)))
                    u->Attack(unit->X + poz.x, unit->Y + poz.y);
                u->CurWpn = oldcw;

                if (Units[su]) Units[su]->Select();
                else {
                    int aID = su, oldID = su;

                    if (su < BADLIFE) {
                        while (++aID != oldID) {
                            if (aID >= BADLIFE) aID = 0;
                            if ((Units[aID] != NULL) && (Units[aID]->HitPoints > 0) &&
                                (Units[aID]->X != -1)) break;
                        }
                    }
                    else {
                        while (++aID != oldID) {
                            if (aID >= UNITS_TOP) aID = BADLIFE;
                            if ((Units[aID] != NULL)  && (Units[aID]->HitPoints > 0) 
                                && (Units[aID]->X != -1)) break;
                        }
                    }
                    SelectedUnit = NULL;
                    if (oldID != aID) Units[aID]->Select();
                }

                if (!Units[i]) AF_Units[i] = FALSE;
                else {
                    AF_Units[i] = UnitCanShoot(u);
                    if (!AF_Units[i]) {
                        oldtu2 = u->TimeUnits;
                        u->TimeUnits = oldtu;
                        AF_RemoveUnit(u);
                        u->TimeUnits = oldtu2;
                    }
                }
                if (!Units[uu]) break;
            }
        }
    }
}