LRESULT CAppWindow::OnLoginStateChanged(WAVE_CONNECTION_STATE nStatus, WAVE_LOGIN_ERROR nError) { CHECK_ENUM(nStatus, WCS_MAX); CHECK_ENUM(nError, WLE_MAX); if (!AllowContextMenu()) { EndMenu(); } switch (nStatus) { case WCS_BEGIN_LOGON: case WCS_BEGIN_SIGNOUT: StartWorking(); break; case WCS_LOGGED_ON: StopWorking(); ProcessLoggedOn(); break; case WCS_RECONNECTING: StartWorking(); ProcessReconnecting(); break; case WCS_CONNECTED: StopWorking(); ProcessConnected(); break; case WCS_FAILED: StopWorking(); break; case WCS_SIGNED_OUT: StopWorking(); ProcessSignedOut(); break; } return 0; }
/** * * * @author OLiver */ void nofCarrier::Walked() { // Bootssounds ggf. löschen if(ct == CT_BOAT && state != CARRS_FIGUREWORK) SOUNDMANAGER.WorkingFinished(this); switch(state) { default: break; case CARRS_GOTOMIDDLEOFROAD: { // Gibts an der Flagge in der entgegengesetzten Richtung, in die ich laufe, evtl Waren zu tragen // (da wir darüber nicht unmittelbar informiert werden!) if(workplace->AreWareJobs(rs_dir, ct, false)) { // Dann umdrehen und holen rs_dir = !rs_dir; rs_pos = workplace->GetLength() - rs_pos; state = CARRS_FETCHWARE; StartWalking(cur_rs->GetDir(rs_dir, rs_pos)); } else if(rs_pos == cur_rs->GetLength() / 2 || rs_pos == cur_rs->GetLength() / 2 + cur_rs->GetLength() % 2) { // Wir sind in der Mitte angekommen state = CARRS_WAITFORWARE; if(GetCurMoveDir() == 0 || GetCurMoveDir() == 1 || GetCurMoveDir() == 5) FaceDir(5); else FaceDir(4); current_ev = 0; // Jetzt wird wieder nur rumgegammelt, dann kriegen wir aber evtl keinen schönen IH-AH! StopWorking(); // Animation auf später verschieben, damit die nicht mittendrin startet SetNewAnimationMoment(); } else { // Eventuell laufen wir in die falsche Richtung? if(rs_pos > cur_rs->GetLength() / 2) { rs_dir = !rs_dir; rs_pos = cur_rs->GetLength() - rs_pos; } StartWalking(cur_rs->GetDir(rs_dir, rs_pos)); } } break; case CARRS_FETCHWARE: { // Zur Flagge laufen, um die Ware zu holen // Sind wir schon da? if(rs_pos == cur_rs->GetLength()) // Dann Ware aufnehmnen FetchWare(false); else StartWalking(cur_rs->GetDir(rs_dir, rs_pos)); } break; case CARRS_CARRYWARE: { // Sind wir schon da? if(rs_pos == cur_rs->GetLength()) { // Flagge, an der wir gerade stehen noFlag* this_flag = static_cast<noFlag*>(((rs_dir) ? workplace->GetF1() : workplace->GetF2())); bool calculated = false; // Will die Waren jetzt gleich zur Baustelle neben der Flagge? if(WantInBuilding(&calculated)) { // Erst noch zur Baustelle bzw Gebäude laufen state = CARRS_CARRYWARETOBUILDING; StartWalking(1); cur_rs = this_flag->routes[1]; // location wird immer auf nächste Flagge gesetzt --> in dem Fall aktualisieren carried_ware->Carry((cur_rs->GetF1() == this_flag) ? cur_rs->GetF2() : cur_rs->GetF1()); } else { // Ist an der Flagge noch genügend Platz (wenn wir wieder eine Ware mitnehmen, kann sie auch voll sein) if(this_flag->IsSpaceForWare()) { carried_ware->LieAtFlag(this_flag); // Ware soll ihren weiteren Weg berechnen if (!calculated) { carried_ware->RecalcRoute(); } // Ware ablegen this_flag->AddWare(carried_ware); // Wir tragen erstmal keine Ware mehr carried_ware = 0; // Gibts an den Flaggen etwas, was ich tragen muss, ansonsten wieder in die Mitte gehen und warten LookForWares(); } else if(workplace->AreWareJobs(!rs_dir, ct, true)) { // die Flagge ist voll, aber wir können eine Ware mitnehmen, daher erst Ware nehmen und dann erst ablegen // Ware "merken" Ware* tmp_ware = carried_ware; // neue Ware aufnehmen FetchWare(true); // alte Ware ablegen tmp_ware->LieAtFlag(this_flag); if (!calculated) { tmp_ware->RecalcRoute(); } this_flag->AddWare(tmp_ware); } else { // wenn kein Platz mehr ist --> wieder umdrehen und zurückgehen state = CARRS_GOBACKFROMFLAG; rs_dir = !rs_dir; rs_pos = cur_rs->GetLength() - rs_pos; StartWalking((GetCurMoveDir() + 3) % 6); } } } else if(rs_pos == cur_rs->GetLength() - 1) { // Wenn wir fast da sind, gucken, ob an der Flagge noch ein freier Platz ist noFlag* this_flag = static_cast<noFlag*>(((rs_dir) ? workplace->GetF1() : workplace->GetF2())); if(this_flag->IsSpaceForWare() || WantInBuilding(NULL) || cur_rs->AreWareJobs(!rs_dir, ct, true)) { // Es ist Platz, dann zur Flagge laufen StartWalking(cur_rs->GetDir(rs_dir, rs_pos)); } else { // Wenn kein Platz ist, stehenbleiben und warten! state = CARRS_WAITFORWARESPACE; FaceDir(cur_rs->GetDir(rs_dir, rs_pos)); } } else { StartWalking(cur_rs->GetDir(rs_dir, rs_pos)); } } break; case CARRS_CARRYWARETOBUILDING: { // Ware ablegen gwg->GetSpecObj<noRoadNode>(pos)->AddWare(carried_ware); // Ich trag' keine Ware mehr carried_ware = 0; // Wieder zurück zu meinem Weg laufen state = CARRS_LEAVEBUILDING; StartWalking(4); } break; case CARRS_LEAVEBUILDING: { // So tun, als ob der Träger gerade vom anderen Ende des Weges kommt, damit alles korrekt funktioniert cur_rs = workplace; FaceDir(workplace->GetDir(rs_dir, workplace->GetLength() - 1)); LookForWares(); } break; case CARRS_GOBACKFROMFLAG: { // Wieder umdrehen und so tun, als wären wir gerade normal angekommen rs_dir = !rs_dir; rs_pos = cur_rs->GetLength() - rs_pos; state = CARRS_CARRYWARE; Walked(); } break; case CARRS_BOATCARRIER_WANDERONWATER: { WanderOnWater(); } break; } }