/* ----------------------------------------------------------------------------- Function: Parameters: Returns: Notes: ----------------------------------------------------------------------------- */ PUBLIC void PL_Init(void) { PL_Reset(); PL_NewGame( &Player ); Cmd_AddCommand( "god", Cmd_God_f ); Cmd_AddCommand( "notarget", PL_notarget_f ); Cmd_AddCommand( "give", Cmd_Give_f ); }
//========================================== // iphoneSelectMapMenu() // A doom classic style map selector //========================================== void iphoneSelectMapMenu() { int s; //skill char str[64]; // highlight the current skill selection int skillValue = (int)skill->value; if (skillValue < 0) skillValue = 0; if (skillValue > 3) skillValue = 3; int skillSides = 80; int e = 0; //episode int m, map; //mission/map int height = 48; int spacing = 10; int y = 0; char strMission[80]; strMission[79] = '\0'; int numMaps = 60; if (g_version->value == SPEAROFDESTINY) numMaps = 60 + 21; iphoneDrawPic(0, 0, 480, 320, "iphone/submenus_background_image.tga"); //check for BackButton touches if ( BackButton() ) { menuState = IPM_MAIN; return; } //we want to use the menu selector bar my_snprintf( str, sizeof( str ), "iphone/menu_bar.tga" ); //iterate through the maps... drawing only the visible maps for (m = 0; m < numMaps; m++) { //Draws the spacing between each episode e = m/10; if (e < 6) { y = dragPosition + ((height + spacing) * e*11);// + ((height + spacing) * (e+1)); if ( y >= -height && y < 320 ) { my_snprintf( str, sizeof( str ), "iphone/button_ep%i.tga", e+1 ); iphoneDrawPic( 0, y, 480-80, height, str); } y = dragPosition + ((height + spacing) * m) + ((height + spacing) * (e+1)); } else { y = dragPosition + ((height + spacing) * 6*11); if ( y >= -height && y < 320 ) { my_snprintf( str, sizeof( str ), "iphone/button_epSOD.tga"); iphoneDrawPic( 0, y, 480-80, height, str); } y = dragPosition + ((height + spacing) * m) + ((height + spacing) * 7); } //we want to use the menu selector bar my_snprintf( str, sizeof( str ), "iphone/menu_bar.tga" ); //only draw the maps that are currently viewable if ( y >= -height && y < 320 ) { e = m/10; map = m%10; //color maps int ch = currentMap.mapFlags[skillValue][m]; int alpha = 128; colour4_t colorSecret = { 80, 0, 0, alpha }; colour4_t colorNoTry = { 0, 0, 0, alpha }; colour4_t colorTried = { 80, 80, 0, alpha }; colour4_t colorCompleted = { 0, 80, 0, alpha }; colour4_t colorBlink = { 80, 80, 80, alpha }; unsigned char *color = colorNoTry; bool isSecretAvailable = true; if ( map == 9 && !( ch & MF_TRIED ) && e < 6) //if it's the 9th and not SOD { color = colorSecret; isSecretAvailable = false; } else if ( (m == 79 || m == 78) && !(ch & MF_TRIED) ) //if it's the secret SOD levels { color = colorSecret; isSecretAvailable = false; } else if ( ch & MF_COMPLETED ) { color = colorCompleted; } else if ( ch & MF_TRIED ) { color = colorTried; } else { color = colorNoTry; } //blink the level you're currently on if ( ( iphoneFrameNum & 8 ) && map == currentMap.map && e == currentMap.episode ) color = colorBlink; //draw maps and touch if ( iphoneDrawPicWithTouchAndColor( 0, y, 480-80, height, str, color) && dragVelocity == 0 && isSecretAvailable ) { //reset the player to new PL_NewGame( &Player ); //set episode and map numbers and load map Cvar_SetValue( episode->name, e ); iphonePreloadBeforePlay(); //This prevents crashes when loading SOD maps iphoneStartMap( e, map, skillValue ); } //draw the rewards iphoneDrawRewards(m, skillValue, 0, y); //draw the episode and map over the selection bar my_snprintf( strMission, sizeof( strMission ), "%s", levelNames[m] ); iphoneDrawText( 100, y + 16, 16, 16, strMission ); // iphoneCenterText( 160, y + 16, strMission ); } } int numUserMaps = 0; #if 0 //buy more episodes button if (g_version->value != SPEAROFDESTINY) GetSpearOfDestiny( 0, dragPosition + (height + spacing) * (m+6) ); #endif //TODO: Draw user maps numUserMaps = iphoneDrawUserMaps(y, height, spacing, skillValue); //Update the scrolling drags iphoneUpdateDrags(numMaps, skillSides, height, spacing, numUserMaps); //Draw/choose the skills on the right side of the screen for ( s = 0 ; s < 4 ; s++ ) { my_snprintf( str, sizeof( str ), "iphone/button_skill%i.tga", s+1 ); if ( s != (int)skill->value ) { pfglColor3f( 0.5, 0.5, 0.5 ); } if ( iphoneDrawPicWithTouch( 480 - skillSides, skillSides*s, skillSides, skillSides, str ) ) { Cvar_SetValue( skill->name, s ); skillValue = s; break; } pfglColor3f( 1, 1, 1 ); } //Draw a bar that covers empty space iphoneDrawPic(0, 0, 480-80, 32, "iphone/menu_bar.tga"); //levels header iphoneDrawPic(240-64, 0, 128, 32, "iphone/header_levels.tga"); BackButton(); //this is kinda cheap... //we want the back button to render on top //but we also want it to check for touches before the maps //so we call this function twice //(at the beginning for touches; the end for rendering) }
//========================================== // iphoneDrawUserMaps() // This function scans through the custom maps // and displays the ones on screen //========================================== int iphoneDrawUserMaps(int Yoffset, int height, int spacing, int skillValue) { int numMaps = 0; DIR *dp; struct dirent *ep; char mapBuffer[1024]; int length = strlen(iphoneDocDirectory); strcpy(mapBuffer, iphoneDocDirectory); strcpy(mapBuffer + length, "/usermaps/"); dp = opendir (mapBuffer); if (dp != NULL) { int y = Yoffset; if (g_version->value != SPEAROFDESTINY) //make space for the purchase SOD button y += height + spacing + spacing; //draw the custom map spacing y += height + spacing; iphoneDrawPic( 0, y, 480-80, height, "iphone/button_epSOD.tga"); while ( ( ep = readdir (dp) ) ) { ++numMaps; if (numMaps < 3) //skip the '.' and '..' continue; y += height + spacing; Com_Printf("value y: %i\n", y); //TODO: draw the names! if ( y >= -height && y < 320 ) { //draw maps and touch int alpha = 128; //colour4_t colorSecret = { 80, 0, 0, alpha }; colour4_t colorNoTry = { 0, 0, 0, alpha }; if ( iphoneDrawPicWithTouchAndColor( 0, y, 480-80, height, "iphone/menu_bar.tga", colorNoTry) && dragVelocity == 0 )//&& isSecretAvailable ) { //reset the player to new PL_NewGame( &Player ); //set episode and map numbers and load map int e = 9; //9 will be used to show a custom map Cvar_SetValue( episode->name, e ); iphonePreloadBeforePlay(); //This prevents crashes when loading SOD maps iphoneStartUserMap( e, numMaps - 3, skillValue, ep->d_name ); } iphoneDrawText( 100, y + 16, 16, 16, ep->d_name ); //iphoneCenterText( 160, y + 16, ep->d_name ); //draw the rewards iphoneDrawRewards(numMaps-2+90, skillValue, 0, y); } } closedir (dp); --numMaps; --numMaps; } Com_Printf("numMaps: %i\n", numMaps); return numMaps; }
/** * \brief Load game state from file * \param[in] name Name of save game file to load. * \return 1 on success, otherwise 0 */ PUBLIC int LoadTheGame( const char *name ) { FILE *f; char path[1024]; int version; int i; int oldCompleted; com_snprintf( path, sizeof( path ), "%s%c%s.bin", FS_Userdir(), PATH_SEP, name ); f = fopen( path, "rb" ); if( ! f ) { Com_Printf( "Could not open %s.\n", path ); return 0; } fread( ¤tMap, 1,sizeof(currentMap) , f); if ( currentMap.version != SAVEGAME_VERSION ) { Com_Printf( "Savegame header version mismatch: %i != %i\n", currentMap.version, SAVEGAME_VERSION ); fclose( f ); return 0; } Com_Printf("episode: %i\nmap: %i\n", currentMap.episode, currentMap.map); // load the huds //fread( &huds, 1,sizeof(huds), f); // do a normal map start Cvar_SetValue( skill->name, (float)currentMap.skill ); PL_NewGame( &Player ); oldCompleted = currentMap.levelCompleted; StartGame( currentMap.episode, currentMap.map, currentMap.skill ); Cbuf_Execute(); currentMap.levelCompleted = oldCompleted; // load modifications on top fread( &levelData, 1,sizeof(levelData), f); fread( &LevelRatios, 1,sizeof(LRstruct), f ); fread( &levelstate, 1,sizeof(levelstate), f ); fread( Guards, 1,sizeof(Guards), f ); fread( areaconnect, 1,sizeof(areaconnect), f ); fread( areabyplayer, 1,sizeof(areabyplayer), f ); fread( &PWall, 1,sizeof(PWall), f ); fread( &Player, 1,sizeof(Player), f ); fread( &version, 1,sizeof(version), f ); fclose( f ); ClientState.viewangles[ YAW ] = RAD2FINE(Player.position.angle); ClientState.viewangles[ PITCH ] = RAD2FINE(Player.position.pitch); if ( version != SAVEGAME_VERSION ) { Com_Printf( "Savegame trailer version mismatch: %i != %i\n", version, SAVEGAME_VERSION ); return 0; } // turn the r_world->Doors.doors back to pointers for ( i = 0 ; i < r_world->Doors.doornum ; i++ ) { int index = (int)r_world->Doors.Doors[i]; assert( index >= 0 && index < 4096 ); r_world->Doors.Doors[i] = &r_world->Doors.DoorMap[0][0] + index; } return 1; }