void
CameraDirector::SetViewObjectGroup(ListIter<Ship> group, bool quick)
{
    if (!ship) return;

    Starshatter* stars = Starshatter::GetInstance();

    if (!stars->InCutscene()) {
        // only view solid contacts:
        while (++group) {
            Ship* s = group.value();

            if (s->GetIFF() != ship->GetIFF()) {
                Contact* c = ship->FindContact(s);
                if (!c || !c->ActLock())
                return;
            }

            if (s->Life() == 0 || s->IsDying() || s->IsDead())
            return;
        }
    }

    group.reset();

    if (external_group.size() > 1 &&
            external_group.size() == group.size()) {

        bool same = true;

        for (int i = 0; same && i < external_group.size(); i++) {
            if (external_group[i] != group.container()[i])
            same = false;
        }

        if (same) {
            SetMode(MODE_ZOOM);
            return;
        }
    }

    ClearGroup();

    if (quick) {
        mode = MODE_ORBIT;
        transition = 0;
    }
    else {
        SetMode(MODE_TRANSLATE);
    }

    external_group.append(group.container());

    ListIter<Ship> iter = external_group;
    while (++iter) {
        Ship* s = iter.value();
        region = s->GetRegion();
        Observe(s);
    }
}
void
KeyDlg::OnApply(AWEvent* event)
{
    Starshatter* stars = Starshatter::GetInstance();

    if (stars) {
        KeyMap&        keymap   = stars->GetKeyMap();
        KeyMapEntry*   map      = keymap.GetKeyMap(key_index);

        if (key_clear) {
            map->key = 0;
            map->alt = 0;
            map->joy = 0;
        }

        if (key_key) {
            map->key = key_key;
            map->alt = key_shift;
        }

        if (key_joy) {
            map->joy = key_joy;
        }
    }

    if (manager)
        manager->ShowCtlDlg();
}
void
JoyDlg::OnApply(AWEvent* event)
{
	Starshatter* stars = Starshatter::GetInstance();

	if (stars) {
		KeyMap&  keymap    = stars->GetKeyMap();

		keymap.Bind(KEY_AXIS_YAW,        map_axis[0]+KEY_JOY_AXIS_X, 0);
		keymap.Bind(KEY_AXIS_PITCH,      map_axis[1]+KEY_JOY_AXIS_X, 0);
		keymap.Bind(KEY_AXIS_ROLL,       map_axis[2]+KEY_JOY_AXIS_X, 0);
		keymap.Bind(KEY_AXIS_THROTTLE,   map_axis[3]+KEY_JOY_AXIS_X, 0);

		keymap.Bind(KEY_AXIS_YAW_INVERT,       invert_checkbox[0]->GetButtonState(), 0);
		keymap.Bind(KEY_AXIS_PITCH_INVERT,     invert_checkbox[1]->GetButtonState(), 0);
		keymap.Bind(KEY_AXIS_ROLL_INVERT,      invert_checkbox[2]->GetButtonState(), 0);
		keymap.Bind(KEY_AXIS_THROTTLE_INVERT,  invert_checkbox[3]->GetButtonState(), 0);

		keymap.SaveKeyMap("key.cfg", 256);

		stars->MapKeys();
	}

	if (manager)
	manager->ShowCtlDlg();
}
void
CmpLoadDlg::ExecFrame()
{
	Starshatter* stars = Starshatter::GetInstance();

	if (stars) {
		if (lbl_activity) lbl_activity->SetText(stars->GetLoadActivity());
		if (lbl_progress) lbl_progress->SetValue(stars->GetLoadProgress());
	}
}
Beispiel #5
0
void
ExitDlg::OnApply(AWEvent* event)
{
    Starshatter* stars = Starshatter::GetInstance();

    if (stars) {
        ::Print("Exit Confirmed.\n");
        stars->Exit();
    }
}
void
CmpSceneDlg::Show()
{
    FormWindow::Show();

    Starshatter* stars = Starshatter::GetInstance();

    if (stars->InCutscene()) {
        Sim* sim = Sim::GetSim();

        if (sim) {
            cam_view->UseCamera(CameraDirector::GetInstance()->GetCamera());
            cam_view->UseScene(sim->GetScene());
        }

        // initialize lens flare bitmaps:
        if (stars->LensFlare()) {
            cam_view->LensFlareElements(flare1, flare4, flare2, flare3);
            cam_view->LensFlare(true);
        }

        // if lens flare disabled, just create the corona:
        else if (stars->Corona()) {
            cam_view->LensFlareElements(flare1, 0, 0, 0);
            cam_view->LensFlare(true);
        }

        if (disp_view) {
            old_disp_win = disp_view->GetWindow();

            disp_view->SetWindow(mov_scene);
            mov_scene->AddView(disp_view);
        }

        if (subtitles_box) {
            subtitles_box->SetText(stars->GetSubtitles());
            subtitles_delay = 0;
            subtitles_time  = 0;
        }
    }
}
void
KeyDlg::Show()
{
    FormWindow::Show();

    Starshatter* stars = Starshatter::GetInstance();

    if (stars) {
        KeyMap&  keymap    = stars->GetKeyMap();

        if (command)
            command->SetText(keymap.DescribeAction(key_index));

        if (current_key)
            current_key->SetText(keymap.DescribeKey(key_index));
    }

    key_clear = false;
    new_key->SetText("");
    SetFocus();
}
void
CmpSceneDlg::ExecFrame()
{
    Starshatter*   stars             = Starshatter::GetInstance();
    Mission*       cutscene_mission  = stars->GetCutsceneMission();

    if (cutscene_mission && disp_view) {
        disp_view->ExecFrame();

        if (subtitles_box && subtitles_box->GetLineCount() > 0) {
            if (subtitles_delay == 0) {
                int nlines = subtitles_box->GetLineCount();

                MissionEvent* begin_scene = cutscene_mission->FindEvent(MissionEvent::BEGIN_SCENE);
                MissionEvent* end_scene   = cutscene_mission->FindEvent(MissionEvent::END_SCENE);

                if (begin_scene && end_scene) {
                    double total_time = end_scene->Time() - begin_scene->Time();
                    subtitles_delay   = total_time / nlines;
                    subtitles_time    = Game::RealTime() / 1000.0 + subtitles_delay;
                }
                else {
                    subtitles_delay = -1;
                }
            }

            if (subtitles_delay > 0) {
                double seconds = Game::RealTime() / 1000.0;

                if (subtitles_time <= seconds) {
                    subtitles_time = seconds + subtitles_delay;
                    subtitles_box->Scroll(ScrollWindow::SCROLL_DOWN);
                }
            }
        }
    }
    else {
        manager->ShowCmdDlg();
    }
}
void
DebriefDlg::OnClose(AWEvent* event)
{
    Sim* sim = Sim::GetSim();

    sim->CommitMission();
    sim->UnloadMission();

    NetLobby* lobby = NetLobby::GetInstance();
    if (lobby && lobby->IsHost()) {
        lobby->SelectMission(0);
        lobby->ExecFrame();
    }

    Player* player = Player::GetCurrentPlayer();
    if (player && player->ShowAward()) {
        manager->ShowAwardDlg();
    }

    else {
        Starshatter* stars = Starshatter::GetInstance();

        if (stars) {
            Mouse::Show(false);

            Campaign* campaign = Campaign::GetCampaign();
            if (campaign && campaign->GetCampaignId() < Campaign::SINGLE_MISSIONS)
            stars->SetGameMode(Starshatter::CMPN_MODE);
            else
            stars->SetGameMode(Starshatter::MENU_MODE);
        }

        else {
            Game::Panic("DebriefDlg::OnClose() - Game instance not found");
        }
    }
}
void
LoadScreen::ShowLoadDlg()
{
	if (load_dlg)     load_dlg->Hide();
	if (cmp_load_dlg) cmp_load_dlg->Hide();

	Starshatter* stars = Starshatter::GetInstance();

	// show campaign load dialog if available and loading campaign
	if (stars && cmp_load_dlg) {
		if (stars->GetGameMode() == Starshatter::CLOD_MODE ||
				stars->GetGameMode() == Starshatter::CMPN_MODE) {
			cmp_load_dlg->Show();
			Mouse::Show(false);
			return;
		}
	}

	// otherwise, show regular load dialog
	if (load_dlg) {
		load_dlg->Show();
		Mouse::Show(false);
	}
}
void
LoadDlg::ExecFrame()
{
	Starshatter* stars = Starshatter::GetInstance();

	if (stars) {
		if (title) {
			if (stars->GetGameMode() == Starshatter::CLOD_MODE ||
					stars->GetGameMode() == Starshatter::CMPN_MODE)
			title->SetText(Game::GetText("LoadDlg.campaign"));

			else if (stars->GetGameMode() == Starshatter::MENU_MODE)
			title->SetText(Game::GetText("LoadDlg.tac-ref"));

			else
			title->SetText(Game::GetText("LoadDlg.mission"));
		}

		activity->SetText(stars->GetLoadActivity());
		progress->SetValue(stars->GetLoadProgress());
	}
}
Beispiel #12
0
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
	int   result    = 0;
	int   test_mode = 0;
	int   do_server = 0;

	if (strstr(lpCmdLine, "-server"))
		ErrLog = fopen("serverlog.txt", "w");
	else
		ErrLog = fopen("errlog.txt", "w");

	PrintLogHeader();

	if (strstr(lpCmdLine, "-test")) {
		Print("  Request TEST mode\n");
		test_mode = 1;
	}

	if (strstr(lpCmdLine, "-fps")) {
		HUDView::ShowFPS(true);
	}

	if (strstr(lpCmdLine, "-dump")) {
		Print("  Request dump dynamic missions\n");
		dump_missions = 1;
	}

	if (strstr(lpCmdLine, "-lan")) {
		Print("  Request LAN ONLY mode\n");
		NetBrokerClient::Disable();
	}

	if (strstr(lpCmdLine, "-server")) {
		do_server = 1;
		Print("  Request Standalone Server Mode\n");
	}

	char* d3dinfo = strstr(lpCmdLine, "-d3d");
	if (d3dinfo) {
		int n = d3dinfo[4] - '0';

		if (n >= 0 && n <= 5)
		VD3D_describe_things = n;

		Print("  D3D Info Level: %d\n", VD3D_describe_things);
	}
	else {
		VD3D_describe_things = 0;
	}


	// FREE VERSION - AUTHORIZATION DISABLED
	/*
::Print("  Checking authorization codes...\n");
if (!Authorization::IsUserAuthorized()) {
	if (!DataLoader::GetLoader()) {
		DataLoader::Initialize();
		DataLoader::GetLoader()->EnableDatafile("content.dat");
	}

	Game* game = new Game();
	game->InitContent();

	MessageBox(0, FormatTextEscape(Game::GetText("main.auth-invalid")).data(), 
					Game::GetText("main.title.error").data(), MB_OK);
	::Print("  Not authorized.\n");

	delete game;
	DataLoader::Close();
}
else {
	::Print("  Authorized\n");
	*/
	try {
		NetLayer net;

		if (do_server) {
			StarServer* server = new(__FILE__,__LINE__) StarServer();

			if (server->Init(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
			result = server->Run();

			Print("\n+====================================================================+\n");
			Print("  Begin Shutdown...\n");

			delete server;
		}

		else {
			Starshatter* stars = 0;
			
			stars = new(__FILE__,__LINE__) Starshatter;
			stars->SetTestMode(test_mode);

			if (stars->Init(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
			result = stars->Run();

			Print("\n+====================================================================+\n");
			Print("  Begin Shutdown...\n");

			delete stars;
		}

		Token::close();

		if (*Game::GetPanicMessage())
		MessageBox(0, Game::GetPanicMessage(), "Starshatter - Error", MB_OK);
	}

	catch (const char* msg) {
		Print("  FATAL EXCEPTION: '%s'\n", msg);
	}
	/* } */

	Memory::Stats();
	Memory::DumpLeaks();
	Memory::CloseLog();

	Print("+====================================================================+\n");
	Print(" END OF LINE.\n");

	fclose(ErrLog);

	return result;
}
void
CameraDirector::SetViewObject(Ship* obj, bool quick)
{
    if (!ship) return;
    if (!obj) {
        obj = ship;
        region = ship->GetRegion();
    }

    external_body  = 0;
    external_point = Point();

    Starshatter* stars = Starshatter::GetInstance();

    if (obj->GetIFF() != ship->GetIFF() && !stars->InCutscene()) {
        // only view solid contacts:
        Contact* c = ship->FindContact(obj);
        if (!c || !c->ActLock()) 
        return;
    }

    if (mode == MODE_TARGET) {
        ClearGroup();
        if (external_ship) {
            external_ship = 0;
        }
    }
    else if (mode >= MODE_ORBIT) {
        if (quick) {
            mode       = MODE_ORBIT;
            transition = 0;
        }
        else {
            SetMode(MODE_TRANSLATE);
        }

        if (external_group.size()) {
            ClearGroup();

            if (external_ship) {
                external_ship = 0;
            }
        }

        else {
            if ((obj == external_ship) || (obj==ship && external_ship==0)) {
                if (!quick)
                SetMode(MODE_ZOOM);
            }
            
            else if (external_ship) {
                external_ship = 0;
            }
        }
    }

    if (external_ship != obj) {
        external_ship = obj;

        if (external_ship) {
            region = external_ship->GetRegion();

            if (external_ship->Life() == 0 || external_ship->IsDying() || external_ship->IsDead()) {
                external_ship = 0;
                range_min = 100;
            }
            else {
                Observe(external_ship);

                if (sim)
                sim->ActivateRegion(external_ship->GetRegion());

                range_min = external_ship->Radius() * 1.5;
            }
        }

        Observe(external_ship);
        ExternalRange(1);
    }
}
Beispiel #14
0
void
QuitView::ExecFrame()
{
    sim = Sim::GetSim();

    if (show_menu) {
        Color::SetFade(1, Color::Black, 0);
        int action = 0;

        if (Mouse::LButton()) {
            mouse_latch = true;
        }
        else if (mouse_latch) {
            mouse_latch = false;

            if (Mouse::X() > xcenter - w2 && Mouse::X() < xcenter + w2) {
                int y0 = ycenter - h2;

                for (int i = 0; i < 4; i++)
                if (Mouse::Y() >= y0 + 75 + i * 30 && Mouse::Y() <= y0 + 105 + i * 30)
                action = i+1;
            }
        }

        for (int i = 1; i <= 4; i++) {
            if (Keyboard::KeyDown('0' + i))
            action = i;
        }

        // was mission long enough to accept?
        if (action == 1 && !CanAccept()) {
            Button::PlaySound(Button::SND_REJECT);
            action = 3;
        }

        // exit and accept:
        if (action == 1) {
            CloseMenu();
            Game::SetTimeCompression(1);

            Starshatter* stars = Starshatter::GetInstance();
            stars->SetGameMode(Starshatter::PLAN_MODE);
        }

        // quit and discard results:
        else if (action == 2) {
            CloseMenu();
            Game::SetTimeCompression(1);

            Starshatter*   stars    = Starshatter::GetInstance();
            Campaign*      campaign = Campaign::GetCampaign();

            // discard mission and events:
            if (sim) sim->UnloadMission();
            else ShipStats::Initialize();

            if (campaign && campaign->GetCampaignId() < Campaign::SINGLE_MISSIONS) {
                campaign->RollbackMission();
                stars->SetGameMode(Starshatter::CMPN_MODE);
            }

            else {
                stars->SetGameMode(Starshatter::MENU_MODE);
            }
        }

        // resume:
        else if (action == 3) {
            CloseMenu();
        }

        // controls:
        else if (action == 4) {
            GameScreen* game_screen = GameScreen::GetInstance();

            if (game_screen)
            game_screen->ShowCtlDlg();
            else
            CloseMenu();
        }
    }
}
void
CameraDirector::ExecFrame(double seconds)
{
    if (!ship)
    return;

    hud = HUDView::GetInstance();

    int flight_phase = ship->GetFlightPhase();

    if (flight_phase < Ship::LOCKED)
    SetMode(MODE_DOCKING);

    if (ship->IsAirborne()) {
        if (flight_phase >= Ship::DOCKING)
        SetMode(MODE_DOCKING);
    }
    else {
        if (flight_phase >= Ship::RECOVERY)
        SetMode(MODE_DOCKING);
    }

    if (flight_phase >= Ship::LOCKED && flight_phase < Ship::ACTIVE) {
        int m = GetMode();
        if (m != MODE_COCKPIT && m != MODE_VIRTUAL)
        SetMode(MODE_COCKPIT);
    }

    if (ship->InTransition()) {
        SetMode(MODE_DROP);
    }
    // automatically restore mode after transition:
    else if (old_mode != MODE_NONE) {
        mode           = old_mode;
        requested_mode = old_mode;
        old_mode       = MODE_NONE;
    }

    int op_mode = mode;
    if (requested_mode > mode)
    op_mode = requested_mode;

    Starshatter* stars = Starshatter::GetInstance();

    // if we are in padlock, and have not locked a ship
    // try to padlock the current target:
    if (op_mode == MODE_TARGET && !external_ship) {
        SimObject* tgt = ship->GetTarget();
        if (tgt && tgt->Type() == SimObject::SIM_SHIP)
        SetViewObject((Ship*) tgt);
    }

    // if in an external mode, check the external ship:
    else if (op_mode >= MODE_TARGET && op_mode <= MODE_ZOOM) {
        if (external_ship && external_ship != ship && !stars->InCutscene()) {
            Contact* c = ship->FindContact(external_ship);
            if (!c || !c->ActLock()) {
                SetViewObject(ship);
            }
        }
    }

    if (ship->Rep()) {
        if (op_mode == MODE_COCKPIT) {
            ship->HideRep();
            ship->HideCockpit();
        }
        else if (op_mode == MODE_VIRTUAL || op_mode == MODE_TARGET) {
            if (ship->Cockpit()) {
                ship->HideRep();
                ship->ShowCockpit();
            }
            else {
                ship->ShowRep();
            }
        }
        else {
            ship->Rep()->SetForeground(op_mode == MODE_DOCKING);
            ship->ShowRep();
            ship->HideCockpit();
        }
    }

    if (hud && hud->Ambient() != Color::Black)
    sim->GetScene()->SetAmbient( hud->Ambient() );
    else
    sim->GetScene()->SetAmbient( sim->GetStarSystem()->Ambient() );

    switch (op_mode) {
    default:
    case MODE_COCKPIT:      Cockpit(seconds);    break;
    case MODE_CHASE:        Chase(seconds);      break;
    case MODE_TARGET:       Target(seconds);     break;
    case MODE_THREAT:       Threat(seconds);     break;
    case MODE_VIRTUAL:      Virtual(seconds);    break;
    case MODE_ORBIT:
    case MODE_TRANSLATE:
    case MODE_ZOOM:         Orbit(seconds);      break;
    case MODE_DOCKING:      Docking(seconds);    break;
    case MODE_DROP:         Drop(seconds);       break;
    }

    if (ship->Shake() > 0 && 
            (op_mode <  MODE_ORBIT ||
                (op_mode == MODE_VIRTUAL && ship->Cockpit()))) {

        Point vib = ship->Vibration() * 0.2;
        camera.MoveBy(vib);
        camera.Aim(0, vib.y, vib.z);
    }

    Transition(seconds);
    DetailSet::SetReference(region, camera.Pos());
}
Beispiel #16
0
void
ShipCtrl::ExecFrame(double seconds)
{
    Starshatter* stars = Starshatter::GetInstance();
    if (stars && stars->GetChatMode())  return;
    if (!ship)                          return;

    const int DELTA_THROTTLE = 5;

    controller->Acquire();

    if (ship->IsStarship() && ship->GetFLCSMode() == Ship::FLCS_HELM) {
        ship->ApplyHelmPitch(controller->Pitch() * seconds);
        ship->ApplyHelmYaw(controller->Yaw() * seconds);
    }
    else {
        ship->ApplyRoll(controller->Roll());
        ship->ApplyPitch(controller->Pitch());
        ship->ApplyYaw(controller->Yaw());
    }

    ship->SetTransX(controller->X() * ship->Design()->trans_x);
    ship->SetTransY(controller->Y() * ship->Design()->trans_y);
    ship->SetTransZ(controller->Z() * ship->Design()->trans_z);

    bool augmenter = false;

    if (controller->Throttle() > 0.05) {
        if (throttle_active) {
            ship->SetThrottle(controller->Throttle() * 100);

            if (controller->Throttle() >= 0.99) 
            augmenter = true;
        }
        else if (!launch_latch || controller->Throttle() > 0.5) {
            throttle_active = true;
            launch_latch    = false;
        }
    }
    else if (throttle_active) {
        ship->SetThrottle(0);
        throttle_active = false;
    }

    ship->ExecFLCSFrame();

    static double time_til_change = 0.0;

    if (time_til_change < 0.001) {
        if (KeyDown(KEY_THROTTLE_UP)) {
            ship->SetThrottle(ship->Throttle() + DELTA_THROTTLE);
            time_til_change = 0.05;
        }
        
        else if (KeyDown(KEY_THROTTLE_DOWN)) {
            ship->SetThrottle(ship->Throttle() - DELTA_THROTTLE);
            time_til_change = 0.05;
        }

        else if (KeyDown(KEY_THROTTLE_ZERO)) {
            ship->SetThrottle(0);
            if (ship->GetFLCS())
            ship->GetFLCS()->FullStop();
            time_til_change = 0.05;
        }

        else if (KeyDown(KEY_THROTTLE_FULL)) {
            ship->SetThrottle(100);
            time_til_change = 0.05;
        }

        else if (KeyDown(KEY_FLCS_MODE_AUTO)) {
            ship->CycleFLCSMode();
            time_til_change = 0.5f;
        }

        else if (KeyDown(KEY_CYCLE_PRIMARY)) {
            HUDSounds::PlaySound(HUDSounds::SND_WEP_MODE);
            ship->CyclePrimary();
            time_til_change = 0.5f;
        }

        else if (KeyDown(KEY_CYCLE_SECONDARY)) {
            HUDSounds::PlaySound(HUDSounds::SND_WEP_MODE);
            ship->CycleSecondary();
            time_til_change = 0.5f;
        }

        if (ship->GetShield()) {
            Shield* shield = ship->GetShield();
            double  level  = shield->GetPowerLevel();

            if (KeyDown(KEY_SHIELDS_FULL)) {
                HUDSounds::PlaySound(HUDSounds::SND_SHIELD_LEVEL);
                shield->SetPowerLevel(100);
                time_til_change = 0.5f;
            }

            else if (KeyDown(KEY_SHIELDS_ZERO)) {
                HUDSounds::PlaySound(HUDSounds::SND_SHIELD_LEVEL);
                shield->SetPowerLevel(0);
                time_til_change = 0.5f;
            }

            else if (KeyDown(KEY_SHIELDS_UP)) {
                if (level < 25)      level =  25;
                else if (level < 50) level =  50;
                else if (level < 75) level =  75;
                else                 level = 100;

                HUDSounds::PlaySound(HUDSounds::SND_SHIELD_LEVEL);
                shield->SetPowerLevel(level);
                time_til_change = 0.5f;
            }

            else if (KeyDown(KEY_SHIELDS_DOWN)) {
                if (level > 75)      level =  75;
                else if (level > 50) level =  50;
                else if (level > 25) level =  25;
                else                 level =   0;

                HUDSounds::PlaySound(HUDSounds::SND_SHIELD_LEVEL);
                shield->SetPowerLevel(level);
                time_til_change = 0.5f;
            }

        }

        if (ship->GetSensor()) {
            Sensor* sensor = ship->GetSensor();

            if (sensor->GetMode() < Sensor::PST) {
                if (KeyDown(KEY_SENSOR_MODE)) {
                    int sensor_mode = sensor->GetMode() + 1;
                    if (sensor_mode > Sensor::GM)
                    sensor_mode = Sensor::PAS;

                    sensor->SetMode((Sensor::Mode) sensor_mode);
                    time_til_change = 0.5f;
                }

                else if (KeyDown(KEY_SENSOR_GROUND_MODE)) {
                    if (ship->IsAirborne()) {
                        sensor->SetMode(Sensor::GM);
                        time_til_change = 0.5f;
                    }
                }
            }
            else {
                // manual "return to search" command for starships:
                if (KeyDown(KEY_SENSOR_MODE)) {
                    ship->DropTarget();
                }
            }

            if (KeyDown(KEY_SENSOR_RANGE_PLUS)) {
                sensor->IncreaseRange();
                time_til_change = 0.5f;
            }

            else if (KeyDown(KEY_SENSOR_RANGE_MINUS)) {
                sensor->DecreaseRange();
                time_til_change = 0.5f;
            }
        }

        if (KeyDown(KEY_EMCON_PLUS)) {
            ship->SetEMCON(ship->GetEMCON()+1);
            time_til_change = 0.5f;
        }

        else if (KeyDown(KEY_EMCON_MINUS)) {
            ship->SetEMCON(ship->GetEMCON()-1);
            time_til_change = 0.5f;
        }
    }
    else
    time_til_change -= seconds;

    if (controller->ActionMap(KEY_ACTION_0))
    ship->FirePrimary();

    if (controller->ActionMap(KEY_ACTION_1)) {
        if (!pickle_latch)
        ship->FireSecondary();

        pickle_latch = true;
    }
    else {
        pickle_latch = false;
    }

    if (controller->ActionMap(KEY_ACTION_3)) {
        if (!target_latch)
        ship->LockTarget(SimObject::SIM_SHIP);

        target_latch = true;
    }
    else {
        target_latch = false;
    }

    ship->SetAugmenter(augmenter || (KeyDown(KEY_AUGMENTER) ? true : false));

    if (Toggled(KEY_DECOY))
    ship->FireDecoy();

    if (Toggled(KEY_LAUNCH_PROBE))
    ship->LaunchProbe();

    if (Toggled(KEY_GEAR_TOGGLE))
    ship->ToggleGear();

    if (Toggled(KEY_NAVLIGHT_TOGGLE))
    ship->ToggleNavlights();

    if (Toggled(KEY_LOCK_TARGET))
    ship->LockTarget(SimObject::SIM_SHIP, false, true);

    else if (Toggled(KEY_LOCK_THREAT))
    ship->LockTarget(SimObject::SIM_DRONE);

    else if (Toggled(KEY_LOCK_CLOSEST_SHIP))
    ship->LockTarget(SimObject::SIM_SHIP, true, false);

    else if (Toggled(KEY_LOCK_CLOSEST_THREAT))
    ship->LockTarget(SimObject::SIM_DRONE, true, false);

    else if (Toggled(KEY_LOCK_HOSTILE_SHIP))
    ship->LockTarget(SimObject::SIM_SHIP, true, true);

    else if (Toggled(KEY_LOCK_HOSTILE_THREAT))
    ship->LockTarget(SimObject::SIM_DRONE, true, true);

    else if (Toggled(KEY_CYCLE_SUBTARGET))
    ship->CycleSubTarget(1);

    else if (Toggled(KEY_PREV_SUBTARGET))
    ship->CycleSubTarget(-1);

    if (Toggled(KEY_AUTO_NAV)) {
        ship->SetAutoNav(true);
        // careful: this object has just been deleted!
        return;
    }

    if (Toggled(KEY_DROP_ORBIT)) {
        ship->DropOrbit();
        // careful: this object has just been deleted!
        return;
    }
}
void
RadioView::Refresh()
{
	sim = Sim::GetSim();

	if (!font)
	return;

	font->SetColor(txt_color);
	font->SetAlpha(1);

	if (sim && ship != sim->GetPlayerShip()) {
		ship = sim->GetPlayerShip();
		history.Clear();

		if (ship) {
			if (ship->Life() == 0 || ship->IsDying() || ship->IsDead()) {
				ship = 0;
			}
			else {
				Observe(ship);
			}
		}
	}

	QuantumView* qv = QuantumView::GetInstance();

	if (!qv || !qv->IsMenuShown()) {
		Menu* menu = history.GetCurrent();

		if (menu) {
			Rect menu_rect(width-115, 10, 115, 12);

			font->DrawText(menu->GetTitle(), 0, menu_rect, DT_CENTER);
			menu_rect.y += 15;

			ListIter<MenuItem> item = menu->GetItems();
			while (++item) {
				if (ship->GetEMCON() < 2 || 
						(TargetRequired(item.value()) && !ship->GetTarget()) ||
						item->GetText().contains("KIA")) {
					item->SetEnabled(false);
					font->SetAlpha(0.35);
				}
				else {
					item->SetEnabled(true);
					font->SetAlpha(1);
				}

				font->DrawText(item->GetText(), 0, menu_rect, DT_LEFT);
				menu_rect.y += 10;
			}
		}
	}

	int message_queue_empty = true;

	// age messages:
	for (int i = 0; i < MAX_MSG; i++) {
		if (msg_time[i] > 0) {
			msg_time[i] -= Game::GUITime();

			if (msg_time[i] <= 0) {
				msg_time[i] = 0;
				msg_text[i] = "";
			}

			message_queue_empty = false;
		}
	}

	if (!message_queue_empty) {
		// advance message pipeline:
		for (int i = 0; i < MAX_MSG; i++) {
			if (msg_time[0] == 0) {
				for (int j = 0; j < MAX_MSG-1; j++) {
					msg_time[j] = msg_time[j+1];
					msg_text[j] = msg_text[j+1];
				}

				msg_time[MAX_MSG-1] = 0;
				msg_text[MAX_MSG-1] = "";
			}
		}

		bool hud_off = false;

		if (HUDView::GetInstance())
		hud_off = (HUDView::GetInstance()->GetHUDMode() == HUDView::HUD_MODE_OFF);

		// draw messages:
		if (!hud_off) {
			for (int i = 0; i < MAX_MSG; i++) {
				if (msg_time[i] > 0) {
					Rect msg_rect(0, 95 + i*10, width, 12);

					if (msg_time[i] > 1)
					font->SetAlpha(1);
					else
					font->SetAlpha(0.5 + 0.5*msg_time[i]);

					font->DrawText(msg_text[i].data(), msg_text[i].length(), msg_rect, DT_CENTER);
				}
			}

			font->SetAlpha(1);
		}
	}

	Starshatter* stars = Starshatter::GetInstance();
	if (stars && stars->GetChatMode()) {
		Text chat;

		switch (stars->GetChatMode()) {
		case 1:  chat = "ALL:  ";  break;
		case 2:  chat = "TEAM:  ";  break;
		case 3:  chat = "WING:  ";  break;
		case 4:  chat = "UNIT:  ";  break;
		}

		chat += stars->GetChatText();

		Rect chat_rect(width/2 - 250, height-150, 500, 12);
		font->DrawText(chat, 0, chat_rect, DT_LEFT);

		chat_rect.Inflate(2,2);
		window->DrawRect(chat_rect, hud_color);
	}
}
void
GameScreen::ExecFrame()
{
	sim = Sim::GetSim();

	if (sim) {
		cam_view->UseCamera(CameraDirector::GetInstance()->GetCamera());
		cam_view->UseScene(sim->GetScene());

		Ship* player = sim->GetPlayerShip();

		if (player) {
			bool dialog_showing = false;

			if (hud_view) {
				hud_view->UseCameraView(cam_view);
				hud_view->ExecFrame();
			}

			if (quit_view && quit_view->IsMenuShown()) {
				quit_view->ExecFrame();
				dialog_showing = true;
			}

			if (navdlg && navdlg->IsShown()) {
				navdlg->SetShip(player);
				navdlg->ExecFrame();
				dialog_showing = true;
			}

			if (engdlg && engdlg->IsShown()) {
				engdlg->SetShip(player);
				engdlg->ExecFrame();
				dialog_showing = true;
			}

			if (fltdlg && fltdlg->IsShown()) {
				fltdlg->SetShip(player);
				fltdlg->ExecFrame();
				dialog_showing = true;
			}

			if (auddlg && auddlg->IsShown()) {
				auddlg->ExecFrame();
				dialog_showing = true;
			}

			if (viddlg && viddlg->IsShown()) {
				viddlg->ExecFrame();
				dialog_showing = true;
			}

			if (optdlg && optdlg->IsShown()) {
				optdlg->ExecFrame();
				dialog_showing = true;
			}

			if (ctldlg && ctldlg->IsShown()) {
				ctldlg->ExecFrame();
				dialog_showing = true;
			}

			if (keydlg && keydlg->IsShown()) {
				keydlg->ExecFrame();
				dialog_showing = true;
			}

			if (joydlg && joydlg->IsShown()) {
				joydlg->ExecFrame();
				dialog_showing = true;
			}

			if (moddlg && moddlg->IsShown()) {
				moddlg->ExecFrame();
				dialog_showing = true;
			}

			if (quantum_view && !dialog_showing) {
				quantum_view->ExecFrame();
			}

			if (radio_view && !dialog_showing) {
				radio_view->ExecFrame();
			}

			if (wep_view && !dialog_showing) {
				wep_view->ExecFrame();
			}

			if (tac_view && !dialog_showing) {
				if (cam_view)
				tac_view->UseProjector(cam_view->GetProjector());
				tac_view->ExecFrame();
			}
		}

		if (disp_view) {
			disp_view->ExecFrame();
		}
	}

	Starshatter* stars = Starshatter::GetInstance();

	if (stars) {
		if (stars->LensFlare()) {
			cam_view->LensFlareElements(flare1, flare4, flare2, flare3);
			cam_view->LensFlare(true);
		}

		else if (stars->Corona()) {
			cam_view->LensFlareElements(flare1, 0, 0, 0);
			cam_view->LensFlare(true);
		}

		else {
			cam_view->LensFlare(false);
		}
	}
}
void
GameScreen::Setup(Screen* s)
{
	if (!s)
	return;

	screen = s;

	loader->UseFileSystem(true);

	// create windows
	gamewin = new(__FILE__,__LINE__) Window(screen, 0, 0, screen->Width(), screen->Height());

	// attach views to windows (back to front)
	// fade in:
	gamewin->AddView(new(__FILE__,__LINE__) FadeView(gamewin, 1, 0, 0));

	// camera:
	cam_dir  = CameraDirector::GetInstance();
	cam_view = new(__FILE__,__LINE__) CameraView(gamewin, cam_dir->GetCamera(), 0);

	if (cam_view)
	gamewin->AddView(cam_view);

	// HUD:
	hud_view = new(__FILE__,__LINE__) HUDView(gamewin);
	gamewin->AddView(hud_view);

	wep_view = new(__FILE__,__LINE__) WepView(gamewin);
	gamewin->AddView(wep_view);

	quantum_view = new(__FILE__,__LINE__) QuantumView(gamewin);
	gamewin->AddView(quantum_view);

	radio_view = new(__FILE__,__LINE__) RadioView(gamewin);
	gamewin->AddView(radio_view);

	tac_view = new(__FILE__,__LINE__) TacticalView(gamewin, this);
	gamewin->AddView(tac_view);

	disp_view = DisplayView::GetInstance();

	// note: quit view must be last in chain 
	// so it can release window surface
	quit_view = new(__FILE__,__LINE__) QuitView(gamewin);
	gamewin->AddView(quit_view);

	Starshatter* stars = Starshatter::GetInstance();

	// initialize lens flare bitmaps:
	if (stars->LensFlare()) {
		cam_view->LensFlareElements(flare1, flare4, flare2, flare3);
		cam_view->LensFlare(true);
	}

	// if lens flare disabled, just create the corona:
	else if (stars->Corona()) {
		cam_view->LensFlareElements(flare1, 0, 0, 0);
		cam_view->LensFlare(true);
	}

	screen->AddWindow(gamewin);

	FormDef aud_def("AudDlg", 0);
	aud_def.Load("AudDlg");
	auddlg = new(__FILE__,__LINE__) AudDlg(screen, aud_def, this);

	FormDef ctl_def("CtlDlg", 0);
	ctl_def.Load("CtlDlg");
	ctldlg = new(__FILE__,__LINE__) CtlDlg(screen, ctl_def, this);

	FormDef opt_def("OptDlg", 0);
	opt_def.Load("OptDlg");
	optdlg = new(__FILE__,__LINE__) OptDlg(screen, opt_def, this);

	FormDef vid_def("VidDlg", 0);
	vid_def.Load("VidDlg");
	viddlg = new(__FILE__,__LINE__) VidDlg(screen, vid_def, this);

	FormDef mod_def("ModDlg", 0);
	mod_def.Load("ModDlg");
	moddlg = new(__FILE__,__LINE__) ModDlg(screen, mod_def, this);

	FormDef joy_def("JoyDlg", 0);
	joy_def.Load("JoyDlg");
	joydlg = new(__FILE__,__LINE__) JoyDlg(screen, joy_def, this);

	FormDef key_def("KeyDlg", 0);
	key_def.Load("KeyDlg");
	keydlg = new(__FILE__,__LINE__) KeyDlg(screen, key_def, this);

	FormDef mod_info_def("ModInfoDlg", 0);
	mod_info_def.Load("ModInfoDlg");
	modInfoDlg = new(__FILE__,__LINE__) ModInfoDlg(screen, mod_info_def, this);

	FormDef nav_def("NavDlg", 0);
	nav_def.Load("NavDlg");
	navdlg = new(__FILE__,__LINE__) NavDlg(screen, nav_def, this);

	FormDef eng_def("EngDlg", 0);
	eng_def.Load("EngDlg");
	engdlg = new(__FILE__,__LINE__) EngDlg(screen, eng_def, this);

	FormDef flt_def("FltDlg", 0);
	flt_def.Load("FltDlg");
	fltdlg = new(__FILE__,__LINE__) FltDlg(screen, flt_def, this);

	if (engdlg)  engdlg->Hide();
	if (fltdlg)  fltdlg->Hide();
	if (navdlg)  navdlg->Hide();
	if (auddlg)  auddlg->Hide();
	if (viddlg)  viddlg->Hide();
	if (optdlg)  optdlg->Hide();
	if (ctldlg)  ctldlg->Hide();
	if (keydlg)  keydlg->Hide();
	if (joydlg)  joydlg->Hide();
	if (moddlg)  moddlg->Hide();
	if (modInfoDlg) modInfoDlg->Hide();

	screen->SetBackgroundColor(Color::Black);

	frame_rate = 0;

	loader->UseFileSystem(Starshatter::UseFileSystem());
}
void
CmdIntelDlg::ExecFrame()
{
	CmdDlg::ExecFrame();

	if (campaign != Campaign::GetCampaign() || campaign->GetUpdateTime() != update_time) {
		campaign    = Campaign::GetCampaign();
		update_time = campaign->GetUpdateTime();

		lst_news->ClearItems();
		txt_news->SetText("");

		if (img_news)
		img_news->SetPicture(bmp_default);
	}

	if (campaign) {
		List<CombatEvent>& events      = campaign->GetEvents();
		bool               auto_scroll = false;

		if (events.size() > lst_news->NumItems()) {
			while (events.size() > lst_news->NumItems()) {
				CombatEvent* info = events[lst_news->NumItems()];

				const char* unread = info->Visited() ? " " : "*";
				int i = lst_news->AddItemWithData(unread, (DWORD) info) - 1;

				char dateline[32];
				FormatDayTime(dateline, info->Time());
				lst_news->SetItemText(i, 1, dateline);
				lst_news->SetItemText(i, 2, info->Title());
				lst_news->SetItemText(i, 3, info->Region());
				lst_news->SetItemText(i, 4, Game::GetText(info->SourceName()));

				if (!info->Visited())
				auto_scroll = true;
			}

			if (lst_news->GetSortColumn() > 0)
			lst_news->SortItems();
		}

		else if (events.size() < lst_news->NumItems()) {
			lst_news->ClearItems();

			for (int i = 0; i < events.size(); i++) {
				CombatEvent* info = events[i];

				const char* unread = info->Visited() ? " " : "*";
				int j = lst_news->AddItemWithData(unread, (DWORD) info) - 1;

				char dateline[32];
				FormatDayTime(dateline, info->Time());
				lst_news->SetItemText(j, 1, dateline);
				lst_news->SetItemText(j, 2, info->Title());
				lst_news->SetItemText(j, 3, info->Region());
				lst_news->SetItemText(j, 4, Game::GetText(info->SourceName()));

				if (!info->Visited())
				auto_scroll = true;
			}

			if (lst_news->GetSortColumn() > 0)
			lst_news->SortItems();

			txt_news->SetText("");

			if (img_news)
			img_news->SetPicture(bmp_default);
		}

		if (auto_scroll) {
			int first_unread = -1;

			for (int i = 0; i < lst_news->NumItems(); i++) {
				if (lst_news->GetItemText(i, 0) == "*") {
					first_unread = i;
					break;
				}
			}

			if (first_unread >= 0)
			lst_news->ScrollTo(first_unread);
		}
	}

	Starshatter* stars = Starshatter::GetInstance();

	if (start_scene > 0) {
		ShowMovie();

		start_scene--;

		if (start_scene == 0) {
			if (stars && campaign) {
				stars->ExecCutscene(event_scene, campaign->Path());

				if (stars->InCutscene()) {
					Sim* sim = Sim::GetSim();

					if (sim) {
						cam_view->UseCamera(CameraDirector::GetInstance()->GetCamera());
						cam_view->UseScene(sim->GetScene());
					}
				}
			}

			event_scene = "";
		}
	}
	else {
		if (dsp_view)
		dsp_view->ExecFrame();

		if (stars->InCutscene())
		ShowMovie();
		else
		HideMovie();
	}
}
void
MissionEvent::Execute(bool silent)
{
	Starshatter*   stars    = Starshatter::GetInstance();
	HUDView*       hud      = HUDView::GetInstance();
	Sim*           sim      = Sim::GetSim();
	Ship*          player   = sim->GetPlayerShip();
	Ship*          ship     = 0;
	Ship*          src      = 0;
	Ship*          tgt      = 0;
	Element*       elem     = 0;
	int            pan      = 0;
	bool           end_mission = false;

	if (event_ship.length())
	ship = sim->FindShip(event_ship);
	else
	ship = player;

	if (event_source.length())
	src = sim->FindShip(event_source);

	if (event_target.length())
	tgt = sim->FindShip(event_target);

	if (ship)
	elem = ship->GetElement();

	else if (event_ship.length()) {
		elem = sim->FindElement(event_ship);

		if (elem)
		ship = elem->GetShip(1);
	}

	// expire the delay, if any remains
	delay = 0;

	// fire the event action
	switch (event) {
	case MESSAGE:
		if (event_message.length() > 0) {
			if (ship) {
				RadioMessage* msg = new(__FILE__,__LINE__) RadioMessage(ship, src, event_param[0]);
				msg->SetInfo(event_message);
				msg->SetChannel(ship->GetIFF());
				if (tgt)
				msg->AddTarget(tgt);
				RadioTraffic::Transmit(msg);
			}

			else if (elem) {
				RadioMessage* msg = new(__FILE__,__LINE__) RadioMessage(elem, src, event_param[0]);
				msg->SetInfo(event_message);
				msg->SetChannel(elem->GetIFF());
				if (tgt)
				msg->AddTarget(tgt);
				RadioTraffic::Transmit(msg);
			}
		}

		if (event_sound.length() > 0) {
			pan = event_param[0];
		}
		break;

	case OBJECTIVE: 
		if (elem) {
			if (event_param[0]) {
				elem->ClearInstructions();
				elem->ClearObjectives();
			}

			Instruction* obj = new(__FILE__,__LINE__) Instruction(event_param[0], 0);
			obj->SetTarget(event_target);
			elem->AddObjective(obj);

			if (elem->Contains(player)) {
				HUDView* hud = HUDView::GetInstance();

				if (hud)
				hud->ShowHUDInst();
			}
		}
		break;

	case INSTRUCTION:
		if (elem) {
			if (event_param[0])
			elem->ClearInstructions();

			elem->AddInstruction(event_message);

			if (elem->Contains(player) && event_message.length() > 0) {
				HUDView* hud = HUDView::GetInstance();

				if (hud)
				hud->ShowHUDInst();
			}
		}
		break;

	case IFF:
		if (elem) {
			elem->SetIFF(event_param[0]);
		}

		else if (ship) {
			ship->SetIFF(event_param[0]);
		}
		break;

	case DAMAGE:
		if (ship) {
			ship->InflictDamage(event_param[0]);

			if (ship->Integrity() < 1) {
				NetUtil::SendObjKill(ship, 0, NetObjKill::KILL_MISC);
				ship->DeathSpiral();
				Print("    %s Killed By Scripted Event %d (%s)\n", (const char*) ship->Name(), id, FormatGameTime());
			}
		}
		else {
			Print("   EVENT %d: Could not apply damage to ship '%s' (not found).\n", id, (const char*) event_ship);
		}
		break;

	case JUMP:
		if (ship) {
			SimRegion* rgn = sim->FindRegion(event_target);

			if (rgn && ship->GetRegion() != rgn) {
				if (rgn->IsOrbital()) {
					QuantumDrive* quantum_drive = ship->GetQuantumDrive();
					if (quantum_drive) {
						quantum_drive->SetDestination(rgn, Point(0,0,0));
						quantum_drive->Engage(true); // request immediate jump
					}

					else if (ship->IsAirborne()) {
						ship->MakeOrbit();
					}
				}

				else {
					ship->DropOrbit();
				}
			}

		}
		break;

	case HOLD:
		if (elem)
		elem->SetHoldTime(event_param[0]);
		break;

	case SKIP: {
			for (int i = 0; i < event_nparams; i++) {
				int skip_id = event_param[i];

				ListIter<MissionEvent> iter = sim->GetEvents();
				while (++iter) {
					MissionEvent* e = iter.value();
					if (e->EventID() == skip_id) {
						if (e->status != COMPLETE)
						e->status = SKIPPED;
					}
				}
			}
		}
		break;

	case END_MISSION:
		Print("    END MISSION By Scripted Event %d (%s)\n", id, FormatGameTime());
		end_mission = true;
		break;

		//
		// NOTE: CUTSCENE EVENTS DO NOT APPLY IN MULTIPLAYER
		//
	case BEGIN_SCENE:
		Print("    ------------------------------------\n");
		Print("    Begin Cutscene '%s'\n", event_message.data());
		stars->BeginCutscene();
		break;

	case END_SCENE:
		Print("    End Cutscene '%s'\n", event_message.data());
		Print("    ------------------------------------\n");
		stars->EndCutscene();
		break;

	case CAMERA:
		if (stars->InCutscene()) {
			CameraDirector* cam_dir = CameraDirector::GetInstance();

			if (!cam_dir->GetShip())
			cam_dir->SetShip(player);

			switch (event_param[0]) {
			case 1:  
				if (cam_dir->GetMode() != CameraDirector::MODE_COCKPIT)
				cam_dir->SetMode(CameraDirector::MODE_COCKPIT, event_rect.x);
				break;

			case 2:
				if (cam_dir->GetMode() != CameraDirector::MODE_CHASE)
				cam_dir->SetMode(CameraDirector::MODE_CHASE, event_rect.x);
				break;

			case 3:
				if (cam_dir->GetMode() != CameraDirector::MODE_ORBIT)
				cam_dir->SetMode(CameraDirector::MODE_ORBIT, event_rect.x);
				break;

			case 4:
				if (cam_dir->GetMode() != CameraDirector::MODE_TARGET)
				cam_dir->SetMode(CameraDirector::MODE_TARGET, event_rect.x);
				break;
			}

			if (event_target.length()) {
				::Print("Mission Event %d: setting camera target to %s\n", id, (const char*) event_target);
				Ship* s_tgt = 0;
				
				if (event_target.indexOf("body:") < 0)
				s_tgt = sim->FindShip(event_target);

				if (s_tgt) {
					::Print("   found ship %s\n", s_tgt->Name());
					cam_dir->SetViewOrbital(0);

					if (cam_dir->GetViewObject() != s_tgt) {

						if (event_param[0] == 6) {
							s_tgt->DropCam(event_param[1], event_param[2]);
							cam_dir->SetShip(s_tgt);
							cam_dir->SetMode(CameraDirector::MODE_DROP, 0);
						}
						else {
							Ship* cam_ship = cam_dir->GetShip();

							if (cam_ship && cam_ship->IsDropCam()) {
								cam_ship->CompleteTransition();
							}

							if (cam_dir->GetShip() != sim->GetPlayerShip())
							cam_dir->SetShip(sim->GetPlayerShip());
							cam_dir->SetViewObject(s_tgt, true); // immediate, no transition
						}
					}
				}

				else {
					const char* body_name = event_target.data();

					if (!strncmp(body_name, "body:", 5))
					body_name += 5;

					Orbital* orb = sim->FindOrbitalBody(body_name);

					if (orb) {
						::Print("   found body %s\n", orb->Name());
						cam_dir->SetViewOrbital(orb);
					}
				}
			}

			if (event_param[0] == 3) {
				cam_dir->SetOrbitPoint(event_point.x, event_point.y, event_point.z);
			}

			else if (event_param[0] == 5) {
				cam_dir->SetOrbitRates(event_point.x, event_point.y, event_point.z);
			}
		}
		break;

	case VOLUME:
		if (stars->InCutscene()) {
			AudioConfig* audio_cfg = AudioConfig::GetInstance();

			audio_cfg->SetEfxVolume(event_param[0]);
			audio_cfg->SetWrnVolume(event_param[0]);
		}
		break;

	case DISPLAY:
		if (stars->InCutscene()) {
			DisplayView* disp_view = DisplayView::GetInstance();

			if (disp_view) {
				Color color;
				color.Set(event_param[0]);

				if (event_message.length() && event_source.length()) {

					if (event_message.contains('$')) {
						Campaign*      campaign = Campaign::GetCampaign();
						Player*        user     = Player::GetCurrentPlayer();
						CombatGroup*   group    = campaign->GetPlayerGroup();

						if (user) {
							event_message = FormatTextReplace(event_message, "$NAME",  user->Name().data());
							event_message = FormatTextReplace(event_message, "$RANK",  Player::RankName(user->Rank()));
						}

						if (group) {
							event_message = FormatTextReplace(event_message, "$GROUP", group->GetDescription());
						}

						if (event_message.contains("$TIME")) {
							char timestr[32];
							FormatDayTime(timestr, campaign->GetTime(), true);
							event_message = FormatTextReplace(event_message, "$TIME", timestr);
						}
					}

					disp_view->AddText(  event_message,
					FontMgr::Find(event_source),
					color,
					event_rect,
					event_point.y,
					event_point.x,
					event_point.z);

				}

				else if (event_target.length()) {
					DataLoader* loader = DataLoader::GetLoader();

					if (loader) {
						loader->SetDataPath(0);
						loader->LoadBitmap(event_target, image, 0, true);
					}

					if (image.Width() && image.Height())
					disp_view->AddImage( &image,
					color,
					Video::BLEND_ALPHA,
					event_rect,
					event_point.y,
					event_point.x,
					event_point.z);
				}
			}
		}
		break;

	case FIRE_WEAPON:
		if (ship) {
			// fire single weapon:
			if (event_param[0] >= 0) {
				ship->FireWeapon(event_param[0]);
			}

			// fire all weapons:
			else {
				ListIter<WeaponGroup> g_iter = ship->Weapons();
				while (++g_iter) {
					ListIter<Weapon> w_iter = g_iter->GetWeapons();
					while (++w_iter) {
						Weapon* w = w_iter.value();
						w->Fire();
					}
				}
			}
		}
		break;

	default:
		break;
	}

	sim->ProcessEventTrigger(TRIGGER_EVENT, id);

	if (!silent && !sound && event_sound.length()) {
		DataLoader* loader = DataLoader::GetLoader();
		bool        use_fs = loader->IsFileSystemEnabled();
		DWORD       flags  = pan ? Sound::LOCKED|Sound::LOCALIZED : 
		Sound::LOCKED|Sound::AMBIENT;

		loader->UseFileSystem(true);
		loader->SetDataPath("Sounds/");
		loader->LoadSound(event_sound, sound, flags);
		loader->SetDataPath(0);

		if (!sound) {
			loader->SetDataPath("Mods/Sounds/");
			loader->LoadSound(event_sound, sound, flags);
			loader->SetDataPath(0);
		}

		if (!sound) {
			loader->LoadSound(event_sound, sound, flags);
		}

		loader->UseFileSystem(use_fs);

		// fire and forget:
		if (sound) {
			if (sound->GetFlags() & Sound::STREAMED) {
				sound->SetFlags(flags | sound->GetFlags());
				sound->SetVolume(AudioConfig::VoxVolume());
				sound->Play();
			}
			else {
				sound->SetFlags(flags);
				sound->SetVolume(AudioConfig::VoxVolume());
				sound->SetPan(pan);
				sound->SetFilename(event_sound);
				sound->AddToSoundCard();
				sound->Play();
			}
		}
	}

	status = COMPLETE;

	if (end_mission) {
		StarServer*  server = StarServer::GetInstance();

		if (stars) {
			stars->EndMission();
		}

		else if (server) {
			// end mission event uses event_target member
			// to forward server to next mission in the chain:
			if (event_target.length())
			server->SetNextMission(event_target);

			server->SetGameMode(StarServer::MENU_MODE);
		}
	}
}