void CriminalScreenInterface::UpdateScreen () { if ( IsVisible () ) { Computer *comp = game->GetWorld ()->GetComputer ( "Global Criminal Database" ); UplinkAssert (comp); Record *rec = comp->recordbank.GetRecord ( recordindex ); char *thisname = rec->GetField ( RECORDBANK_NAME ); char *history = rec->GetField ( "Convictions" ); Person *person = game->GetWorld ()->GetPerson ( thisname ); // Update display with the current record if ( thisname ) EclGetButton ( "criminal_name" )->SetCaption ( thisname ); if ( history ) EclGetButton ( "criminal_history" )->SetCaption ( history ); // Show a photo if ( person ) { char filename [256]; UplinkSnprintf ( filename, sizeof ( filename ), "photos/image%d.tif", person->photoindex ); button_assignbitmap ( "criminal_photo", filename ); } else { button_assignbitmap ( "criminal_photo", "photos/image0.tif" ); } } }
void CriminalScreenInterface::AddConvictionClick ( Button *button ) { CriminalScreenInterface *csi = (CriminalScreenInterface *) GetInterfaceScreen ( SCREEN_CRIMINALSCREEN ); UplinkAssert (csi); if ( csi->recordindex != -1 ) { char *newconviction = EclGetButton ( "criminal_newconvictiontext" )->caption; Computer *comp = game->GetWorld ()->GetComputer ( "Global Criminal Database" ); UplinkAssert (comp); if ( comp->security.IsRunning_Proxy () ) { create_msgbox ( "Error", "Denied access by Proxy Server" ); return; } Record *rec = comp->recordbank.GetRecord ( csi->recordindex ); UplinkAssert (rec); char *existing = rec->GetField ( "Convictions" ); //UplinkAssert (existing); if ( existing ) { std::ostrstream newconvictions; if ( strstr ( existing, "None" ) == NULL ) newconvictions << existing << "\n"; newconvictions << newconviction << '\x0'; rec->ChangeField ( "Convictions", newconvictions.str () ); newconvictions.rdbuf()->freeze( 0 ); //delete [] newconvictions.str (); } EclGetButton ( "criminal_newconvictiontext" )->SetCaption ( "" ); csi->UpdateScreen (); } }
void UserIDScreenInterface::ProceedClick ( Button *button ) { // If disconnected which can happend when dialling. if ( !game->GetWorld ()->GetPlayer ()->IsConnected () ) return; char *name = EclGetButton ( "useridscreen_name" )->caption; char *code = EclGetButton ( "useridscreen_code" )->caption; if ( strlen ( name ) >= SIZE_PERSON_NAME ) name [ SIZE_PERSON_NAME - 1 ] = '\0'; if ( strlen ( code ) >= 64 ) code [ 64 - 1 ] = '\0'; // Look up that code in this computer's records UserIDScreen *uid = (UserIDScreen *) game->GetInterface ()->GetRemoteInterface ()->GetComputerScreen (); UplinkAssert (uid); Computer *comp = uid->GetComputer (); UplinkAssert (comp); Record *rec = comp->recordbank.GetRecordFromNamePassword ( name, code ); if ( rec ) { SgPlaySound ( RsArchiveFileOpen("sounds/login.wav"), "sounds/login.wav", false ); // This is our code int security; char *securitytext = rec->GetField ( RECORDBANK_SECURITY ); if ( securitytext ) sscanf ( securitytext, "%d", &security ); else security = 10; game->GetInterface ()->GetRemoteInterface ()->SetSecurity ( name, security ); // Add this into the computer's logs AccessLog *log = new AccessLog (); char logdetails [256]; UplinkSnprintf ( logdetails, sizeof ( logdetails ), "User [%s] logged on (level %d)", name, security ); log->SetProperties ( &(game->GetWorld ()->date), game->GetWorld ()->GetPlayer ()->GetConnection ()->GetGhost (), "PLAYER" ); log->SetData1 ( logdetails ); comp->logbank.AddLog ( log ); if ( strcmp ( name, "admin" ) == 0 ) game->GetWorld ()->GetPlayer ()->GetConnection ()->BeginTrace (); // Always trace admin access if ( uid->nextpage != -1 ) game->GetInterface ()->GetRemoteInterface ()->RunScreen ( uid->nextpage, uid->GetComputer () ); return; } // If we get this far then the access code is not valid EclRegisterCaptionChange ( "useridscreen_message", "Invalid Name or Code" ); }
void CriminalScreenInterface::Update () { if ( searchname && IsVisible () ) { int timems = (int)EclGetAccurateTime () - lastupdate; if ( timems > 100 ) { // We are searching for a record // Is this one it? Computer *comp = game->GetWorld ()->GetComputer ( "Global Criminal Database" ); UplinkAssert (comp); // Have we searched all records? //if ( recordindex == comp->recordbank.records.Size () ) { if ( recordindex == -1 ) { delete [] searchname; searchname = NULL; recordindex = -1; return; } Record *rec = comp->recordbank.GetRecord ( recordindex ); char *thisname = rec->GetField ( RECORDBANK_NAME ); UplinkAssert (thisname); char *lowercasethisname = LowerCaseString (thisname); // Update display with the current record UpdateScreen (); if ( strcmp ( searchname, lowercasethisname ) == 0 ) { // Record found - stop searching delete [] searchname; searchname = NULL; } else { // Record not found //recordindex++; recordindex = comp->recordbank.FindNextRecordIndexNameNotSystemAccount ( recordindex ); } delete [] lowercasethisname; lastupdate = (int)EclGetAccurateTime (); } } }
void CriminalScreenInterface::ArrestClick ( Button *button ) { CriminalScreenInterface *csi = (CriminalScreenInterface *) GetInterfaceScreen ( SCREEN_CRIMINALSCREEN ); UplinkAssert (csi); if ( csi->recordindex != -1 ) { Computer *comp = game->GetWorld ()->GetComputer ( "Global Criminal Database" ); UplinkAssert (comp); if ( comp->security.IsRunning_Proxy () ) { create_msgbox ( "Error", "Denied access by Proxy Server" ); return; } Record *rec = comp->recordbank.GetRecord ( csi->recordindex ); UplinkAssert (rec); char *name = rec->GetField ( RECORDBANK_NAME ); UplinkAssert (name); char *convictions = rec->GetField ( "Convictions" ); //UplinkAssert (convictions); // Only do this if the person now has at least 3 convicions // AND has broken parole int numconvictions = 0; bool brokenparole = false; if ( convictions ) { char *current = strchr ( convictions, '\n' ); while ( current ) { ++numconvictions; current = strchr ( current+1, '\n' ); } brokenparole = strstr ( convictions, "parole" ) || strstr ( convictions, "Parole" ); } if ( numconvictions >= 2 && brokenparole ) { // This person is going down Date rundate; rundate.SetDate ( &(game->GetWorld ()->date) ); rundate.AdvanceMinute ( TIME_LEGALACTION ); ArrestEvent *ae = new ArrestEvent (); ae->SetName ( name ); ae->SetReason ( "breaking parole after 2 previous convictions" ); ae->SetRunDate ( &rundate ); game->GetWorld ()->scheduler.ScheduleEvent ( ae ); rundate.AdvanceMinute ( TIME_LEGALACTION_WARNING * -1 ); game->GetWorld ()->scheduler.ScheduleWarning ( ae, &rundate ); char message [128]; UplinkSnprintf ( message, sizeof ( message ), "Authorisation Accepted\nThis man will be arrested in %d hours.", TIME_LEGALACTION / 60 ); create_msgbox ( "Arrest Authorised", message ); } else { create_msgbox ( "Arrest Not Authorised", "Authorisation rejected\nA suspect must have 2 prior convictions " "and must have broken parole before an arrest can be authorised remotely." ); } } }