global MSGTIME = 5.0; global MONEY_TARGET = 500.0; global MONEY_TARGET_STR = "50 000"; function GET_TOTAL_MONEY() { return string_format( "{1:f.2}", 950000 + money_total ); } function onLevelStart() { global money_total = 0.0; global donations = []; global cur_donation = 0; global goal_reached = false; global mission_failed = false; global hackcount = 0; for( i = 0; i < 5; ++i ) donations.push( ( i + 1 ) * 3.4 * 1000 ); donations.shuffle(); ObjectiveAdd( "Discover a computer", OS_Open ); ObjectiveAdd( "Steal $" $ MONEY_TARGET_STR, OS_Open ); ObjectiveAdd( "Get out", OS_Hidden ); EntitySetProperties( "walker1", "patrol_path", [ { type = "move", target = GetNamedPosition("center") }, { type = "wait", time = 1.0 }, { type = "move", target = GetNamedPosition("ew_elev") }, { type = "move", target = GetNamedPosition("ew_desk1") }, { type = "look", target = GetNamedPosition("ew_desk1in") }, { type = "wait", time = 2.0 }, { type = "move", target = GetNamedPosition("ew_cnr1") }, { type = "move", target = GetNamedPosition("ew_elev") }, // TODO ]); EntitySetProperties( "walker_fw", "patrol_path", [ { type = "move", target = GetNamedPosition("farwall") }, { type = "wait", time = 1.0 }, { type = "move", target = GetNamedPosition("ww_cnr1") }, { type = "move", target = GetNamedPosition("ww_desk1") }, { type = "look", target = GetNamedPosition("ww_desk1in") }, { type = "wait", time = 2.0 }, { type = "move", target = GetNamedPosition("ww_wall") }, { type = "wait", time = 1.0 }, { type = "move", target = GetNamedPosition("ww_desk1") }, { type = "look", target = GetNamedPosition("ww_desk1in") }, { type = "wait", time = 1.0 }, { type = "move", target = GetNamedPosition("ww_cnr1") }, ]); SetMusic( "/intro_music" ); SetCutsceneFunc(function(t) { if( t < 5 ) SetCameraPosDir( vec3(5-t*2,-5,1), vec3(0,1,0) ); else if( t < 15 ) { a = t*0.5; s = sin(a); c = cos(a); SetCameraPosDir( vec3(c*5,s*5,2.5), -vec3(c,s,0.5) ); } else if( t < 30 ) { b = pow( t - 15, 0.5 ) * 2; SetCameraPosDir( vec3(-3.5-b*0.2,-5+b*0.5,0.5+b*0.2), vec3(-0.1-b*0.04,1,0.4-b*0.15) ); } if( t < 1 ) SetCutsceneSubtitle( "" ); else if( t < 3 ) SetCutsceneSubtitle( "His name is Jack" ); else if( t < 5 ) SetCutsceneSubtitle( "and he wants to buy a yacht." ); else if( t < 7 ) SetCutsceneSubtitle( "He needs $ 1 000 000 to do that" ); else if( t < 9 ) SetCutsceneSubtitle( "so he steals money from charities." ); else if( t < 11 ) SetCutsceneSubtitle( "He is a monster..." ); else if( t < 13 ) SetCutsceneSubtitle( "...and, for the moment, you are him." ); else if( t < 15 ) SetCutsceneSubtitle( "" ); else if( t < 17 ) SetCutsceneSubtitle( "Hack computers to get the remaining $ 50 000" ); else if( t < 19 ) SetCutsceneSubtitle( "but don't do it while somebody's watching!" ); else SetCutsceneSubtitle( "" ); if( t > 20 ) { SetMusic( "/game_music" ); return true; } }, 0); SetShowMoney( true, 950000 + money_total ); SetShowSuspicion( true ); } function HackState( add ) { global hackcount; hackcount += add; SetMusicVar( "stealing", hackcount > 0 ); } function OnMissionFailed( pos ) { global mission_failed; if( mission_failed ) return; mission_failed = true; EndGame( "Failed!", false ); } function OnMoneyStolen() { global money_total, donations, cur_donation; stolen_money = donations[ cur_donation++ % donations.size ] + rand() % 500; money_total += stolen_money; println( "Stolen: ", stolen_money, ", total now: ", money_total ); SendMessage( MT_Info, "Stolen: " $ stolen_money $ ", total now: " $ GET_TOTAL_MONEY() ); SendMessage( MT_Warning, "Hacking done, hide your tracks!", MSGTIME ); SetShowMoney( true, 950000 + money_total ); } function OnHackingStarted( cold ) { HackState( 1 ); if( cold ) { SendMessage( MT_Warning, "Hacking started! Watch out for employees!", MSGTIME ); } } function OnHackingStopped( done ) { if( done ) { if( money_total >= MONEY_TARGET && goal_reached == false ) { global goal_reached = true; SendMessage( MT_Info, "Successfully stolen $" $ MONEY_TARGET_STR $ ". Time to get out.", MSGTIME ); ObjectiveSetState( 1, OS_Done ); // ObjectiveSetState( 2, OS_Open ); SetCutsceneFunc(function(t) { b = pow( t * 0.2, 0.5 ) * 5; if( b > 6 ) b = 6; SetCameraPosDir( vec3(-2.5+b,-5,2.5), vec3(1,-0.4+b*0.15,-0.4) ); }); EndGame( "Success!", true ); return; } else { SendMessage( MT_Info, "Well done! Now look for another PC to hack...", MSGTIME ); SendMessage( MT_Continued, "...or wait for the next donation!", MSGTIME ); } } HackState( -1 ); } function OnDiscoveredComputer() { SendMessage( MT_Info, "Computer discovered", MSGTIME ); ObjectiveSetState( 0, OS_Done ); }