⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pnuc.c

📁 一个runtils v2.0图形音乐库的demo程序
💻 C
📖 第 1 页 / 共 2 页
字号:
}

/*====================[ Support Functions Start Here ]========================*/

void Create_Animations( void )
{
    int    i;

    if ( make_cartoon(&Toon_Syringe,Syringe,GENERAL_IMAGE,NULL,20,0,NO_COLLISION,&Syringe_Morph,&Syringe_Mover) ||
         make_cartoon(&Toon_Nucleus,&Nucleus_Logo,GENERAL_IMAGE,NULL,1,0,NO_COLLISION,&Static_Morph,NULL) ||
         make_cartoon(&Toon_Demo,Demo_Icons,GENERAL_IMAGE,NULL,2,30,NO_COLLISION,&Cycle_Morph,NULL) ||
         make_cartoon(&Toon_Counter,Counter_Icons,GENERAL_IMAGE,NULL,20,0,NO_COLLISION,&Counter_Morph,&Counter_Mover ) ||
         make_cartoon(&Toon_Shield,Shield_Icons,GENERAL_IMAGE,NULL,NUM_OF_SHIELDS,1,NO_COLLISION,&Shield_Morph,&Shield_Mover ) ||
         make_cartoon(&Toon_PowerUp,PowerUps,GENERAL_IMAGE,NULL,NUM_OF_POWERUPS,0,NO_COLLISION,&PowerUp_Morph,&PowerUp_Mover ) ||
         make_cartoon(&Toon_Beam,Beams,GENERAL_IMAGE,NULL,NUM_OF_BEAMS,1,NO_COLLISION,&Beam_Morph,&Beam_Mover ) ||
         make_cartoon(&Toon_Rogue_Particle,RogueParticles,GENERAL_IMAGE,NULL,NUM_OF_ROGUE_PARTICLES,0,NO_COLLISION,&Rogue_Morph,&Rogue_Mover )
       ) Terminate( ERR_MALLOC );

    for ( i=0; i<11; i++ )
      if ( make_cartoon(Toon_Logo+i,LogoLetters+i,GENERAL_IMAGE,NULL,1,0,NO_COLLISION,&Static_Morph,&Logo_Mover) )
        Terminate( ERR_MALLOC );

    for ( i=0; i<NUM_OF_PARTICLES; i++ )
      if ( make_cartoon(Toon_Particle+i,SParticles+i,GENERAL_IMAGE,NULL,1,0,NO_COLLISION,&Static_Morph,&Particle_Mover) )
        Terminate( ERR_MALLOC );
}

void Initialise_Level( void )
{
    int        i, j, c;
    PARTICLE   *p, *pp;

    Lev                = Levels + Cfg.level - 1;
    Cfg.briefed        = FALSE;
    Cfg.rays           = Lev->rays;
    Cfg.shield_cnt     = Lev->shields;
    Cfg.time           = Lev->time;
    Cfg.power_up_timer = Lev->power_up_delay;
    Cfg.beam_timer     = Calculate_Rogue_Interval( Lev->min_beam_sep,Lev->max_beam_sep );
    Cfg.rogue_timer    = Calculate_Rogue_Interval( Lev->min_rogue_sep,Lev->max_rogue_sep );

    ZERO( Cfg.particles );
    ZERO( Cfg.nuclei );
    ZERO( Cfg.shields );
    ZERO( Cfg.timers );
    ZERO( Cfg.beams );
    ZERO( Cfg.rogues );

    for ( i=Lev->count, p=Cfg.particles; i>0; i--, p++ )
    {
        p->type = (random()%NUM_OF_PARTICLES);
        for ( c=0; c<40; c++ )
        {
            p->x = random()%(VX_MAX-VX_MIN+1) + VX_MIN;
            p->y = random()%(VY_MAX-VY_MIN+1) + VY_MIN;
            for ( j=0, pp=Cfg.particles; j<i; j++, pp++ )
              if ( ABS(pp->x-p->x)<40 || ABS(pp->y-p->y)<40 ) break;
            if ( j==i ) break;
        }
        p->vx   = Set_Particle_Velocity( SPEED_MASK_1,1 );
        p->vy   = Set_Particle_Velocity( SPEED_MASK_1,1 );
    }
}

void Load_Game_Data( void )
{
    long    id;
    int     handle, bytes;

    if ( loadpals("SPRITES\\PARTICLE.PAL",&Pal)                        ||
         loadspr(SFont,"SPRITES\\FONT.SPR")!=127                       ||
         loadspr(Panel,"SPRITES\\PANEL.SPR")!=14                       ||
         loadspr(Syringe,"SPRITES\\SYRINGE.SPR")!=20                   ||
         loadspr(&Nucleus_Logo,"SPRITES\\TITLE.SPR")!=1                ||
         loadspr(&Fractal,"SPRITES\\FRACTAL.SPR")!=1                   ||
         loadspr(LogoLetters,"SPRITES\\BIGLET.SPR")!=11                ||
         loadspr(&Pause_Icon,"SPRITES\\PAUSE.SPR")!=1                  ||
         loadspr(Demo_Icons,"SPRITES\\DEMO.SPR")!=2                    ||
         loadspr(Counter_Icons,"SPRITES\\COUNTER.SPR")!=20             ||
         loadspr(&Option_Pointer,"SPRITES\\POINTER.SPR")!=1            ||
         loadspr(SParticles,"SPRITES\\PARTICLE.SPR")!=NUM_OF_PARTICLES ||
         loadspr(Shield_Icons,"SPRITES\\RINGS.SPR")!=NUM_OF_SHIELDS    ||
         loadspr(PowerUps,"SPRITES\\POWERUPS.SPR")!=NUM_OF_POWERUPS    ||
         loadspr(Beams,"SPRITES\\BEAM.SPR")!=NUM_OF_BEAMS              ||
         loadspr(RogueParticles,"SPRITES\\ROGUE.SPR")!=NUM_OF_ROGUE_PARTICLES
       ) Terminate( ERR_NODATA );

    if ( Sound_Source==SOUND_BLASTER )
    {
        if ( SB_load_rsb_lib(&SB_Effects,"SOUNDS\\SOUNDS.RSL") ) Terminate( ERR_NODATA );
    }
    else
    {
        if ( load_sfx_lib(&SPK_Effects,"SOUNDS\\SOUNDS.SXL") ) Terminate( ERR_NODATA );
    }

    if ( opfile(&handle,LevelName,READ,NOT_WRITE)      ||
         rdfile(handle,sizeof(id),(char *)&id,&bytes)  ||
         id != NLD_ID ) Terminate( ERR_NLD );
    Max_Levels = (int) ((filelen(handle)-sizeof(id))/sizeof(LEVEL_TYPE));
    if ( (Levels=(LEVEL_TYPE *)malloc(Max_Levels*sizeof(LEVEL_TYPE)))==NULL ) Terminate( ERR_MALLOC );
    if ( rdfile(handle,sizeof(LEVEL_TYPE)*Max_Levels,(char *)Levels,&bytes) ) Terminate( ERR_NLD );
    clfile( handle );
}

int  Load_Level_Data( char *name )
{
    CONFIG    *cfg;
    int       handle, bytes=0;
    char      path[GAME_NAME_SIZE+5];

    ucase(strcat(strcpy(path,name),".SAV"));
    if ( (cfg=(CONFIG *)malloc(sizeof(CONFIG)))==NULL ) Terminate( ERR_MALLOC );
    if ( opfile(&handle,path,READ,NOT_WRITE)==0 )
    {
        rdfile( handle,sizeof(CONFIG),(char *)cfg,&bytes );
        clfile( handle );
        if ( bytes==sizeof(CONFIG) && cfg->id==0x504e )
          memcpy( &Cfg,cfg,sizeof(CONFIG) );
        else bytes=0;
    }
    free( cfg );

    return( (bytes!=sizeof(CONFIG)) );
}

void MouseTrap( int event, int b, int x, int y, int mx, int my )
{
    static int   last_b=0;

    if ( Demo_Mode )
    {
        if ( b&0x03 ) Demo_Exited=TRUE;
    }
    else
    {
        if ( (b&=0x03)!=last_b ) I_MouseB=last_b=b;
        I_MouseX = x;
        I_MouseY = y;
    }
}

void interrupt NewINT9H( void )
{
    static unsigned char   scan, status;

    status = ((scan=inp(0x60))&0x80)?FALSE:TRUE;

    if ( status && Demo_Mode ) Demo_Exited=TRUE;

    _chain_intr( OldINT9H );
}

int  Save_Level_Data( char *name )
{
    int     handle, bytes, key;
    char    path[GAME_NAME_SIZE+5], *msgs[3]={"Game already exists!","Overwrite Y or N",NULL};

    ucase(strcat(strcpy(path,name),".SAV"));

    if ( chkfile(path,FILE_EXISTS)==0 )
    {
        key = Show_Error_Message( msgs,SFX_WARNING,0,0 );
        if ( key!='y' && key!='Y' ) return( 0 );
    }

    if ( mkfile(&handle,path,NORMAL) ) return( TRUE );
    Cfg.id = 0x504e;
    wtfile( handle,sizeof(CONFIG),(char *)&Cfg,&bytes );
    clfile( handle );

    return( (bytes!=sizeof(CONFIG)) );
}

void Sfx( SFX_TYPE type )
{
    if ( Effects_Flag && type>=0 && type<NUMBER_OF_SFX )
    {
        if ( Sound_Source==SOUND_BLASTER ) SB_play( SB_Effects.rsb+type ); else
        {
            flush_sounds();
            sound_effect( SPK_Effects.lib[type].sfx,SPK_Effects.lib[type].num,1 );
        }
    }
}

void Slow_Timer_Hook( void )
{
    static unsigned int  *tab=Cfg.timers;

    if ( !Game_Paused )
    {
        _asm
        {
            les    bx, tab
            mov    cx, MAX_NUCLEI
        Repeat:
            cmp    word ptr es:[bx], 0
            je     Not_Set
            dec    word ptr es:[bx]
        Not_Set:
            add    bx, 2
            loop   Repeat
        }
        if ( Demo_Timer ) Demo_Timer--;
        if ( Experiment_Timer ) Experiment_Timer--;
    }
}

void Terminate( ERROR_TYPE errno )
{
    int    i;

    disable_pseudo_mouse();
    disable_sound();
    SB_disable();
    disable_timers();
    if ( OldINT9H != NULL ) _dos_setvect(0x09,OldINT9H);
    if ( errno==ERR_REGNAG )
    {
        setmode( 0x03 );
        display_scr( "SPRITES\\REGISTER.SCR",0 );
        Print_Banner( FALSE );
        setpos( 0,23,0 );
        prints( "Please wait...",L_GREY,0 );
        for ( i=9; i>=0; i-- )
        {
            setpos( 15,23,0 );
            printi( i,L_GREY,0 );
            sleep( 1 );
            while ( inkey(0) );
        }
        prints( "\r                     ",L_GREY,0 );
    }
    else
    {
        Print_Banner( TRUE );
        if ( errno>=0 && errno<NUM_OF_ERRS ) prints( ErrorTab[errno],L_GREY,0 ); else
        {
            prints( "Abnormal Termination: Error=",L_GREY,0 );
            printi( errno^0x8000,L_GREY,0 );
        }
    }
    setpos( 0,23,0 );
    exit( 1 );
}

void Wait_For_Event( int delay )
{
    /*  Waits for an event (key/mouse) or for time delay  */

    long    timeout=timer() + (long)delay*18L;
    int     b, x, y;

    while ( mstatus(&b,&x,&y) );

    while ( timer()<timeout && !inkey(0) && !mstatus(&b,&x,&y) );

    while ( mstatus(&b,&x,&y) );
}

/*========================[ End Of Program File ]=============================*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -