/** * @brief Updates the mission list. * @param wid Window of the mission computer. * @param str Unused. */ static void misn_update( unsigned int wid, char* str ) { (void) str; char *active_misn; Mission* misn; char txt[256], *buf; /* Clear computer markers. */ space_clearComputerMarkers(); /* Update date stuff. */ buf = ntime_pretty( 0, 2 ); snprintf( txt, sizeof(txt), "%s\n%d Tons", buf, player.p->cargo_free ); free(buf); window_modifyText( wid, "txtDate", txt ); active_misn = toolkit_getList( wid, "lstMission" ); if (strcmp(active_misn,"No Missions")==0) { window_modifyText( wid, "txtReward", "None" ); window_modifyText( wid, "txtDesc", "There are no missions available here." ); window_disableButton( wid, "btnAcceptMission" ); return; } misn = &mission_computer[ toolkit_getListPos( wid, "lstMission" ) ]; mission_sysComputerMark( misn ); if (misn->markers != NULL) map_center( system_getIndex( misn->markers[0].sys )->name ); window_modifyText( wid, "txtReward", misn->reward ); window_modifyText( wid, "txtDesc", misn->desc ); window_enableButton( wid, "btnAcceptMission" ); }
/** * @brief Updates the mission menu mission information based on what's selected. * @param str Unused. */ static void mission_menu_update( unsigned int wid, char* str ) { (void)str; char *active_misn; Mission* misn; active_misn = toolkit_getList( wid, "lstMission" ); if ((active_misn==NULL) || (strcmp(active_misn,"No Missions")==0)) { window_modifyText( wid, "txtReward", "None" ); window_modifyText( wid, "txtDesc", "You currently have no active missions." ); window_disableButton( wid, "btnAbortMission" ); return; } /* Modify the text. */ misn = &player_missions[ toolkit_getListPos(wid, "lstMission" ) ]; window_modifyText( wid, "txtReward", misn->reward ); window_modifyText( wid, "txtDesc", misn->desc ); window_enableButton( wid, "btnAbortMission" ); /* Select the system. */ if (misn->markers != NULL) map_center( system_getIndex( misn->markers[0].sys )->name ); }
Scene *readHeights(char* fn) { int width, height; unsigned char *height_map; height_map = readBMP(fn, width, height); if (!height_map) { fl_alert("Error loading height map\n"); return false; } Scene * ret = new Scene(); //TODO: customize mat Material * mat = new Material(); mat->kd = vec3f(1.0, 1.0, 1.0); //extract the points Trimesh * trimesh = new Trimesh(ret, mat, &ret->transformRoot); for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { int pos = y * width + x; unsigned char pixel[3]; memcpy(pixel, height_map + pos * 3, 3); double height = double(pixel[0] + pixel[1] + pixel[2]) / 3 / 128; vec3f point(x, y, height); trimesh->addVertex(point); if (x > 0 && y > 0) { //link the points trimesh->addFace(pos, pos - 1, pos - 1 - width); trimesh->addFace(pos, pos - 1 - width, pos - width); } } } char *error; if (error = trimesh->doubleCheck()) throw ParseError(error); //add a trimesh ret->add(trimesh); //add a pointlight PointLight* point_light = new PointLight(ret, vec3f(width, height, 10), vec3f(1.0, 1.0, 1.0)); ret->add(point_light); //set the camerea //TODO: calculate the correct viewing distance; vec3f map_center((double)width / 2 - 0.5, (double)height / 2 - 0.5, 0.5); double camera_distance = (double)width + 3.0; vec3f camera_pos(0, -camera_distance, 2 * camera_distance); camera_pos += map_center; ret->getCamera()->setEye(camera_pos); ret->getCamera()->setLook((map_center - camera_pos).normalize(), vec3f(0, 0, 1).normalize()); return ret; }
bool decode_map_v1_xml(map_type *map,int map_head) { int i,k,j,y,idx,nportal,seg_cnt, main_portal_tag,portal_tag,msg_tag, main_seg_tag,seg_tag,main_light_tag,light_tag,main_sound_tag,sound_tag, main_particle_tag,particle_tag,main_node_tag,node_tag, main_obj_tag,obj_tag,tag,cnt; bool convert_ok; portal_type *portals,*portal; segment_type *seg_list,*seg; map_light_type *light; map_sound_type *sound; map_particle_type *particle; node_type *node; spot_type *spot; map_scenery_type *scenery; // temporary segments and portals for converting from v1 to v3 seg_cnt=0; seg_list=(segment_type*)malloc(max_segment*sizeof(segment_type)); if (seg_list==NULL) return(FALSE); nportal=0; portals=(portal_type*)malloc(max_portal*sizeof(portal_type)); if (portals==NULL) { free(seg_list); return(FALSE); } // portals main_portal_tag=xml_findfirstchild("Portals",map_head); if (main_portal_tag!=-1) { nportal=xml_countchildren(main_portal_tag); portal_tag=xml_findfirstchild("Portal",main_portal_tag); portal=portals; for (i=0;i!=nportal;i++) { xml_get_attribute_3_coord_int(portal_tag,"tl_c3",&portal->x,&y,&portal->z); xml_get_attribute_3_coord_int(portal_tag,"br_c3",&portal->ex,&y,&portal->ez); portal->msg.entry_on=portal->msg.exit_on=portal->msg.base_on=portal->msg.map_change_on=FALSE; portal->msg.entry_id=portal->msg.exit_id=0; portal->msg.map_name[0]=0x0; strcpy(portal->msg.map_spot_name,"Start"); strcpy(portal->msg.map_spot_type,"Player"); msg_tag=xml_findfirstchild("Messages",portal_tag); if (msg_tag!=-1) { tag=xml_findfirstchild("Entry",msg_tag); if (tag!=-1) { portal->msg.entry_on=xml_get_attribute_boolean(tag,"on"); portal->msg.entry_id=xml_get_attribute_int(tag,"id"); } tag=xml_findfirstchild("Exit",msg_tag); if (tag!=-1) { portal->msg.exit_on=xml_get_attribute_boolean(tag,"on"); portal->msg.exit_id=xml_get_attribute_int(tag,"id"); } tag=xml_findfirstchild("Base",msg_tag); if (tag!=-1) { portal->msg.base_on=xml_get_attribute_boolean(tag,"on"); portal->msg.base_team=xml_get_attribute_int(tag,"team"); } tag=xml_findfirstchild("Map",msg_tag); if (tag!=-1) { portal->msg.map_change_on=xml_get_attribute_boolean(tag,"on"); xml_get_attribute_text(tag,"name", portal->msg.map_name,name_str_len); xml_get_attribute_text(tag,"spot_name", portal->msg.map_spot_name,name_str_len); xml_get_attribute_text(tag,"spot_type", portal->msg.map_spot_type,name_str_len); } } // walls main_seg_tag=xml_findfirstchild("Walls",portal_tag); if (main_seg_tag!=-1) { cnt=xml_countchildren(main_seg_tag); seg_tag=xml_findfirstchild("Wall",main_seg_tag); for (k=0;k!=cnt;k++) { seg=&seg_list[seg_cnt]; seg_cnt++; read_single_segment(seg_tag,seg,i,sg_wall); tag=xml_findfirstchild("v",seg_tag); xml_get_attribute_3_coord_int(tag,"c3",&seg->data.wall.lx,&seg->data.wall.ty,&seg->data.wall.lz); tag=xml_findnextchild(tag); xml_get_attribute_3_coord_int(tag,"c3",&seg->data.wall.rx,&seg->data.wall.by,&seg->data.wall.rz); seg_tag=xml_findnextchild(seg_tag); } } // floors main_seg_tag=xml_findfirstchild("Floors",portal_tag); if (main_seg_tag!=-1) { cnt=xml_countchildren(main_seg_tag); seg_tag=xml_findfirstchild("Floor",main_seg_tag); for (k=0;k!=cnt;k++) { seg=&seg_list[seg_cnt]; seg_cnt++; read_single_segment(seg_tag,seg,i,sg_floor); seg->data.fc.ptsz=xml_countchildren(seg_tag); tag=xml_findfirstchild("v",seg_tag); for (j=0;j!=seg->data.fc.ptsz;j++) { xml_get_attribute_3_coord_int(tag,"c3",&seg->data.fc.x[j],&seg->data.fc.y[j],&seg->data.fc.z[j]); tag=xml_findnextchild(tag); } seg_tag=xml_findnextchild(seg_tag); } } // ceilings main_seg_tag=xml_findfirstchild("Ceilings",portal_tag); if (main_seg_tag!=-1) { cnt=xml_countchildren(main_seg_tag); seg_tag=xml_findfirstchild("Ceiling",main_seg_tag); for (k=0;k!=cnt;k++) { seg=&seg_list[seg_cnt]; seg_cnt++; read_single_segment(seg_tag,seg,i,sg_ceiling); seg->data.fc.ptsz=xml_countchildren(seg_tag); tag=xml_findfirstchild("v",seg_tag); for (j=0;j!=seg->data.fc.ptsz;j++) { xml_get_attribute_3_coord_int(tag,"c3",&seg->data.fc.x[j],&seg->data.fc.y[j],&seg->data.fc.z[j]); tag=xml_findnextchild(tag); } seg_tag=xml_findnextchild(seg_tag); } } // liquids main_seg_tag=xml_findfirstchild("Liquids",portal_tag); if (main_seg_tag!=-1) { cnt=xml_countchildren(main_seg_tag); seg_tag=xml_findfirstchild("Liquid",main_seg_tag); for (k=0;k!=cnt;k++) { seg=&seg_list[seg_cnt]; seg_cnt++; read_single_segment(seg_tag,seg,i,sg_liquid); tag=xml_findfirstchild("v",seg_tag); xml_get_attribute_3_coord_int(tag,"c3",&seg->data.liquid.lft,&seg->data.liquid.y,&seg->data.liquid.top); tag=xml_findnextchild(tag); xml_get_attribute_3_coord_int(tag,"c3",&seg->data.liquid.rgt,&seg->data.liquid.y,&seg->data.liquid.bot); seg_tag=xml_findnextchild(seg_tag); } } // ambient walls main_seg_tag=xml_findfirstchild("Ambients",portal_tag); if (main_seg_tag!=-1) { cnt=xml_countchildren(main_seg_tag); seg_tag=xml_findfirstchild("Ambient",main_seg_tag); for (k=0;k!=cnt;k++) { seg=&seg_list[seg_cnt]; seg_cnt++; read_single_segment(seg_tag,seg,i,sg_ambient_wall); tag=xml_findfirstchild("v",seg_tag); xml_get_attribute_3_coord_int(tag,"c3",&seg->data.ambient_wall.lx,&seg->data.ambient_wall.ty,&seg->data.ambient_wall.lz); tag=xml_findnextchild(tag); xml_get_attribute_3_coord_int(tag,"c3",&seg->data.ambient_wall.rx,&seg->data.ambient_wall.by,&seg->data.ambient_wall.rz); seg_tag=xml_findnextchild(seg_tag); } } // ambient floor/ceilings main_seg_tag=xml_findfirstchild("Ambient_FCs",portal_tag); if (main_seg_tag!=-1) { cnt=xml_countchildren(main_seg_tag); seg_tag=xml_findfirstchild("Ambient_FC",main_seg_tag); for (k=0;k!=cnt;k++) { seg=&seg_list[seg_cnt]; seg_cnt++; read_single_segment(seg_tag,seg,i,sg_ambient_fc); seg->data.ambient_fc.ptsz=xml_countchildren(seg_tag); tag=xml_findfirstchild("v",seg_tag); for (j=0;j!=seg->data.ambient_fc.ptsz;j++) { xml_get_attribute_3_coord_int(tag,"c3",&seg->data.ambient_fc.x[j],&seg->data.ambient_fc.y[j],&seg->data.ambient_fc.z[j]); tag=xml_findnextchild(tag); } seg_tag=xml_findnextchild(seg_tag); } } // scenery main_obj_tag=xml_findfirstchild("Sceneries",portal_tag); if (main_obj_tag!=-1) { cnt=xml_countchildren(main_obj_tag); obj_tag=xml_findfirstchild("Scenery",main_obj_tag); for (k=0;k!=cnt;k++) { if (map->nscenery>=max_map_scenery) break; scenery=&map->sceneries[map->nscenery]; map->nscenery++; xml_get_attribute_3_coord_int(obj_tag,"c3",&scenery->pnt.x,&scenery->pnt.y,&scenery->pnt.z); xml_get_attribute_text(obj_tag,"model_name",scenery->model_name,name_str_len); xml_get_attribute_text(obj_tag,"animation_name",scenery->animation_name,name_str_len); xml_get_attribute_3_coord_float(obj_tag,"angle",&scenery->ang.x,&scenery->ang.y,&scenery->ang.z); scenery->contact_object_on=xml_get_attribute_boolean(obj_tag,"contact"); scenery->contact_projectile_on=xml_get_attribute_boolean(obj_tag,"contact_projectile"); scenery->contact_hit_box=xml_get_attribute_boolean(obj_tag,"contact_hit_box"); scenery->face_forward=xml_get_attribute_boolean(obj_tag,"face_forward"); scenery->shadow=xml_get_attribute_boolean(obj_tag,"shadow"); scenery->pnt.x=(scenery->pnt.x*map_enlarge)+(portal->x*map_enlarge); scenery->pnt.y=(scenery->pnt.y+1)*map_enlarge; scenery->pnt.z=(scenery->pnt.z*map_enlarge)+(portal->z*map_enlarge); scenery->resize=1.0f; obj_tag=xml_findnextchild(obj_tag); } } // lights main_light_tag=xml_findfirstchild("Lights",portal_tag); if (main_light_tag!=-1) { cnt=xml_countchildren(main_light_tag); light_tag=xml_findfirstchild("Light",main_light_tag); for (k=0;k!=cnt;k++) { if (map->nlight>=max_map_light) break; light=&map->lights[map->nlight]; map->nlight++; light->type=xml_get_attribute_list(light_tag,"type",(char*)light_type_str); xml_get_attribute_3_coord_int(light_tag,"c3",&light->pnt.x,&light->pnt.y,&light->pnt.z); light->intensity=xml_get_attribute_int(light_tag,"intensity"); xml_get_attribute_color(light_tag,"rgb",&light->col); light->on=!xml_get_attribute_boolean(light_tag,"off"); light->pnt.x=(light->pnt.x*map_enlarge)+(portal->x*map_enlarge); light->pnt.y=(light->pnt.y+1)*map_enlarge; light->pnt.z=(light->pnt.z*map_enlarge)+(portal->z*map_enlarge); light->intensity*=map_enlarge; light->exponent=1.0f; light->direction=ld_all; light_tag=xml_findnextchild(light_tag); } } // sounds main_sound_tag=xml_findfirstchild("Sounds",portal_tag); if (main_sound_tag!=-1) { cnt=xml_countchildren(main_sound_tag); sound_tag=xml_findfirstchild("Sound",main_sound_tag); for (k=0;k!=cnt;k++) { if (map->nsound>=max_map_sound) break; sound=&map->sounds[map->nsound]; map->nsound++; xml_get_attribute_text(sound_tag,"name",sound->name,file_str_len); xml_get_attribute_3_coord_int(sound_tag,"c3",&sound->pnt.x,&sound->pnt.y,&sound->pnt.z); sound->pitch=xml_get_attribute_float(sound_tag,"pitch"); sound->on=!xml_get_attribute_boolean(sound_tag,"off"); sound->pnt.x=(sound->pnt.x*map_enlarge)+(portal->x*map_enlarge); sound->pnt.y=(sound->pnt.y+1)*map_enlarge; sound->pnt.z=(sound->pnt.z*map_enlarge)+(portal->z*map_enlarge); sound_tag=xml_findnextchild(sound_tag); } } // particles main_particle_tag=xml_findfirstchild("Particles",portal_tag); if (main_particle_tag!=-1) { cnt=xml_countchildren(main_particle_tag); particle_tag=xml_findfirstchild("Particle",main_particle_tag); for (k=0;k!=cnt;k++) { if (map->nparticle>=max_map_particle) break; particle=&map->particles[map->nparticle]; map->nparticle++; xml_get_attribute_text(particle_tag,"name",particle->name,file_str_len); xml_get_attribute_3_coord_int(particle_tag,"c3",&particle->pnt.x,&particle->pnt.y,&particle->pnt.z); particle->spawn_tick=xml_get_attribute_int(particle_tag,"spawn_tick"); particle->slop_tick=xml_get_attribute_int(particle_tag,"slop_tick"); particle->on=!xml_get_attribute_boolean(particle_tag,"off"); particle->pnt.x=(particle->pnt.x*map_enlarge)+(portal->x*map_enlarge); particle->pnt.y=(particle->pnt.y+1)*map_enlarge; particle->pnt.z=(particle->pnt.z*map_enlarge)+(portal->z*map_enlarge); particle_tag=xml_findnextchild(particle_tag); } } // nodes main_node_tag=xml_findfirstchild("Nodes",portal_tag); if (main_node_tag!=-1) { cnt=xml_countchildren(main_node_tag); node_tag=xml_findfirstchild("Node",main_node_tag); for (k=0;k!=cnt;k++) { idx=xml_get_attribute_int(node_tag,"id"); node=&map->nodes[idx]; if (idx>=map->nnode) map->nnode=idx+1; node->idx=idx; for (j=0;j!=max_node_link;j++) { node->link[j]=-1; } for (j=0;j!=max_node;j++) { node->path_hint[j]=-1; } xml_get_attribute_3_coord_int(node_tag,"c3",&node->pnt.x,&node->pnt.y,&node->pnt.z); xml_get_attribute_3_coord_float(node_tag,"angle",&node->ang.x,&node->ang.y,&node->ang.z); xml_get_attribute_text(node_tag,"name",node->name,name_str_len); node->event_id=xml_get_attribute_int_default(node_tag,"event_id",0); tag=xml_findfirstchild("Link",node_tag); xml_get_attribute_short_array(tag,"node",node->link,max_node_link); tag=xml_findfirstchild("Hint",node_tag); xml_get_attribute_short_array(tag,"node",node->path_hint,map->nnode); node->pnt.x=(node->pnt.x*map_enlarge)+(portal->x*map_enlarge); node->pnt.y=(node->pnt.y+1)*map_enlarge; node->pnt.z=(node->pnt.z*map_enlarge)+(portal->z*map_enlarge); node->follow_camera=FALSE; node_tag=xml_findnextchild(node_tag); } } // spots main_obj_tag=xml_findfirstchild("Spots",portal_tag); if (main_obj_tag!=-1) { cnt=xml_countchildren(main_obj_tag); obj_tag=xml_findfirstchild("Spot",main_obj_tag); for (k=0;k!=cnt;k++) { idx=xml_get_attribute_int(obj_tag,"id"); spot=&map->spots[idx]; if (idx>=map->nspot) map->nspot=idx+1; xml_get_attribute_3_coord_int(obj_tag,"c3",&spot->pnt.x,&spot->pnt.y,&spot->pnt.z); xml_get_attribute_text(obj_tag,"name",spot->name,name_str_len); xml_get_attribute_text(obj_tag,"type",spot->type,name_str_len); if (!xml_get_attribute_text(obj_tag,"script",spot->script,name_str_len)) { // supergumba -- remove later -- here to fix XML from older version strcpy(spot->script,spot->name); } xml_get_attribute_text(obj_tag,"display_model",spot->display_model,name_str_len); xml_get_attribute_text(obj_tag,"params",spot->params,param_str_len); spot->ang.y=xml_get_attribute_float(obj_tag,"angle"); spot->skill=skill_easy; spot->spawn=spawn_always; spot->pnt.x=(spot->pnt.x*map_enlarge)+(portal->x*map_enlarge); spot->pnt.y=(spot->pnt.y+1)*map_enlarge; spot->pnt.z=(spot->pnt.z*map_enlarge)+(portal->z*map_enlarge); obj_tag=xml_findnextchild(obj_tag); } } portal++; portal_tag=xml_findnextchild(portal_tag); } } convert_ok=map_convert_v1(map,nportal,portals,seg_cnt,seg_list); free(portals); free(seg_list); // center map map_center(map); return(convert_ok); }