//-------- Begin of static function put_news_rec --------// // static void put_news_rec(int recNo, int x, int y, int refreshFlag) { #if(defined(CHINESE)) //SXM y+=4; //SXM #endif News* newsPtr = news_array[ news_array.size()-recNo+1 ]; // display in reversed order font_bld.put( x+20, y, date.date_str(newsPtr->news_date, 1) ); talk_res.msg_add_nation_color = 1; font_bld.put_paragraph( x+110, y, browse_news.ix2-30, y+30, newsPtr->msg() ); talk_res.msg_add_nation_color = 0; //----- display and detect the go icon -----// if( newsPtr->is_loc_valid() ) { image_icon.put_back( x+2, y+1, "NEWS_GO" ); if( mouse.single_click(x+2, y+1, x+17, y+16) ) { vga.use_front(); world.go_loc( newsPtr->loc_x, newsPtr->loc_y, 1 ); // 1-select object on the location if there is any vga.use_back(); } } }
//------- Begin of function TaskArray::next_day -----// void TaskArray::next_day() { // - will be removed from the objective/task section after the task offer expires or the task is completed // - checked monthly the success of the task; add bonus if task is completed Task* taskPtr; // return if not start of a month if ( info.game_day != 1) { //## chea 210899 BUGHERE the news date will not match return; } //--------------------// for( int i=size() ; i>0 ; i-- ) { taskPtr = operator[](i); // already completed if ( taskPtr->task_msg_subtype == TASK_COMPLETED ) continue; if ( (taskPtr->*(task_info_array[taskPtr->id-1].is_completed_func))() == true ) { // add msg to news array news_array.new_task(taskPtr, TASK_COMPLETED); // 1126 don't remove if complete // remove(i); taskPtr->set_completed(); } //else if ( (*taskPtr->expiry_func)() == true ) else if ( (taskPtr->*(task_info_array[taskPtr->id-1].is_expired_func))() == true ) { news_array.new_task(taskPtr, TASK_EXPIRED); // add msg to news array //------- set for newspaper display --------// News* newsPtr = news_array[news_array.size()]; chance_event.news_str=newsPtr->msg(); chance_event.news_news_str=chance_event.news_str; // memcpy(chance_event.news_date_str,date.date_str(newsPtr->news_date),55); strncpy(chance_event.news_date_str, info.date_str_julian(newsPtr->news_date), 55 ); chance_event.news_date_str[55-1] = '\0'; // chance_event.date_str=date.date_str( newsPtr->news_date, 1, 0 ); chance_event.date_str=info.date_str_julian(newsPtr->news_date, INFO_DATE_DEFAULT|INFO_DATE_SHORT_MONTH|INFO_DATE_NO_DAY); remove(i); } sys.yield(); } }
void NewsScreenInterface::DrawNewsButton ( Button *button, bool highlighted, bool clicked ) { int index; sscanf ( button->name, "news_story %d", &index ); index += baseoffset; clear_draw ( button->x, button->y, button->width, button->height ); // Get the text from news item (index + baseoffset) CompanyUplink *cu = (CompanyUplink *) game->GetWorld ()->GetCompany ( "Uplink" ); UplinkAssert ( cu ); News *news = cu->GetNews (index); if ( news ) { int screenheight = app->GetOptions ()->GetOptionValue ( "graphics_screenheight" ); glScissor ( button->x, screenheight - (button->y + button->height), button->width, button->height ); glEnable ( GL_SCISSOR_TEST ); if ( index == currentselect ) { glBegin ( GL_QUADS ); SetColour ( "PanelHighlightA" ); glVertex2i ( button->x, button->y ); SetColour ( "PanelHighlightB" ); glVertex2i ( button->x + button->width, button->y ); SetColour ( "PanelHighlightA" ); glVertex2i ( button->x + button->width, button->y + button->height ); SetColour ( "PanelHighlightB" ); glVertex2i ( button->x, button->y + button->height ); glEnd (); } else { if ( index % 2 == 0 ) { glBegin ( GL_QUADS ); SetColour ( "DarkPanelA" ); glVertex2i ( button->x, button->y + button->height ); SetColour ( "DarkPanelB" ); glVertex2i ( button->x, button->y ); SetColour ( "DarkPanelA" ); glVertex2i ( button->x + button->width, button->y ); SetColour ( "DarkPanelB" ); glVertex2i ( button->x + button->width, button->y + button->height ); glEnd (); } else { glBegin ( GL_QUADS ); SetColour ( "DarkPanelB" ); glVertex2i ( button->x, button->y + button->height ); SetColour ( "DarkPanelA" ); glVertex2i ( button->x, button->y ); SetColour ( "DarkPanelB" ); glVertex2i ( button->x + button->width, button->y ); SetColour ( "DarkPanelA" ); glVertex2i ( button->x + button->width, button->y + button->height ); glEnd (); } } if ( highlighted ) { SetColour ( "PanelHighlightBorder" ); border_draw ( button ); } // Get the date and subject char date [64]; char subject [256]; UplinkStrncpy ( subject, news->headline, sizeof ( subject ) ); UplinkStrncpy ( date, news->date.GetShortString (), sizeof ( date ) ); // Get the first line of the news story char *fulldetails = news->GetDetails (); char *firstendline = strchr ( fulldetails, '\n' ); if ( firstendline && firstendline - fulldetails > 255 ) firstendline = fulldetails + 255; char details [256]; if ( firstendline ) { strncpy ( details, news->GetDetails (), ( firstendline - fulldetails ) + 1 ); details[firstendline - fulldetails] = '\x0'; // Added by Contraband } else UplinkStrncpy ( details, " ", sizeof ( details ) ); // Draw the text items SetColour ( "DefaultText" ); GciDrawText ( button->x + 110, button->y + 10, subject ); GciDrawText ( button->x + 5, button->y + 10, date ); SetColour ( "DimmedText" ); GciDrawText ( button->x + 110, button->y + 25, details ); glDisable ( GL_SCISSOR_TEST ); } }
void NewsGenerator::Arrested ( Person *person, Computer *comp, char *reason ) { UplinkAssert ( person ); UplinkAssert ( reason ); // comp can be NULL /* ========================================================== Structure: Headline Part1 : Intro and basic overview part2 : Background of person part3 : World reaction / consequences ========================================================== */ std::ostrstream headline; std::ostrstream part1, part2, part3; part1 << "Earlier today a man was arrested by Federal Agents for " << reason; // ================================================================================================================ // Civilian caught // ================================================================================================================ if ( person->rating.uplinkrating == 0 ) { switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : headline << "Man arrested for Computer Crime"; break; case 2 : headline << "Police arrest suspect in Computer fraud crime"; break; case 3 : headline << "Federal agents arrest suspect in dawn raid"; break; } part2 << "The man arrested, who has been named as " << person->name << ", has protested his innocence " "from the start, claiming he has no knowledge of Computers at all and could not have " "committed this crime."; switch ( NumberGenerator::RandomNumber ( 2 ) + 1 ) { case 1 : part3 << "The man will face court in a few months time for these crimes and could serve " " several years in jail for this crime."; break; case 2 : part3 << "This case will go to court and he may face some time in jail. " "Friends and family today began a campaign to prove his innocence, claiming " "that he does not have the knowledge or equipment necessary to complete " "the crimes he is accused of."; break; } } // ================================================================================================================ // Amateur hacker caught // ================================================================================================================ else if ( person->rating.uplinkrating < 3 ) { switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : headline << "Amateur hacker caught and arrested"; break; case 2 : headline << "Federal Agents catch hacker red handed"; break; case 3 : headline << "Part-time hacker brought to justice"; break; } part2 << "The man has been named by Federal Agents as " << person->name << ", and is on record with a " "history of small time computer crime. Police who arrested him found Computer equipment and " "hardware for hacking in his house. It is believed this man was a part-time employee of the " "underground hacker group Uplink-Corporation, where he went by the hacker alias of " << ((Agent *) person)->handle << "."; part3 << "He may not get a chance to hack again however, as he could face up to ten years in prison."; } // ================================================================================================================ // Experienced hacker caught // ================================================================================================================ else if ( person->rating.uplinkrating < 11 ) { switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : headline << "Experienced computer hacker finally caught"; break; case 2 : headline << "Federal Agents catch up with underground Hacker"; break; case 3 : headline << "High-ranked Uplink Agent arrested"; break; } part2 << "The man's real name is " << person->name << " and he is a well known player in the underground " "hacker scene. It is believed he is a full-time freelance hacker, working for several organised " "groups including the well known Uplink-Corporation, where he went by the hacker alias of " << ((Agent *) person)->handle << "."; part3 << "Police suspect this man of multiple computer crimes and as such it is believed he will serve " "between ten and fifteen years inprisonment, and most likely a life ban on the use of computers."; } // ================================================================================================================ // Hacker demi-god caught // ================================================================================================================ else { switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : headline << "Hacker ring-leader arrested in dawn raid"; break; case 2 : headline << "Police arrest hacker 'Demi-God'"; break; case 3 : headline << "Federal Agents pleased with arrest of hacker leader"; break; } part2 << "The man in question is " << person->name << " and he is a well established member of the secretive " "underground hacker movement Uplink-Corporation, where he worked behind the hacker alias of " << ((Agent *) person)->handle << ". His rating is incredibly high, suggesting a long " "history of computer crime. Police have had a file on this many for several years but have finally " "caught him red handed."; part3 << "Due to the nature of his history, it is believed the prosecution may push for a life sentence for " "this man. The courts are becoming increasingly hostile to hackers and they may decide to deal a " "heavy punishment to this hacker as a warning to others."; } // // Concatenate each part together and post it // headline << '\x0'; part1 << '\x0'; part2 << '\x0'; part3 << '\x0'; std::ostrstream details; details << part1.str () << "\n\n" << part2.str () << "\n\n" << part3.str () << '\x0'; News *news = new News (); news->SetHeadline ( headline.str () ); news->SetDetails ( details.str () ); news->SetData ( NEWS_TYPE_ARREST, person->name, comp ? comp->ip : NULL ); headline.rdbuf()->freeze( 0 ); part1.rdbuf()->freeze( 0 ); part2.rdbuf()->freeze( 0 ); part3.rdbuf()->freeze( 0 ); details.rdbuf()->freeze( 0 ); //delete [] headline.str (); //delete [] part1.str (); //delete [] part2.str (); //delete [] part3.str (); //delete [] details.str (); CompanyUplink *cu = (CompanyUplink *) game->GetWorld ()->GetCompany ( "Uplink" ); UplinkAssert (cu); cu->CreateNews ( news ); }
void NewsGenerator::AllFilesDeleted ( Computer *comp, char *filetype ) { // Filetype is SCIENTIFIC, CORPORATE, CUSTOMER or SOFTWARE UplinkAssert (comp); /* =========================================================== Structure: Headline Part1 : Who was broken into, all files where deleted Part2 : Type of data / use of computer Part3 : Consequences / actions =========================================================== */ std::ostrstream headline; std::ostrstream part1, part2, part3; switch ( comp->NumRecentHacks () ) { case 0: case 1: part1 << comp->companyname << " found themselves in the public eye today as one of their " "primary computer systems suffered a complete failure, resulting in a large amount " "of lost data."; break; case 2: part1 << comp->companyname << " again found themselves in trouble as gigaquds of data where " "wiped from their system. In a statement today the company claimed it had evidence " "that the files where deliberately deleted by a malicious hacker."; break; default: part1 << comp->companyname << " are today boosting their security systems as their file servers " "suffered yet another complete failure. The company has come under attack on several " "occasions in the last month by hackers who have yet to be identified."; break; }; if ( strcmp ( filetype, "SCIENTIFIC" ) == 0 ) { headline << "Computer failure blaimed for research loss"; part2 << "The data deleted was the combined results of a large scale scientific test, being conducted " "by " << comp->companyname << " in order to develop new technology."; part3 << "In a statement today the company said that serious damage had been done and that it " "could cost the company millions of dollars to perform the research again."; } else if ( strcmp ( filetype, "CORPORATE" ) == 0 ) { headline << "Major corporation suffers complete data loss"; part2 << "The company found that masses of corporate data has been destroyed."; part3 << "It is not known how much this will cost the company but there is little doubt that serious damage " "has been done. This level of data loss could not occur without serious repurcusions."; } else if ( strcmp ( filetype, "CUSTOMER" ) == 0 ) { headline << comp->companyname << " loses gigaquads of customer data due to 'malicious hackers'"; part2 << "The computer system that was damaged was used to hold customer records and sales data. It is " "believed that all backups of the data were also destroyed, leading the company to believe that " "this was a deliberate act."; part3 << comp->companyname << " today issued a statement saying that they were investigating the incident."; } else if ( strcmp ( filetype, "SOFTWARE" ) == 0 ) { headline << "Proprietary software source code deleted by hacker"; part2 << "Upon investigating the damaged computer, the company found that much of their software that was " "still in development had been deleted, along with all source code and back ups. It was claimed " "that the revolutionary software would dominate the market once released."; part3 << comp->companyname << " have undoubtably suffered a large loss here, which could cost the company " "millions."; } // // Concatenate each part together and post it // headline << '\x0'; part1 << '\x0'; part2 << '\x0'; part3 << '\x0'; std::ostrstream details; details << part1.str () << "\n\n" << part2.str () << "\n\n" << part3.str () << '\x0'; News *news = new News (); news->SetHeadline ( headline.str () ); news->SetDetails ( details.str () ); news->SetData ( NEWS_TYPE_DELETED, comp->ip ); headline.rdbuf()->freeze( 0 ); part1.rdbuf()->freeze( 0 ); part2.rdbuf()->freeze( 0 ); part3.rdbuf()->freeze( 0 ); details.rdbuf()->freeze( 0 ); //delete [] headline.str (); //delete [] part1.str (); //delete [] part2.str (); //delete [] part3.str (); //delete [] details.str (); CompanyUplink *cu = (CompanyUplink *) game->GetWorld ()->GetCompany ( "Uplink" ); UplinkAssert (cu); cu->CreateNews ( news ); }
void NewsGenerator::AllFilesStolen ( Computer *comp, char *filetype, int totalfilesize ) { UplinkAssert (comp); // Filetype is SCIENTIFIC, CORPORATE, CUSTOMER or SOFTWARE /* ======================================================= Structure: Headline Part1 : Who was broken into, all files stolen Part2 : Possible use of computer / type of data / Total size Part3 : Consequences / Actions ====================================================== */ std::ostrstream headline; std::ostrstream part1, part2, part3; totalfilesize = 10 * int(totalfilesize/10); switch ( comp->NumRecentHacks () ) { case 0: case 1: part1 << comp->companyname << " discovered this morning that a massive quantity of computer data " "had been stolen from one of their Central Mainframes."; break; case 2: part1 << "A computer hacker entered the Central File Server of " << comp->companyname << " today and " "copied a huge portion of computer data to an unknown location. This incident comes less than " "a month after a similar incident where their central mainframe was compromised."; break; case 3: part1 << comp->companyname << " are once again reviewing their security procedures after revealing that " "their central mainframe has been compromised for the third time in a month, with massive amounts " "of confidential data being transfered away."; break; default: part1 << comp->companyname << " have suffered yet another embarrassing security breach, today revealing " "that a massive quantity of private data was stolen from their central mainframe. This system has " "been targetted repeatedly in recent times."; }; if ( strcmp ( filetype, "SCIENTIFIC" ) == 0 ) { headline << "Gigaquads of scientific data copied by hacker"; part2 << "The stolen files contained data from a massive scientific research program, which " << comp->companyname << " had been working on for the past 3 years.\n" << "Around " << totalfilesize << " Gigaquads of data was copied before the intruder disconnected."; part3 << comp->companyname << " will undoubtedly try to discover the corporation behind this theft."; } else if ( strcmp ( filetype, "CORPORATE" ) == 0 ) { headline << "No data is secure - GigaQuads stolen in 'impossible' hack"; part2 << "It is believed around " << totalfilesize << " Gigaquads of confidential " "corporate data was stolen by this hacker, and it was probably copied to a temporary fileserver somewhere " "on the web."; part3 << comp->companyname << " have said that they are considering all options to catch this hacker, and " "the corporation that paid him."; } else if ( strcmp ( filetype, "CUSTOMER" ) == 0 ) { headline << "Personal customer data copied by hacker"; part2 << "The computer system stored hundreds of GigaQuads of personal data on all of the corporation's customers. " "This data is now in the public domain. Over " << totalfilesize << " Gigaquads of data was stolen."; part3 << comp->companyname << " tried to reassure the public today, and issued a statement saying they had brought " "in Federal Agents to try and find the corporation responsible."; } else if ( strcmp ( filetype, "SOFTWARE" ) == 0 ) { headline << "Two years of software development - stolen"; part2 << comp->companyname << " had been working on several advanced software products and this computer system " "was their primary file server. Most of their proprietary source code has been copied - over " << totalfilesize << " Gigaquads of data, immediately " "compromising several of their planned security systems."; part3 << "Federal Agents have been called in to help track down the Corporation and the hacker responsible."; } // // Concatenate each part together and post it // headline << '\x0'; part1 << '\x0'; part2 << '\x0'; part3 << '\x0'; std::ostrstream details; details << part1.str () << "\n\n" << part2.str () << "\n\n" << part3.str () << '\x0'; News *news = new News (); news->SetHeadline ( headline.str () ); news->SetDetails ( details.str () ); news->SetData ( NEWS_TYPE_STOLEN, comp->ip ); headline.rdbuf()->freeze( 0 ); part1.rdbuf()->freeze( 0 ); part2.rdbuf()->freeze( 0 ); part3.rdbuf()->freeze( 0 ); details.rdbuf()->freeze( 0 ); //delete [] headline.str (); //delete [] part1.str (); //delete [] part2.str (); //delete [] part3.str (); //delete [] details.str (); CompanyUplink *cu = (CompanyUplink *) game->GetWorld ()->GetCompany ( "Uplink" ); UplinkAssert (cu); cu->CreateNews ( news ); }
void NewsGenerator::ComputerDestroyed ( Computer *comp, bool filesdeleted ) { UplinkAssert ( comp ); /* ========================================================== Structure headline Part1 : Who was broken into, everything destroyed Part2 : Details of destruction part2b : (If applicable) Files recovered Part3 : Consequences Part4 : Actions ========================================================== */ std::ostrstream headline; std::ostrstream part1, part2, part3, part4; switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : headline << "Hackers take down major computer system"; break; case 2 : headline << "Large corporation stung by malicious hacker attack"; break; case 3 : headline << "Aggressive computer attacker leaves system crippled"; break; } switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : part1 << comp->companyname << " have taken a major blow to their operations today as a malicious " "computer hacker penetrated one of their key computer systems and caused terminal damage."; break; case 2 : part1 << "A lone hacker has penetrated one of the primary computer systems of " << comp->companyname << " and deliberately shut down the system."; break; case 3 : part1 << "Federal agents are now searching for the identity of a computer criminal " "who broke into the " << comp->name << " and deliberately destroyed the machine."; break; } switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : part2 << "It has been difficult to piece together exactly what happened, but it appears " "that a system wide failure of the computer system was caused by the hackers actions. " "Experts say the entire operating system will have to be replaced."; break; case 2 : part2 << "Industry experts have re-created the final moments of the system crash from " "access logs on another machine. A few moments before the computer shut down, a lone " "hacker forced his way into the system after bypassing the security, entered into " "administrative mode and deleted several key system files, causing the machine to malfunction."; break; case 3 : part2 << "A single hacker is responsible for this high-tech crime. Moments before the failure " "he hacked into the system and deliberatly brought about its destruction. The exact method has " "not yet been determined."; break; } if ( filesdeleted ) { part2 << "\nThe company stated in their press release that all files had been totally destroyed."; } else { part2 << "\nExtensive damage was done but the company has been able to salvage most of the data."; } switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : part3 << "The city witnessed a sharp drop in the share price today as news of this disaster " "reached investors. It seems that nobody is safe after such a high profile system is destroyed. " << comp->companyname << " said that millions of credits of damage had been done already."; break; case 2 : part3 << "This system failure will cost the company dearly. It seems the data on the system is " "lost for good, and the costs of repairing this damage could spiral into millions of dollars. " "Industry analysts say the company is looking at some rough times ahead."; break; case 3 : part3 << "Today the company chairman tried to play down the significance of this event, no doubt " "trying to avoid a public relations disaster as well as a system failure. There can be little " "doubt that this set back will cost the company dearly."; break; } switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : part4 << "Company executives today released a press statement, indicating they were investigating " "the incident and would be seeking outside assistance from industry professionals."; break; case 2 : part4 << "Federal agents have been brought in on the case and will no doubt be searching for " "the identity of this dangerous computer hacker."; break; case 3 : part4 << comp->companyname << " have tightened security on their remaining computer systems, " "and federal agents from the government cyber-crimes division were seen entering the corporate " "headquarters today."; break; } // // Concatenate each part together and post it // headline << '\x0'; part1 << '\x0'; part2 << '\x0'; part3 << '\x0'; part4 << '\x0'; std::ostrstream details; details << part1.str () << "\n\n" << part2.str () << "\n\n" << part3.str () << "\n\n" << part4.str () << '\x0'; News *news = new News (); news->SetHeadline ( headline.str () ); news->SetDetails ( details.str () ); if ( filesdeleted ) news->SetData ( NEWS_TYPE_COMPUTERDESTROYED, comp->ip ); else news->SetData ( NEWS_TYPE_COMPUTERSHUTDOWN, comp->ip ); headline.rdbuf()->freeze( 0 ); part1.rdbuf()->freeze( 0 ); part2.rdbuf()->freeze( 0 ); part3.rdbuf()->freeze( 0 ); part4.rdbuf()->freeze( 0 ); details.rdbuf()->freeze( 0 ); //delete [] headline.str (); //delete [] part1.str (); //delete [] part2.str (); //delete [] part3.str (); //delete [] part4.str (); //delete [] details.str (); CompanyUplink *cu = (CompanyUplink *) game->GetWorld ()->GetCompany ( "Uplink" ); UplinkAssert (cu); cu->CreateNews ( news ); }
void NewsGenerator::ComputerHacked ( Computer *comp, AccessLog *al ) { UplinkAssert (comp); UplinkAssert (al); /* ========================================================== Structure: Headline Part1 : Basic intro (eg ss databased hacked again) Part2 : Recent number of hacks [part3 : Date of attack] ( automatic ) part4 : Future or existing effects of hack part5 : Promised action part6 : Misc ========================================================== */ std::ostrstream headline; std::ostrstream part1, part2, part3, part4, part5, part6; // ================================================================================================================ // Social security database // ================================================================================================================ if ( strcmp ( comp->name, "International Social Security Database" ) == 0 ) { switch ( comp->NumRecentHacks () ) { case 0: case 1: headline << "Government social security records compromised"; part1 << "The Government run social security database has been hacked by an unknown cyber criminal."; part2 << "Government officials insist this is the first and only incident of its kind."; part4 << "In theory, unlawful changes to this database could result in dead people being reported as alive, " "or alive people being reported as dead. Other personal information could be stolen."; part5 << "A government federal agent today stated that this would not be allowed to happen again."; break; case 2: headline << "Social security hacked twice in less than a month"; part1 << "The Government run social security database has once again been hacked by an unknown cyber criminal. "; part2 << "This is the second time in less than a month that this system has been attacked. " "It is not known if these two incidents are connected."; part4 << "A hacker gaining access to this system could do untold damage by modifying crucial personal data."; part5 << "The government today launched an investigation into these recent security problems."; break; case 3: headline << "Government held Files compromised for the third time"; part1 << "For the third time in less than a month, the government owned Social Security Database has been hacked."; part4 << "The system holds key personal data on millions of people and has been the cause of some embarrasment recently " "for the government."; part5 << "The potential for damage on this system is huge, prompting calls by opposition parties for a full " "review of all security protocols."; break; default: switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : headline << "Government Social Security files accessed again"; part4 << "The system holds personal data on the general population, but could be maliciously used to create " "new identities or tamper with existing ones."; break; case 2 : headline << "Social Security computer once again hacked"; part4 << "It is feared that the many recent hacks of this system may lead to a lack of trust in its data, which " "is used all over industry for many purposes."; break; case 3 : headline << "Government maintained Social Security documents come under attack again"; part4 << "In theory, a skilled hacker could manufacture a new identity, or tamper with an existing record " "to cause damage to a person's records. "; break; } switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : part2 << "This system has been hacked multiple times in the last month, prompting heavy critisism from some opposition parties."; break; case 2 : part2 << "This is not the first time this has happened; this system has been tampered with more than once recently."; break; case 3 : part2 << "The Government is once again on the defensive as this system seems to be almost wide open to abuse."; break; } switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : part1 << "Government social security documents have been accessed once again."; part5 << "Government spokesmen today insisted they had the situation under control, despite recent history."; break; case 2 : part1 << "Government maintained Social Security documents have come under attack yet again."; part5 << "The government is said to be considering many options on how to stop these attacks."; break; case 3 : part1 << "The Goverment owned Social Security computer has once again been hacked by an unknown Cyber criminal."; part5 << "Federal agents have been called in to help catch the criminals responsible for this action."; break; } break; } } // ================================================================================================================ // Academic database // ================================================================================================================ else if ( strcmp ( comp->name, "International Academic Database" ) == 0 ) { switch ( comp->NumRecentHacks () ) { case 0: case 1: headline << "Government run academic database hacked"; part1 << "The International Academic Database has been compromised by malicious hacker."; part2 << "Until today this system was thought to be secure against this type of attack."; part4 << "The motives of the hacker are not clear but it is thought he was attempting to forge " "qualifications for an unknown recipient."; part5 << "Government agents made it clear they would not tolerate this action and have already taken steps " "to secure the database against future action."; break; case 2: headline << "Academic records hacked again"; part1 << "The International Academic Database has been hacked for the second time in less than a month."; part4 << "It is not known if the two attacks are connected."; part5 << "The government today began an investigation into these attacks."; break; case 3: headline << "Government academic database hacked again"; part1 << "The Government is on the defensive again today as its International Academic Database is hacked again."; part2 << "This attack comes less than a week after a recent hack and is the third this month."; part4 << "It is believed that an individual or small group is attempting to create new academic details and qualifications, " "perhaps offering this as a service."; part5 << "Federal agents have been brought in to investigate."; break; default: switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : headline << "Government embarresed over repeated security failures"; part5 << "The Government has again promised to put a stop to these hacks quickly."; break; case 2 : headline << "International Academic Database hacked again"; part5 << "The Government seems to be at a loss as to what to do about these recent attacks."; break; case 3 : headline << "Federal Agents investigate Academic Database hacks"; part5 << "Federal Agents from the computer crimes division where today tasked with catching the criminals involved " "and determining what damage has been done."; break; } switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : part2 << "Security on this computer has been bypassed repeadly in the last month."; break; case 2 : part2 << "This attack is the latest in a string of hacks performed in the last month."; break; case 3 : part2 << "Federal agents seem unable to stop a torrent of recent hacks on this system."; break; } switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : part1 << "The Government Academic Database has been hacked again by an unknown intruder."; part4 << "The system is used to store the Academic history of millions of people."; break; case 2 : part1 << "Hackers have again penetrated the International Acadmic Database."; part4 << "In theory a skilled hacker could create new qualifications for any person he wished."; break; case 3 : part1 << "The International Academic Database has been attacked by hackers again."; part4 << "The exact motives of the hackers are not clear, but it is believed they may be running " "some kind of buisiness offering new qualifications for people for a price."; } break; } } // ================================================================================================================ // Global Criminal Database // ================================================================================================================ else if ( strcmp ( comp->name, "Global Criminal Database" ) == 0 ) { switch ( comp->NumRecentHacks () ) { case 0: case 1: headline << "Global Criminal Records attacked by hackers"; part1 << "The Government managed Global Criminal Database has been penetrated by an unknown computer hacker."; part2 << "Security on the system is so tight that hacks of this kind were thought to be impossible."; part4 << "It appears from a preliminary investigation that an unknown criminal record was modified, prompting " "calls from human rights groups for higher security on personal records of this kind."; part5 << "The Government has said they have begun an investigation and have taken steps to stop this from happening again."; break; case 2: headline << "Criminal Records opened to the public domain"; part1 << "Despite the installation of a brand new high security system, the Global Criminal Database has again been attacked " "and penetrated by a hacker or group of hackers."; part2 << "Government agents are said to be amazed that their new system has failed so soon."; part4 << "This is the second time criminal records have been modified by hackers masquerading as officers."; part5 << "The newly installed system will no doubt be tested in light of this new breach."; break; case 3: headline << "Hackers take advantage of Global Criminal Database"; part1 << "The Government owned Global Criminal Database system has recently suffered a couple of high security hacks, " "and it would seem more and more hackers are taking advantage of the system."; part2 << "For the third time in less than a month a hacker gained adminstrative access to the system and modified " "criminal records within the system."; part4 << "The Government now believes a group of individuals are offering modifications to personal records such as criminal records " "for a price, perhaps advertising through the underground anarchist group Uplink Corporation."; part5 << "The Government has now clamped down on accesses to the system, claiming it is safer than ever."; break; default: switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : headline << "Global Criminal Database smashed open again"; part5 << "The Government appears to be unable to put a stop to these attacks."; break; case 2 : headline << "Government criminal records system hacked yet again"; part5 << "The Government appear to be at a loss as to what to do."; break; case 3 : headline << "Criminal Records modified by hackers again"; part5 << "The Government is now considering shutting down the Global Criminal Database until this can be resolved."; break; } switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : part2 << "Security at this server system has been compromised numerous times in the past month."; break; case 2 : part2 << "This news service has unfortunately lost count of the number of hacks at this site in recent times."; break; case 3 : part2 << "The system appears to have more security holes than popular 'Micro software' written in the late 20th century."; break; } switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : part1 << "The Government run Global Criminal Database has again been hacked wide open."; part4 << "It is believed an underground organisation is selling the service of modifying records."; break; case 2 : part1 << "The Global Criminal Database has been successfully attacked once again."; part4 << "Hackers could clear existing records or could have innocent people thrown in jail."; break; case 3 : part1 << "Once again the Global Criminal Database has been hacked."; part4 << "A number of cases have now arisen of people in prison who claim they were framed in this way."; break; } break; } } // ================================================================================================================ // Bank Server // ================================================================================================================ else if ( comp->TYPE == COMPUTER_TYPE_PUBLICBANKSERVER ) { switch ( comp->NumRecentHacks () ) { case 0 : case 1 : headline << comp->name << " hacked"; part1 << "The financial computer system " << comp->name << " has been penetrated from an unknown source."; part2 << "This is the first incident of its kind for the owner, " << comp->companyname << "."; part4 << "Hackers gaining access to this system could perform any number of fund transfers."; part5 << comp->companyname << " are investigating the incident."; break; case 2 : headline << comp->name << " comes under attack again"; part1 << "The " << comp->name << " computer system has been hacked for the second time."; part4 << "It is believed that some unauthorised money transfers were performed by the hackers."; part5 << "This incident has lead to a fall in investor trust, and the Bank is currently searching for " "clues as to the identity of the hackers responsible."; break; case 3 : headline << comp->name << " hacked for the third time"; part1 << comp->companyname << " are at a loss today as their online trading system, " << comp->name << " was hacked for the third time in less than a month."; part4 << "Funds are being illegally transfered but " << comp->companyname << " are unable to " "provide any further details at this time."; part5 << "Earlier today they issued a statement, saying that Federal Agents had been brought in " "to try to catch these hackers before they cause serious damage."; break; default : switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : headline << comp->name << " is hacked again"; part2 << "This system has been hacked at least 4 times in the last month."; break; case 2 : headline << comp->name << " security fails once again"; part2 << "This is the latest in a long list of security failures for " << comp->companyname << "."; break; case 3 : headline << comp->name << " is penetrated by hackers again"; part2 << "Investor confidence is low as this system has been hacked many times recently."; break; } switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : part1 << "The " << comp->name << " has been attacked and penetrated again by unknown cyber-criminals."; break; case 2 : part1 << "Earlier today the " << comp->name << " system was attacked again by Computer hackers."; break; case 3 : part1 << comp->companyname << " suffered another embarrasing security problem today as their " << comp->name << " system was hacked from an unknown source."; } switch ( NumberGenerator::RandomNumber ( 3 ) + 1 ) { case 1 : part4 << "It is believed the hackers were attempting to transfer funds without authorisation."; part5 << comp->companyname << " have hired freelance computer specialists in an attempt to catch the guilty parties."; break; case 2 : part4 << "Records indicate the hackers performed some kind of financial transfer, then attempted to remove " "any traces of their actions."; part5 << comp->companyname << " say they are are confident they will catch the hacker."; break; case 3 : part4 << "Hackers gaining access to this system could perform any number of fund transfers between accounts."; part5 << comp->companyname << " are said to be considering further action in light of the number of recent hacks."; break; } break; } } else { // Not worth writing a story about it return; } // // Concatenate each part together and post it // part3 << "This occured on " << al->date.GetLongString (); headline << '\x0'; part1 << '\x0'; part2 << '\x0'; part3 << '\x0'; part4 << '\x0'; part5 << '\x0'; part6 << '\x0'; std::ostrstream details; details << part1.str () << "\n\n" << part2.str () << "\n\n" << part3.str () << "\n\n" << part4.str () << "\n\n" << part5.str () << "\n\n" << part6.str () << '\x0'; News *news = new News (); news->SetHeadline ( headline.str () ); news->SetDetails ( details.str () ); news->SetData ( NEWS_TYPE_HACKED, comp->ip ); headline.rdbuf()->freeze( 0 ); part1.rdbuf()->freeze( 0 ); part2.rdbuf()->freeze( 0 ); part3.rdbuf()->freeze( 0 ); part4.rdbuf()->freeze( 0 ); part5.rdbuf()->freeze( 0 ); part6.rdbuf()->freeze( 0 ); details.rdbuf()->freeze( 0 ); //delete [] headline.str (); //delete [] part1.str (); //delete [] part2.str (); //delete [] part3.str (); //delete [] part4.str (); //delete [] part5.str (); //delete [] part6.str (); //delete [] details.str (); CompanyUplink *cu = (CompanyUplink *) game->GetWorld ()->GetCompany ( "Uplink" ); UplinkAssert (cu); cu->CreateNews ( news ); }