コード例 #1
0
CALLSET_ENTRY (clock_millions, sw_clock_target)
{
	
	if (timed_mode_running_p (&clock_millions_mode))
	{
		leff_start (LEFF_CLOCK_TARGET);
		/* Award bonus if hit 6 times */
		if (++clock_mode_hits > 5)
		{
			sound_send (SND_EXPLOSION_3);
			score (SC_20M);
			score_add (clock_mode_score, score_table[SC_20M]);
			deff_start (DEFF_CLOCK_MILLIONS_EXPLODE);
			timed_mode_end (&clock_millions_mode);
		}
		else
		{
			sound_send (SND_CLOCK_BELL);
			score (SC_5M);
			score_add (clock_mode_score, score_table[SC_5M]);	
			deff_start (DEFF_CLOCK_MILLIONS_HIT);
		}
		if (!global_flag_test (GLOBAL_FLAG_CHAOSMB_RUNNING))
			tz_clock_reverse_direction ();
		tz_clock_set_speed (clock_mode_hits);
	}
	else if (!global_flag_test (GLOBAL_FLAG_CHAOSMB_RUNNING))
	{
		callset_invoke (sw_jet_noflash);
		score (SC_50K);
		sound_send (SND_NO_CREDITS);
	}
}
コード例 #2
0
ファイル: sssmb.c プロジェクト: SonnyJim/freewpc
static void sssmb_award_jackpot (void)
{
	if (!task_kill_gid (GID_SSSMB_JACKPOT_READY))
		return;

	mball_jackpot_uncollected = FALSE;
	sssmb_initial_ramps_to_divert++;
	if (feature_config.dixon_anti_cradle == YES)
		sssmb_jackpot_value += 5;
	score_1M (sssmb_jackpot_value);
	leff_start (LEFF_PIANO_JACKPOT_COLLECTED);
	deff_start (DEFF_JACKPOT);
	deff_start (DEFF_SSSMB_JACKPOT_COLLECTED);
	sound_send (SND_EXPLOSION_1);

	/* score it */

	if (sssmb_jackpot_value < 100)
		sssmb_jackpot_value += 10;
	sssmb_ramps_to_divert = sssmb_initial_ramps_to_divert;

	if (!global_flag_test (GLOBAL_FLAG_SSSMB_RED_JACKPOT)
		&& !global_flag_test (GLOBAL_FLAG_SSSMB_ORANGE_JACKPOT)
		&& !global_flag_test (GLOBAL_FLAG_SSSMB_YELLOW_JACKPOT))
	{
		sssmb_relight_all_jackpots ();
	}
}
コード例 #3
0
ファイル: rightramp.c プロジェクト: SonnyJim/freewpc
void sw_right_ramp_enter_task (void)
{
	/* Decide whether to let the ball onto the mini-playfield,
	or dump it.  Do this once for each balls that enters the
	ramp. */
	do {
		/* Let it through to the mpf field if allowed */
		if (mpf_ready_p ())
		{
			/* Reset the unlit count so we can
			 * hint to the player again later */
			unlit_right_ramps = 0;
			bridge_open_start ();
			task_sleep_sec (3);
			/* Don't close if another ball is on it's way */
			if (right_ramps_entered == 1)
				bridge_open_stop ();
		}
		else
		{
			/* Ramp was hit unlit, increment the hint counter */
			bounded_increment (unlit_right_ramps, 3);
			/* tell unlit.c that an unlit shot was made */
			award_unlit_shot (SW_RIGHT_RAMP);

			 /* Show an animation hint if not enabled for mpf */
			if ((unlit_right_ramps == 3  || hurryup_active ())
				&& !global_flag_test (GLOBAL_FLAG_MULTIBALL_RUNNING))
				deff_start (DEFF_SHOOT_HITCH);
			else if (global_flag_test (GLOBAL_FLAG_MULTIBALL_RUNNING)
					&& global_flag_test (GLOBAL_FLAG_MB_JACKPOT_LIT))
			{
				deff_start (DEFF_SHOOT_JACKPOT);
			}
			task_sleep_sec (2);
	
			/* Wait until allowed to kickout */
			/* TODO BUG? */
			while (kickout_locks > 0)
				task_sleep (TIME_100MS);
			
			/* Drop the ball back to the playfield */
			sound_send (SND_RIGHT_RAMP_EXIT);
			bridge_open_start ();
			task_sleep (TIME_300MS);
			/* Sleep a bit longer if multiball, so we knock any following
			 * balls back to the playfield */
			if (multi_ball_play ())
				task_sleep (TIME_200MS);
			bridge_open_stop ();
		}
	} while (--right_ramps_entered > 0);
	/* Failsafe */
	bridge_open_stop ();
	task_exit ();
}
コード例 #4
0
ファイル: special.c プロジェクト: CardonaPinball/freewpc
void special_award (void)
{
	callset_invoke (special_award);
	switch (system_config.special_award)
	{
		case FREE_AWARD_CREDIT:
			add_credit ();
			break;

		case FREE_AWARD_EB:
			increment_extra_balls ();
			break;

		case FREE_AWARD_OFF:
			break;
	}

#ifdef DEFF_SPECIAL
	deff_start (DEFF_SPECIAL);
#endif
#ifdef LEFF_SPECIAL
	leff_start (LEFF_SPECIAL);
#endif
	knocker_fire ();
	audit_increment (&system_audits.specials);
}
コード例 #5
0
ファイル: rules.c プロジェクト: Dmilo/freewpc
void newton_bonus_award (void)
{
	extern void quickmb_light (void);
	newton_next_level += 10;
	deff_start (DEFF_NEWTON_BONUS);
	quickmb_light ();
}
コード例 #6
0
ファイル: redtgt.c プロジェクト: aeneas-flippers-be/freewpc
/* check if all 3 are lit */
void redtgt_check (void)
{
	if (global_flag_test (GLOBAL_FLAG_RAFTMODE))
		wpm_next_award ();

	score (SC_20K);

	if (global_flag_test (GLOBAL_FLAG_REDTGT1) && global_flag_test (GLOBAL_FLAG_REDTGT2) && global_flag_test (GLOBAL_FLAG_REDTGT3))
	{
		redtgt_off ();
		if (!flag_test (FLAG_KICKBACKLIT))
		{
			kickback_enable ();
			deff_start (DEFF_REDTGT_KICKBACK);
		}
		else
		{
//			if (global_flag_test (GLOBAL_FLAG_RAFTMODE))
//				wpm_next_award ();
//				raft_award_hazard ();
//			else
				score (SC_250K);
		}
	}
}
コード例 #7
0
void prison_break_made (void) {
	++prison_break_mode_shots_made;
	score_add(prison_break_mode_score, prison_break_mode_last_score);
	score_add (prison_break_mode_score_total_score, prison_break_mode_last_score);
	score_long (prison_break_mode_last_score);
	deff_start (DEFF_PRISON_BREAK_HIT_EFFECT);//under /kernel/deff.c
}//end of function
コード例 #8
0
ファイル: unlit.c プロジェクト: SonnyJim/freewpc
void award_unlit_shot (U8 unlit_called_from)
{
    if (can_award_unlit_shot (unlit_called_from))
    {
        unlit_shot_count++;
        /* Don't allow collecting from Hitchhiker or jets */
        if (unlit_shot_count > 4 && unlit_called_from != (SW_HITCHHIKER)
                && unlit_called_from != (SW_BOTTOM_JET))
        {
            sound_send (SND_JUST_TAKEN_A_DETOUR);
            deff_start (DEFF_BACKDOOR_AWARD);
            backdoor_award_collected = TRUE;
            unlit_shot_count = 0;
            callset_invoke (award_door_panel);
        }
        /* Reset if the player hits the same unlit shot twice */
        if (unlit_called_from == unlit_called_from_stored)
            unlit_shot_count = 0;
        if (unlit_shot_count == 4 )
        {
            //TODO Check for unlit shots
            /* Hint to the player that backdoor award is ready */
            sound_send (SND_TWILIGHT_ZONE_SHORT_SOUND);
        }
        /* Store where we were called from */
        unlit_called_from_stored = unlit_called_from;
    }
}
コード例 #9
0
ファイル: jets.c プロジェクト: SonnyJim/freewpc
static void jets_level_up (void)
{
	timer_restart_free (GID_JETS_LEVEL_UP, TIME_2S);
	jets_scored = 1;
	bounded_increment (jets_bonus_level, 50);
	if (jets_for_bonus <= 195)
		jets_for_bonus += 5;
	award_unlit_shot (SW_BOTTOM_JET);
	/* jetscore is used rather than score_deff_get 
	 * because it's likely another score woud of
	 * happened */
	if (jets_bonus_level < 3)
	{
		score (SC_1M);
		jetscore = 1;
	}
	else if (jets_bonus_level < 5)
	{
		score (SC_5M);
		jetscore = 5;
	}
	else if (jets_bonus_level < 7)
	{
		score (SC_10M);
		jetscore = 10;
	}
	if (!timer_find_gid (GID_HITCHHIKER))
		deff_start (DEFF_JETS_LEVEL_UP);
}
コード例 #10
0
ファイル: trivial.c プロジェクト: Dave2084/freewpc
CALLSET_ENTRY (trivial, bonus)
{
	deff_start (DEFF_BONUS);
	task_sleep (TIME_1S);
	while (deff_get_active () == DEFF_BONUS)
		task_sleep (TIME_166MS);
}
コード例 #11
0
ファイル: huxley.c プロジェクト: CardonaPinball/freewpc
/****************************************************************************
 * reminder when mode enabled but not started yet
 ***************************************************************************/
void huxley_reminder_task (void) {
	for (;;) {
		task_sleep_sec(67);
		deff_start (DEFF_HUXLEY_INFO_EFFECT);
	}//end of loop
	task_exit();
}//end of function
コード例 #12
0
ファイル: fortress.c プロジェクト: CardonaPinball/freewpc_DM
/*******************
 * start with all jackpot shots lit and as shots are made decrease # of lights lit
 ******************/
void fortress_jackpot_made(void) {
	++fortress_jackpot_shots_made;
	score_add (fortress_score, score_table[FORTRESS_JP_MB_SCORE]);
	score (FORTRESS_JP_MB_SCORE);

	if (system_config.disable_shaker == NO) {
		if (system_config.extra_shaker == YES) 	shaker_start (SHAKER_HALF_ON, 2);
		else									shaker_start (SHAKER_ONE_QUARTER_ON, 2);
	}//end of shaker call

	switch (fortress_jackpot_shots_made % 5) {
		case 1:	leff_start (LEFF_JACKPOT1); break;
		case 2:	leff_start (LEFF_JACKPOT2); break;
		case 3:	leff_start (LEFF_JACKPOT3); break;
		case 4:	leff_start (LEFF_JACKPOT4); break;
		default: leff_start (LEFF_JACKPOT); break;
	}
	deff_start (DEFF_FORTRESS_JACKPOT_EFFECT);

	if 		(fortress_jackpot_shots_made < 2)	choose_multiple_random_jackpot (3); //after 1 made, at most 3 lit
	else if (fortress_jackpot_shots_made < 4)	choose_multiple_random_jackpot (2); //for 2nd and 3rd, at most 2 lit
	else 										choose_random_jackpot ();			//for rest, only 1 lit

	if (DM_IN_CAB_TEST) {	start_super_jackpot_reminder(); }
	else
		if (fortress_jackpot_shots_made % 5 == 0) 	start_super_jackpot_reminder();
}//end of function
コード例 #13
0
ファイル: huxley.c プロジェクト: CardonaPinball/freewpc_DM
 //shot made during huxley mode
void huxley_mode_shot_made(void) {
	deff_start (DEFF_HUXLEY_HIT_EFFECT);//under /kernel/deff.c
	++huxley_mode_shots_made;
	score (HUXLEY_MODE_HIT_SCORE);
	score_add (huxley_mode_score, score_table[HUXLEY_MODE_HIT_SCORE]);
	score_add (huxley_mode_score_total_score, score_table[HUXLEY_MODE_HIT_SCORE]);
}//end of function
コード例 #14
0
void rivcl_increase_class (void)
{
	score (SC_20K);

	if (riverclass < 6)
	{
		riverclass++;

		deff_start (DEFF_RIVERCLASS);
		switch (riverclass)
		{
			case 2:
				speech_start (SND_CLASS2RIVER, SL_3S);
				break;
			case 3:
				speech_start (SND_CLASS3RIVER, SL_3S);
				break;
			case 4:
				speech_start (SND_CLASS4RIVER, SL_3S);
				break;
			case 5:
				speech_start (SND_CLASS5RIVER, SL_3S);
				break;
			case 6:
				speech_start (SND_CLASS6RIVER, SL_4S);
				break;
		}
	}
}
コード例 #15
0
ファイル: skill.c プロジェクト: CardonaPinball/freewpc
void skill_menu_start(void) {
	skill_menu_draw_count = 0;
	skill_menu_enabled = 1;
	skill_menu_selection = SKILL_ROLLOVER;
	dbprintf ("skill_menu_start\n");
	deff_start (DEFF_SKILL_MENU);
}
コード例 #16
0
ファイル: gangway.c プロジェクト: CardonaPinball/freewpc
void gangway_loop_collected (void)
{
	if (gangway_count == 5 && !gangway_eb_lit_this_ball)
	{
		gangway_eb_lit_this_ball = TRUE;
		light_hard_extra_ball ();
		deff_start (DEFF_GANGWAY_EB_LIT);
	}
	else
	{
		sample_start (SND_WHEEEE, SL_1S);
		lamp_tristate_on (lamplist_index (LAMPLIST_GANGWAYS, gangway_count));
		generic_ladder_score_and_advance (&gangway_score_rule);
		deff_start (DEFF_GANGWAY_COLLECT);
		lamp_tristate_flash (lamplist_index (LAMPLIST_GANGWAYS, gangway_count));
	}
}
コード例 #17
0
ファイル: deadend.c プロジェクト: CardonaPinball/freewpc
CALLSET_ENTRY (deadend, sw_dead_end)
{
//	device_switch_can_follow (dead_end, slot, TIME_2S + TIME_500MS);
//	event_can_follow (dead_end, camera, TIME_2S);
	timer_restart_free (GID_DEADEND_TO_SLOT, TIME_4S);
	//event_can_follow (camera_or_piano, slot_prox, TIME_5S);

	if (lamp_test (LM_DEAD_END))
	{
		leff_start (LEFF_RIGHT_LOOP);
		dead_end_count++;
		deff_start_sync (DEFF_DEAD_END);
		if (!flag_test (FLAG_SNAKE_READY) && single_ball_play ())
		{
			flag_on (FLAG_SNAKE_READY);
			deff_start_sync (DEFF_SNAKE_READY);
		}
		switch (dead_end_count)
		{
			case 1:
				score (SC_250K);
				timed_game_extend (15);
				break;
			case 2:
				score (SC_500K);
				timed_game_extend (20);
				break;
			case 3:
				timed_game_extend (30);
				if (extra_ball_lit_from_deadend == FALSE 
					&& can_award_extra_ball ())
				{
					score (SC_1M);
					light_easy_extra_ball ();
					extra_ball_lit_from_deadend = TRUE;
				}
				else
				{
					score (SC_10M);
				}
				dead_end_count = 0;
				break;
			default:
				score (SC_2M);
				timed_game_extend (30);
				break;
		}
		lamp_off (LM_DEAD_END);
	}
	else
	{
		deff_start (DEFF_INLANE_LIGHTS_DEAD_END);
		award_unlit_shot (SW_DEAD_END);
		score (SC_100K);
		sound_send (SND_TOWN_SQUARE_AWARD);
		timed_game_pause (TIME_3S);
	}
}
コード例 #18
0
ファイル: jets.c プロジェクト: hydra/freewpc
CALLSET_ENTRY (jet, sw_jet)
{
	/* Hack for when mpf_exit switch breaks */
	if (!multi_ball_play () && mpf_timer > 0)
		callset_invoke (sw_mpf_exit);
	
	if (global_flag_test(GLOBAL_FLAG_POWERBALL_IN_PLAY))
		jets_scored += 2;
	else
		jets_scored++;
	
	if (jets_scored >= jets_for_bonus)
	{	
		bounded_increment (jets_bonus_level, 50);
		jets_for_bonus += 5;
		award_unlit_shot (SW_BOTTOM_JET);
		sound_send (SND_GLASS_BREAKS);
		task_sleep (TIME_500MS);
		/* jetscore is used rather than score_deff_get 
		 * because it's likely another score would of
		 * happened */
		if (jets_bonus_level < 3)
		{
			score (SC_1M);
			jetscore = 1;
		}
		else if (jets_bonus_level < 5)
		{
			score (SC_5M);
			jetscore = 5;
		}
		else if (jets_bonus_level < 7)
		{
			score (SC_10M);
			jetscore = 10;
		}
		if (!timer_find_gid (GID_HITCHHIKER))
			deff_start (DEFF_JETS_LEVEL_UP);
	}

	if (timed_mode_running_p (&tsm_mode))
	{
		score (SC_500K);
		score_add (tsm_mode_total, score_table[SC_500K]);
	}
	else
	{	
		score (SC_150K);
		/* Stop deff from restarting whilst we
		 * are showing the level up deff
		 * or when the hitch anim is running */
		if ((jets_scored <= jets_for_bonus) 
			&& (!timer_find_gid (GID_HITCHHIKER)))
			deff_restart (DEFF_JETS_HIT);
	}
	
	task_create_gid1 (GID_JET_SOUND, sw_jet_sound);
}
コード例 #19
0
ファイル: mbmode.c プロジェクト: CardonaPinball/freewpc
/*	Start a multiball mode */
void mb_mode_start (struct mb_mode_ops *ops)
{
	if (mb_mode_running_p (ops))
		return;
	task_create_gid1 (ops->gid_running, ops->active_task);
	if (ops->deff_starting)
		deff_start (ops->deff_starting);
	mb_mode_update (ops, MB_ACTIVE);
}
コード例 #20
0
ファイル: multiball.c プロジェクト: SonnyJim/freewpc
CALLSET_ENTRY (multiball, multiball_start)
{
	global_flag_on (GLOBAL_FLAG_SUPER_JACKPOT_LIT);
	global_flag_on (GLOBAL_FLAG_MB_JACKPOT_LIT);
	callset_invoke (head_enable_divert);
	calculate_super_jackpot_value ();
	deff_start (DEFF_SUPER_JACKPOT_VALUE);
	mb_jackpot_collected = FALSE;
}
コード例 #21
0
ファイル: cryoprison.c プロジェクト: CardonaPinball/freewpc
//jackpot shot
void cryoprison_jackpot_made(void) {
	score_add (cryoprison_score, score_table[CRYOPRISON_JP_MB_SCORE]);
	score (CRYOPRISON_JP_MB_SCORE);
	deff_start (DEFF_CRYOPRISON_JACKPOT_EFFECT);
	choose_multiple_random_jackpot(3);

	if (IN_TEST) {	start_super_jackpot_reminder(); }
	else			if (cryoprison_jackpot_shots_made % 5 == 0) 	start_super_jackpot_reminder();
}//end of function
コード例 #22
0
ファイル: config.c プロジェクト: Curbfeeler/freewpc
CALLSET_ENTRY (tz, bonus)
{
	deff_start (DEFF_BONUS);
	leff_start (LEFF_BONUS);
	task_sleep_sec (1);
	while (deff_get_active () == DEFF_BONUS)
		task_sleep (TIME_66MS);
	leff_stop (LEFF_BONUS);
}
コード例 #23
0
ファイル: loop.c プロジェクト: hydra/freewpc
static void award_loop (void)
{
	/* Start a timer to go down a level after 10 seconds */
	if (!task_find_gid (GID_LOOP_LEVEL_TIMER))
		task_create_gid (GID_LOOP_LEVEL_TIMER, loop_level_timer_task);
	
	bounded_increment (total_loops, 254);
	deff_start (DEFF_LOOP);	
}
コード例 #24
0
ファイル: fortress.c プロジェクト: CardonaPinball/freewpc_DM
void fortress_start(U8 num) {
	computer_light_temp_off();
	is_fortress_running = TRUE;
	task_create_gid1 (GID_FORTRESS_START_NOISE, fortress_start_sounds);
	fortress_display_counter = 0;
	FORT_TOGGLE = 0;
	fortress_ballsave  = system_config.mb_ballsave;

	mb_mode_start(&fortress_mode);
	score_add (fortress_score, score_table[FORTRESS_MB_SCORE]);
	score (FORTRESS_MB_SCORE);

	if (!in_tilt) deff_start (DEFF_FORTRESS_START_EFFECT);
	multiball_started();//reset all MB start criteria for next time
	diverter_stop();//defined in divhold2.ct

	//LIGHTS
	if (!in_tilt) {
		leff_start (LEFF_MB_START);
			lamp_tristate_flash(LM_FORTRESS_MULTIBALL);
			task_sleep (TIME_2S);
			lamp_tristate_on (LM_FORTRESS_MULTIBALL);
			lamp_tristate_off (LM_FREEZE_1);
			lamp_tristate_off (LM_FREEZE_2);
			lamp_tristate_off (LM_FREEZE_3);
			lamp_tristate_off (LM_FREEZE_4);
	}
	//SOUNDS
	if (!in_tilt) {
			U8 	fortress_SoundCounter;
			fortress_SoundCounter = random_scaled(2);//from kernal/random.c - pick number from 0 to 2
			if (fortress_SoundCounter == 0)
				sound_start (ST_SPEECH, SPCH_SOMETHING_RIGHT_PREV_LIFE, SL_4S, PRI_GAME_QUICK3);
			else
				sound_start (ST_SPEECH, SPCH_SEND_MANIAC, SL_4S, PRI_GAME_QUICK3);
			task_sleep (TIME_3S);
	}

	//serve balls
	if (!in_tilt) {
		if (num + live_balls >= 5) set_ball_count (5);
		else set_ball_count (num + live_balls);
		//task_sleep (TIME_3S);
		set_all_jackpots(); //all 6 lit

		//start the ball save timer
		task_create_gid1 (GID_FORTRESS_BALLSAVE_TIMER, fortress_ballsave_task);
		//recount the trough every 5 secs - this is to handle situations
		//where too many drains in rapid succession cause the game to lose
		//count of live balls - this only happens during MB
		callset_invoke (mb_trough_recount_timer_start);
	}
	//just in case - make sure this is running
	ball_search_monitor_start ();
	set_dm_mode2(FORTRESS_COMPLETED); //for BONUS
}//end of function
コード例 #25
0
void score_extraball(void) {
	ball_search_monitor_stop ();
	flag_off(FLAG_IS_EXTRABALL_LIT);
	extraball_light_off ();
	task_kill_gid(GID_EXTRA_BALL_REMINDER);
	increment_extra_balls();
	leff_start (LEFF_EXTRABALL);
	deff_start (DEFF_EXTRA_BALL_EFFECT);
	ball_search_monitor_start ();
}//end of function
コード例 #26
0
ファイル: lanes.c プロジェクト: SonnyJim/freewpc
static void handle_outlane (void)
{
    /* Start a timer to tell the difference between an outlane
     * drain and a center drain when the ball reaches the trough. */
    event_can_follow (any_outlane, center_drain, TIME_7S);
    deff_start (DEFF_BALL_DRAIN_OUTLANE);

    if (!multi_ball_play ())
        leff_start (LEFF_STROBE_DOWN);
}
コード例 #27
0
ファイル: deff.c プロジェクト: Mole23/freewpc
/**
 * Restart a deff.  If the deff is already running, its thread is stopped
 * and then restarted.  Otherwise, it is treated just like deff_start().
 *
 * This function is identical to deff_start(), but can be used on a deff
 * that is not ordinarily restartable.
 */
void deff_restart (deffnum_t dn)
{
	deff_debug ("deff_restart\n");
	log_event (SEV_INFO, MOD_DEFF, EV_DEFF_RESTART, dn);

	if (deff_running == dn)
		deff_start_task (&deff_table[dn]);
	else
		deff_start (dn);
}
コード例 #28
0
ファイル: rules.c プロジェクト: Dmilo/freewpc
void clock_display_task (void)
{
	task_sleep_sec (3);
	if (clock_hour <= 6)
		sound_send (SPCH_1PM + clock_hour - 1);
	else
		; /* sound_send (SPCH_7PM + clock_hour - 1); */
	deff_start (DEFF_CLOCK_UPDATE);
	task_exit ();
}
コード例 #29
0
ファイル: multiball.c プロジェクト: SonnyJim/freewpc
CALLSET_ENTRY (multiball, award_scoop_jackpot)
{
	if (multi_ball_play () && global_flag_test (GLOBAL_FLAG_MB_JACKPOT_LIT))
	{
		global_flag_off (GLOBAL_FLAG_MB_JACKPOT_LIT);
		sound_send (SND_JACKPOT);
		score (SC_1M);
		deff_start (DEFF_JACKPOT);
	}
}
コード例 #30
0
ファイル: wasteland.c プロジェクト: CardonaPinball/freewpc_DM
void wasteland_start(U8 num) {
//	kill_combos();
	computer_light_temp_off();
	task_create_gid1 (GID_WASTELAND_START_NOISE, wasteland_start_sounds);
	is_wasteland_running = TRUE;
	mb_mode_start(&wasteland_mode);

	score_add (wasteland_score, score_table[WASTELAND_MB_SCORE]);
	score (WASTELAND_MB_SCORE);

	wasteland_display_counter = 0;
	WL_TOGGLE = 0;
	wasteland_ballsave = TRUE;

	multiball_started();//reset all MB start criteria for next time
	deff_start (DEFF_WASTELAND_START_EFFECT);
	diverter_stop();//defined in divhold2.ct

	//LIGHTS
	leff_start (LEFF_MB_START);
			lamp_tristate_flash(LM_WASTELAND_MULTIBALL);
			task_sleep (TIME_2S);
			lamp_tristate_on (LM_WASTELAND_MULTIBALL);
			lamp_tristate_off (LM_FREEZE_1);
			lamp_tristate_off (LM_FREEZE_2);
			lamp_tristate_off (LM_FREEZE_3);
			lamp_tristate_off (LM_FREEZE_4);

	//SOUNDS
			U8 	wasteland_SoundCounter;
			wasteland_SoundCounter = random_scaled(2);//from kernal/random.c - pick number from 0 to 2
			if (wasteland_SoundCounter == 0)
				sound_start (ST_SPEECH, SPCH_IN_THIS_CENTURY, SL_4S, PRI_GAME_QUICK2);
			else
				sound_start (ST_SPEECH, SPCH_FEEL_GOOD_TOO, SL_4S, PRI_GAME_QUICK2);
	task_sleep (TIME_3S);
	wasteland_start_music = FALSE; //for to kill the music

	//serve balls
	if (num + live_balls >= 5) set_ball_count (5);
	else set_ball_count (num + live_balls);
	task_create_gid1 (GID_WASTELAND_BALL_SAVE, wasteland_ballsave_task);

	//task_sleep (TIME_3S);

	set_all_jackpots(); //all 6 lit
	//recount the trough every 5 secs - this is to handle situations
	//where too many drains in rapid succession cause the game to lose
	//count of live balls - this only happens during MB
	callset_invoke (mb_trough_recount_timer_start);

	//just in case - make sure this is running
	ball_search_monitor_start ();
	set_dm_mode2(WASTELAND_COMPLETED); //for BONUS
}//end of function