void KVExpSetUp::copy_fired_parameters_to_recon_param_list() { TIter next_array(&fMDAList); KVMultiDetArray* mda; while ((mda = (KVMultiDetArray*)next_array())) { mda->copy_fired_parameters_to_recon_param_list(); } }
void KVExpSetUp::SetRawDataFromReconEvent(KVNameValueList& l) { TIter next_array(&fMDAList); KVMultiDetArray* mda; while ((mda = (KVMultiDetArray*)next_array())) { mda->SetRawDataFromReconEvent(l); } }
void KVExpSetUp::SetPedestalParameters(KVDBRun* r, const TString&) { // Set pedestals for all detectors for the run TIter next_array(&fMDAList); KVMultiDetArray* mda; while ((mda = (KVMultiDetArray*)next_array())) { mda->SetPedestalParameters(r, mda->GetName()); } }
void KVExpSetUp::SetReconParametersInEvent(KVReconstructedEvent* e) const { // Add contents of fReconParameters of each sub-array to the event parameter list TIter next_array(&fMDAList); KVMultiDetArray* mda; while ((mda = (KVMultiDetArray*)next_array())) { *(e->GetParameters()) += mda->GetReconParameters(); } }
void KVExpSetUp::Clear(Option_t* opt) { // call Clear(opt) for each multidetector in the setup TIter next_array(&fMDAList); KVMultiDetArray* mda; while ((mda = (KVMultiDetArray*)next_array())) { mda->Clear(opt); } }
void KVExpSetUp::prepare_to_handle_new_raw_data() { // clear all acquisition parameters etc of each array before reading new raw data event KVMultiDetArray::prepare_to_handle_new_raw_data(); TIter next_array(&fMDAList); KVMultiDetArray* mda; while ((mda = (KVMultiDetArray*)next_array())) { mda->prepare_to_handle_new_raw_data(); } }
Bool_t KVExpSetUp::HandleRawDataEvent(KVRawDataReader* g) { TIter next_array(&fMDAList); KVMultiDetArray* mda; while ((mda = (KVMultiDetArray*)next_array())) { mda->fHandledRawData = false; mda->fReconParameters.Clear(); } return (fHandledRawData = KVMultiDetArray::HandleRawDataEvent(g)); }
void KVExpSetUp::MakeCalibrationTables(KVExpDB* db) { TIter next_array(&fMDAList); KVMultiDetArray* mda; TString orig_dbtype = db->GetDBType(); while ((mda = (KVMultiDetArray*)next_array())) { db->SetDBType(Form("%sDB", mda->GetName())); mda->MakeCalibrationTables(db); } db->SetDBType(orig_dbtype); }
void KVExpSetUp::GetDetectorEvent(KVDetectorEvent* detev, const TSeqCollection* fired_params) { // Override KVMultiDetArray method // Call each array in turn and add fired groups to the KVDetectorEvent TIter next_array(&fMDAList); KVMultiDetArray* mda; while ((mda = (KVMultiDetArray*)next_array())) { mda->GetDetectorEvent(detev, fired_params); } }
void KVExpSetUp::FillDetectorList(KVReconstructedNucleus* rnuc, KVHashList* DetList, const KVString& DetNames) { // Call FillDetectorList for each array in turn, until DetList gets filled // This is because some arrays may override the KVMultiDetArray::FillDetectorList method TIter next_array(&fMDAList); KVMultiDetArray* mda; while ((mda = (KVMultiDetArray*)next_array())) { mda->FillDetectorList(rnuc, DetList, DetNames); if (!DetList->IsEmpty()) break; } }
KVGroupReconstructor* KVExpSetUp::GetReconstructorForGroup(const KVGroup* g) const { // Override KVMultiDetArray method // Call each array in turn to get reconstructor for group TIter next_array(&fMDAList); KVMultiDetArray* mda; KVGroupReconstructor* gr(nullptr); while ((mda = (KVMultiDetArray*)next_array())) { if ((gr = mda->GetReconstructorForGroup(g))) break; } return gr; }
void fault::load_fault( JsonObject &jo ) { fault f; f.id_ = fault_id( jo.get_string( "id" ) ); f.name_ = _( jo.get_string( "name" ) ); f.description_ = _( jo.get_string( "description" ) ); f.time_ = jo.get_int( "time" ); auto sk = jo.get_array( "skills" ); while( sk.has_more() ) { auto cur = sk.next_array(); f.skills_.emplace( skill_id( cur.get_string( 0 ) ), cur.size() >= 2 ? cur.get_int( 1 ) : 1 ); } if( jo.has_string( "requirements" ) ) { f.requirements_ = requirement_id( jo.get_string( "requirements" ) ); } else { auto req = jo.get_object( "requirements" ); const requirement_id req_id( std::string( "inline_fault_" ) + f.id_.str() ); requirement_data::load_requirement( req, req_id ); f.requirements_ = req_id; } if( faults_all.find( f.id_ ) != faults_all.end() ) { jo.throw_error( "parsed fault overwrites existing definition", "id" ); } else { faults_all[ f.id_ ] = f; } }
Bool_t KVExpSetUp::handle_raw_data_event_mfmframe(const MFMCommonFrame& mfmframe) { // Handle single (not merged) MFM frames of raw data. It is assumed // that each frame type corresponds to a different detector array. // Therefore as soon as one of them treats the data in the frame, // we return kTRUE. TIter next_array(&fMDAList); KVMultiDetArray* mda; while ((mda = (KVMultiDetArray*)next_array())) { if (mda->handle_raw_data_event_mfmframe(mfmframe)) { //Info("handle_raw_data_event_mfmframe", "Handled frame for %s", mda->GetName()); mda->fHandledRawData = true; return kTRUE; } } return kFALSE; }
void dont_inner_loop(int varmax, int top, int thresh, MR_ROBDD_type *f) { int arrayg[MR_ROBDD_MAXVAR]; int vg; for (vg=0; vg<varmax; ++vg) { init_array(top, vg, arrayg); dont_doit(thresh, varmax, f, vg, top, arrayg); while (next_array(top, varmax, vg, arrayg)) { dont_doit(thresh, varmax, f, vg, top, arrayg); } } }
static void parse_vp_reqs( JsonObject &obj, const std::string &id, const std::string &key, std::vector<std::pair<requirement_id, int>> &reqs, std::map<skill_id, int> &skills, int &moves ) { if( !obj.has_object( key ) ) { return; } auto src = obj.get_object( key ); auto sk = src.get_array( "skills" ); if( !sk.empty() ) { skills.clear(); } while( sk.has_more() ) { auto cur = sk.next_array(); skills.emplace( skill_id( cur.get_string( 0 ) ), cur.size() >= 2 ? cur.get_int( 1 ) : 1 ); } assign( src, "time", moves ); if( src.has_string( "using" ) ) { reqs = { { requirement_id( src.get_string( "using" ) ), 1 } }; } else if( src.has_array( "using" ) ) { auto arr = src.get_array( "using" ); while( arr.has_more() ) { auto cur = arr.next_array(); reqs.emplace_back( requirement_id( cur.get_string( 0 ) ), cur.get_int( 1 ) ); } } else { const requirement_id req_id( string_format( "inline_%s_%s", key.c_str(), id.c_str() ) ); requirement_data::load_requirement( src, req_id ); reqs = { { req_id, 1 } }; } }
void update_array_statuses() { job_array *pa; job *pjob; int iter = -1; unsigned int running; unsigned int queued; unsigned int complete; char log_buf[LOCAL_LOG_BUF_SIZE]; char jobid[PBS_MAXSVRJOBID+1]; while ((pa = next_array(&iter)) != NULL) { running = pa->ai_qs.jobs_running; complete = pa->ai_qs.num_failed + pa->ai_qs.num_successful; queued = pa->ai_qs.num_jobs - running - complete; if (LOGLEVEL >= 7) { sprintf(log_buf, "%s: unlocking ai_mutex", __func__); log_event(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, __func__, log_buf); } strcpy(jobid, pa->ai_qs.parent_id); unlock_ai_mutex(pa, __func__, "1", LOGLEVEL); if ((pjob = svr_find_job(jobid, TRUE)) != NULL) { if (running > 0) { svr_setjobstate(pjob, JOB_STATE_RUNNING, pjob->ji_qs.ji_substate, FALSE); } else if ((complete > 0) && (queued == 0)) { svr_setjobstate(pjob, JOB_STATE_COMPLETE, pjob->ji_qs.ji_substate, FALSE); } else { /* default to just calling the array queued */ svr_setjobstate(pjob, JOB_STATE_QUEUED, pjob->ji_qs.ji_substate, FALSE); } unlock_ji_mutex(pjob, __func__, "2", LOGLEVEL); } } /* END for each array */ } /* END update_array_statuses() */
void material_type::load( JsonObject &jsobj ) { mandatory( jsobj, was_loaded, "name", _name, translated_string_reader ); mandatory( jsobj, was_loaded, "bash_resist", _bash_resist ); mandatory( jsobj, was_loaded, "cut_resist", _cut_resist ); mandatory( jsobj, was_loaded, "acid_resist", _acid_resist ); mandatory( jsobj, was_loaded, "elec_resist", _elec_resist ); mandatory( jsobj, was_loaded, "fire_resist", _fire_resist ); mandatory( jsobj, was_loaded, "chip_resist", _chip_resist ); mandatory( jsobj, was_loaded, "density", _density ); optional( jsobj, was_loaded, "salvaged_into", _salvaged_into, "null" ); optional( jsobj, was_loaded, "repaired_with", _repaired_with, "null" ); optional( jsobj, was_loaded, "edible", _edible, false ); optional( jsobj, was_loaded, "soft", _soft, false ); auto arr = jsobj.get_array( "vitamins" ); while( arr.has_more() ) { auto pair = arr.next_array(); _vitamins.emplace( vitamin_id( pair.get_string( 0 ) ), pair.get_float( 1 ) ); } mandatory( jsobj, was_loaded, "bash_dmg_verb", _bash_dmg_verb, translated_string_reader ); mandatory( jsobj, was_loaded, "cut_dmg_verb", _cut_dmg_verb, translated_string_reader ); JsonArray jsarr = jsobj.get_array( "dmg_adj" ); while( jsarr.has_more() ) { _dmg_adj.push_back( _( jsarr.next_string().c_str() ) ); } JsonArray burn_data_array = jsobj.get_array( "burn_data" ); for( size_t intensity = 0; intensity < MAX_FIELD_DENSITY; intensity++ ) { if( burn_data_array.has_more() ) { JsonObject brn = burn_data_array.next_object(); _burn_data[ intensity ] = load_mat_burn_data( brn ); } else { // If not specified, supply default bool flammable = _fire_resist <= ( int )intensity; mat_burn_data mbd; if( flammable ) { mbd.burn = 1; } _burn_data[ intensity ] = mbd; } } }
/* return a server's array info struct corresponding to an array id */ job_array *get_array( char *id) { job_array *pa; int iter = -1; while ((pa = next_array(&iter)) != NULL) { lock_ai_mutex(pa, __func__, NULL, LOGLEVEL); if (strcmp(pa->ai_qs.parent_id, id) == 0) { snprintf(pa->ai_qs.parent_id, sizeof(pa->ai_qs.parent_id), "%s", id); return(pa); } unlock_ai_mutex(pa, __func__, "1", LOGLEVEL); } return(NULL); } /* END get_array() */
void fault::load_fault( JsonObject &jo ) { fault f; f.id_ = fault_id( jo.get_string( "id" ) ); f.name_ = _( jo.get_string( "name" ).c_str() ); f.description_ = _( jo.get_string( "description" ).c_str() ); auto sk = jo.get_array( "skills" ); while( sk.has_more() ) { auto cur = sk.next_array(); f.skills_.emplace( skill_id( cur.get_string( 0 ) ) , cur.size() >= 2 ? cur.get_int( 1 ) : 1 ); } auto req = jo.get_object( "requirements" ); f.requirements_.load( req ); if( faults_all.find( f.id_ ) != faults_all.end() ) { jo.throw_error( "parsed fault overwrites existing definition", "id" ); } else { faults_all[ f.id_ ] = f; DebugLog( D_INFO, DC_ALL ) << "Loaded fault: " << f.name_; } }
/** * Reads in a vehicle part from a JsonObject. */ void vpart_info::load( JsonObject &jo, const std::string &src ) { vpart_info def; if( jo.has_string( "copy-from" ) ) { auto const base = vpart_info_all.find( vpart_id( jo.get_string( "copy-from" ) ) ); auto const ab = abstract_parts.find( vpart_id( jo.get_string( "copy-from" ) ) ); if( base != vpart_info_all.end() ) { def = base->second; } else if( ab != abstract_parts.end() ) { def = ab->second; } else { deferred.emplace_back( jo.str(), src ); return; } } if( jo.has_string( "abstract" ) ) { def.id = vpart_id( jo.get_string( "abstract" ) ); } else { def.id = vpart_id( jo.get_string( "id" ) ); } assign( jo, "name", def.name_ ); assign( jo, "item", def.item ); assign( jo, "location", def.location ); assign( jo, "durability", def.durability ); assign( jo, "damage_modifier", def.dmg_mod ); assign( jo, "power", def.power ); assign( jo, "epower", def.epower ); assign( jo, "fuel_type", def.fuel_type ); assign( jo, "default_ammo", def.default_ammo ); assign( jo, "folded_volume", def.folded_volume ); assign( jo, "size", def.size ); assign( jo, "difficulty", def.difficulty ); assign( jo, "bonus", def.bonus ); assign( jo, "flags", def.flags ); if( jo.has_member( "requirements" ) ) { auto reqs = jo.get_object( "requirements" ); parse_vp_reqs( reqs, def.id.str(), "install", def.install_reqs, def.install_skills, def.install_moves ); parse_vp_reqs( reqs, def.id.str(), "removal", def.removal_reqs, def.removal_skills, def.removal_moves ); parse_vp_reqs( reqs, def.id.str(), "repair", def.repair_reqs, def.repair_skills, def.repair_moves ); def.legacy = false; } if( jo.has_member( "symbol" ) ) { def.sym = jo.get_string( "symbol" )[ 0 ]; } if( jo.has_member( "broken_symbol" ) ) { def.sym_broken = jo.get_string( "broken_symbol" )[ 0 ]; } if( jo.has_member( "color" ) ) { def.color = color_from_string( jo.get_string( "color" ) ); } if( jo.has_member( "broken_color" ) ) { def.color_broken = color_from_string( jo.get_string( "broken_color" ) ); } if( jo.has_member( "breaks_into" ) ) { JsonIn& stream = *jo.get_raw( "breaks_into" ); def.breaks_into_group = item_group::load_item_group( stream, "collection" ); } auto qual = jo.get_array( "qualities" ); if( !qual.empty() ) { def.qualities.clear(); while( qual.has_more() ) { auto pair = qual.next_array(); def.qualities[ quality_id( pair.get_string( 0 ) ) ] = pair.get_int( 1 ); } } if( jo.has_member( "damage_reduction" ) ) { JsonObject dred = jo.get_object( "damage_reduction" ); def.damage_reduction = load_damage_array( dred ); } else { def.damage_reduction.fill( 0.0f ); } if( jo.has_string( "abstract" ) ) { abstract_parts[def.id] = def; } else { vpart_info_all[def.id] = def; } }
void recipe_dictionary::load( JsonObject &jo, const std::string &src, bool uncraft ) { bool strict = src == "core"; recipe r; // defer entries dependent upon as-yet unparsed definitions if( jo.has_string( "copy-from" ) ) { auto base = jo.get_string( "copy-from" ); if( uncraft ) { if( !recipe_dict.uncraft.count( base ) ) { deferred.emplace_back( jo.str(), src ); return; } r = recipe_dict.uncraft[ base ]; } else { if( !recipe_dict.recipes.count( base ) ) { deferred.emplace_back( jo.str(), src ); return; } r = recipe_dict.recipes[ base ]; } } if( jo.has_string( "abstract" ) ) { r.ident_ = jo.get_string( "abstract" ); r.abstract = true; } else { r.ident_ = r.result = jo.get_string( "result" ); r.abstract = false; } if( !uncraft ) { if( jo.has_string( "id_suffix" ) ) { if( r.abstract ) { jo.throw_error( "abstract recipe cannot specify id_suffix", "id_suffix" ); } r.ident_ += "_" + jo.get_string( "id_suffix" ); } assign( jo, "category", r.category, strict ); assign( jo, "subcategory", r.subcategory, strict ); assign( jo, "reversible", r.reversible, strict ); } else { r.reversible = true; } assign( jo, "time", r.time, strict, 0 ); assign( jo, "difficulty", r.difficulty, strict, 0, MAX_SKILL ); assign( jo, "flags", r.flags ); // automatically set contained if we specify as container assign( jo, "contained", r.contained, strict ); r.contained |= assign( jo, "container", r.container, strict ); if( jo.has_array( "batch_time_factors" ) ) { auto batch = jo.get_array( "batch_time_factors" ); r.batch_rscale = batch.get_int( 0 ) / 100.0; r.batch_rsize = batch.get_int( 1 ); } assign( jo, "charges", r.charges ); assign( jo, "result_mult", r.result_mult ); assign( jo, "skill_used", r.skill_used, strict ); if( jo.has_member( "skills_required" ) ) { auto sk = jo.get_array( "skills_required" ); r.required_skills.clear(); if( sk.empty() ) { // clear all requirements } else if( sk.has_array( 0 ) ) { // multiple requirements while( sk.has_more() ) { auto arr = sk.next_array(); r.required_skills[skill_id( arr.get_string( 0 ) )] = arr.get_int( 1 ); } } else { // single requirement r.required_skills[skill_id( sk.get_string( 0 ) )] = sk.get_int( 1 ); } } // simplified autolearn sets requirements equal to required skills at finalization if( jo.has_bool( "autolearn" ) ) { assign( jo, "autolearn", r.autolearn ); } else if( jo.has_array( "autolearn" ) ) { r.autolearn = true; auto sk = jo.get_array( "autolearn" ); while( sk.has_more() ) { auto arr = sk.next_array(); r.autolearn_requirements[skill_id( arr.get_string( 0 ) )] = arr.get_int( 1 ); } } if( jo.has_member( "decomp_learn" ) ) { r.learn_by_disassembly.clear(); if( jo.has_int( "decomp_learn" ) ) { if( !r.skill_used ) { jo.throw_error( "decomp_learn specified with no skill_used" ); } assign( jo, "decomp_learn", r.learn_by_disassembly[r.skill_used] ); } else if( jo.has_array( "decomp_learn" ) ) { auto sk = jo.get_array( "decomp_learn" ); while( sk.has_more() ) { auto arr = sk.next_array(); r.learn_by_disassembly[skill_id( arr.get_string( 0 ) )] = arr.get_int( 1 ); } } } if( !uncraft && jo.has_member( "byproducts" ) ) { auto bp = jo.get_array( "byproducts" ); r.byproducts.clear(); while( bp.has_more() ) { auto arr = bp.next_array(); r.byproducts[ arr.get_string( 0 ) ] += arr.size() == 2 ? arr.get_int( 1 ) : 1; } } if( jo.has_member( "book_learn" ) ) { auto bk = jo.get_array( "book_learn" ); r.booksets.clear(); while( bk.has_more() ) { auto arr = bk.next_array(); r.booksets.emplace( arr.get_string( 0 ), arr.get_int( 1 ) ); } } // recipes not specifying any external requirements inherit from their parent recipe (if any) if( jo.has_string( "using" ) ) { r.reqs_external = { { requirement_id( jo.get_string( "using" ) ), 1 } }; } else if( jo.has_array( "using" ) ) { auto arr = jo.get_array( "using" ); r.reqs_external.clear(); while( arr.has_more() ) { auto cur = arr.next_array(); r.reqs_external.emplace_back( requirement_id( cur.get_string( 0 ) ), cur.get_int( 1 ) ); } } // inline requirements are always replaced (cannot be inherited) auto req_id = string_format( "inline_%s_%s", uncraft ? "uncraft" : "recipe", r.ident_.c_str() ); requirement_data::load_requirement( jo, req_id ); r.reqs_internal = { { requirement_id( req_id ), 1 } }; if( uncraft ) { recipe_dict.uncraft[ r.ident_ ] = r; } else { recipe_dict.recipes[ r.ident_ ] = r; } }
int main(int argc, char **argv) { int varmax, size, repetitions; int array[VARLIMIT]; int reps, v0; MR_ROBDD_type *f; millisec clock0, clock1, clock2, clock3; float runtime, overhead, rate; int test_nodes, overhead_nodes; if (argc < 3) { usage(argv[0]); return 20; } if ((varmax=atoi(argv[2]))<1 || varmax>=VARLIMIT) { usage(argv[0]); printf("\n varmax must be between 1 <= varmax < %d\n", VARLIMIT); return 20; } if ((size=atoi(argv[1]))<0 || size>=varmax) { usage(argv[0]); printf("\n size must be between 0 <= size < varmax\n"); return 20; } repetitions=(argc>3 ? atoi(argv[3]) : 1); if (repetitions <= 0) repetitions = 1; opcount = 0; clock0 = milli_time(); for (reps=repetitions; reps>0; --reps) { for (v0=0; v0<varmax; ++v0) { init_array(size, v0, array); f = MR_ROBDD_testing_iff_conj_array(v0, size, array); inner_loop(varmax, f); while (next_array(size, varmax, v0, array)) { f = MR_ROBDD_testing_iff_conj_array(v0, size, array); inner_loop(varmax, f); } } } clock1 = milli_time(); test_nodes = MR_ROBDD_nodes_in_use(); MR_ROBDD_initRep(); clock2 = milli_time(); for (reps=repetitions; reps>0; --reps) { for (v0=0; v0<varmax; ++v0) { init_array(size, v0, array); f = MR_ROBDD_testing_iff_conj_array(v0, size, array); dont_inner_loop(varmax, f); while (next_array(size, varmax, v0, array)) { f = MR_ROBDD_testing_iff_conj_array(v0, size, array); dont_inner_loop(varmax, f); } } } clock3 = milli_time(); overhead_nodes = MR_ROBDD_nodes_in_use(); runtime = (float)(clock1-clock0)/1000; overhead = (float)(clock3-clock2)/1000; rate = ((float)opcount)/(runtime-overhead); printf("%s %d %d %d: %.3f - %.3f = %.3f secs, %d ops, %d nodes, %.1f ops/sec\n", argv[0], size, varmax, repetitions, runtime, overhead, (runtime-overhead), opcount, test_nodes-overhead_nodes, rate); return 0; }
void recipe::load( JsonObject &jo, const std::string &src ) { bool strict = src == "dda"; abstract = jo.has_string( "abstract" ); if( abstract ) { ident_ = recipe_id( jo.get_string( "abstract" ) ); } else { result_ = jo.get_string( "result" ); ident_ = recipe_id( result_ ); } assign( jo, "time", time, strict, 0 ); assign( jo, "difficulty", difficulty, strict, 0, MAX_SKILL ); assign( jo, "flags", flags ); // automatically set contained if we specify as container assign( jo, "contained", contained, strict ); contained |= assign( jo, "container", container, strict ); if( jo.has_array( "batch_time_factors" ) ) { auto batch = jo.get_array( "batch_time_factors" ); batch_rscale = batch.get_int( 0 ) / 100.0; batch_rsize = batch.get_int( 1 ); } assign( jo, "charges", charges ); assign( jo, "result_mult", result_mult ); assign( jo, "skill_used", skill_used, strict ); if( jo.has_member( "skills_required" ) ) { auto sk = jo.get_array( "skills_required" ); required_skills.clear(); if( sk.empty() ) { // clear all requirements } else if( sk.has_array( 0 ) ) { // multiple requirements while( sk.has_more() ) { auto arr = sk.next_array(); required_skills[skill_id( arr.get_string( 0 ) )] = arr.get_int( 1 ); } } else { // single requirement required_skills[skill_id( sk.get_string( 0 ) )] = sk.get_int( 1 ); } } // simplified autolearn sets requirements equal to required skills at finalization if( jo.has_bool( "autolearn" ) ) { assign( jo, "autolearn", autolearn ); } else if( jo.has_array( "autolearn" ) ) { autolearn = true; auto sk = jo.get_array( "autolearn" ); while( sk.has_more() ) { auto arr = sk.next_array(); autolearn_requirements[skill_id( arr.get_string( 0 ) )] = arr.get_int( 1 ); } } if( jo.has_member( "decomp_learn" ) ) { learn_by_disassembly.clear(); if( jo.has_int( "decomp_learn" ) ) { if( !skill_used ) { jo.throw_error( "decomp_learn specified with no skill_used" ); } assign( jo, "decomp_learn", learn_by_disassembly[skill_used] ); } else if( jo.has_array( "decomp_learn" ) ) { auto sk = jo.get_array( "decomp_learn" ); while( sk.has_more() ) { auto arr = sk.next_array(); learn_by_disassembly[skill_id( arr.get_string( 0 ) )] = arr.get_int( 1 ); } } } if( jo.has_member( "book_learn" ) ) { auto bk = jo.get_array( "book_learn" ); booksets.clear(); while( bk.has_more() ) { auto arr = bk.next_array(); booksets.emplace( arr.get_string( 0 ), arr.size() > 1 ? arr.get_int( 1 ) : -1 ); } } // recipes not specifying any external requirements inherit from their parent recipe (if any) if( jo.has_string( "using" ) ) { reqs_external = { { requirement_id( jo.get_string( "using" ) ), 1 } }; } else if( jo.has_array( "using" ) ) { auto arr = jo.get_array( "using" ); reqs_external.clear(); while( arr.has_more() ) { auto cur = arr.next_array(); reqs_external.emplace_back( requirement_id( cur.get_string( 0 ) ), cur.get_int( 1 ) ); } } const std::string type = jo.get_string( "type" ); if( type == "recipe" ) { if( jo.has_string( "id_suffix" ) ) { if( abstract ) { jo.throw_error( "abstract recipe cannot specify id_suffix", "id_suffix" ); } ident_ = recipe_id( ident_.str() + "_" + jo.get_string( "id_suffix" ) ); } assign( jo, "category", category, strict ); assign( jo, "subcategory", subcategory, strict ); assign( jo, "reversible", reversible, strict ); if( jo.has_member( "byproducts" ) ) { auto bp = jo.get_array( "byproducts" ); byproducts.clear(); while( bp.has_more() ) { auto arr = bp.next_array(); byproducts[ arr.get_string( 0 ) ] += arr.size() == 2 ? arr.get_int( 1 ) : 1; } } } else if( type == "uncraft" ) { reversible = true; } else { jo.throw_error( "unknown recipe type", "type" ); } // inline requirements are always replaced (cannot be inherited) const auto req_id = string_format( "inline_%s_%s", type.c_str(), ident_.c_str() ); requirement_data::load_requirement( jo, req_id ); reqs_internal = { { requirement_id( req_id ), 1 } }; }
/** * Reads in a vehicle part from a JsonObject. */ void vpart_info::load( JsonObject &jo ) { vpart_info next_part; next_part.id = vpart_str_id( jo.get_string( "id" ) ); if( jo.has_member( "name" ) ) { next_part.name_ = _( jo.get_string( "name" ).c_str() ); } next_part.sym = jo.get_string("symbol")[0]; next_part.color = color_from_string(jo.get_string("color")); next_part.sym_broken = jo.get_string("broken_symbol")[0]; next_part.color_broken = color_from_string(jo.get_string("broken_color")); next_part.dmg_mod = jo.has_member("damage_modifier") ? jo.get_int("damage_modifier") : 100; next_part.durability = jo.get_int("durability"); next_part.power = jo.get_int("power", 0); next_part.epower = jo.get_int("epower", 0); next_part.folded_volume = jo.get_int("folded_volume", 0); next_part.range = jo.get_int( "range", 12 ); next_part.size = jo.get_int( "size", 0 ); //Handle the par1 union as best we can by accepting any ONE of its elements int element_count = (jo.has_member("par1") ? 1 : 0) + (jo.has_member("wheel_width") ? 1 : 0) + (jo.has_member("bonus") ? 1 : 0); if(element_count == 0) { //If not specified, assume 0 next_part.par1 = 0; } else if(element_count == 1) { if(jo.has_member("par1")) { next_part.par1 = jo.get_int("par1"); } else if(jo.has_member("wheel_width")) { next_part.par1 = jo.get_int("wheel_width"); } else { //bonus next_part.par1 = jo.get_int("bonus"); } } else { //Too many debugmsg("Error parsing vehicle part '%s': \ Use AT MOST one of: par1, wheel_width, bonus", next_part.name().c_str()); //Keep going to produce more messages if other parts are wrong next_part.par1 = 0; } next_part.fuel_type = jo.get_string( "fuel_type", "null" ); next_part.item = jo.get_string("item"); next_part.difficulty = jo.get_int("difficulty"); next_part.location = jo.has_member("location") ? jo.get_string("location") : ""; JsonArray jarr = jo.get_array("flags"); while (jarr.has_more()) { next_part.set_flag( jarr.next_string() ); } if( jo.has_member( "breaks_into" ) ) { JsonIn& stream = *jo.get_raw( "breaks_into" ); next_part.breaks_into_group = item_group::load_item_group( stream, "collection" ); } else { next_part.breaks_into_group = "EMPTY_GROUP"; } auto qual = jo.get_array( "qualities" ); while( qual.has_more() ) { auto pair = qual.next_array(); next_part.qualities[ pair.get_string( 0 ) ] = pair.get_int( 1 ); } //Calculate and cache z-ordering based off of location // list_order is used when inspecting the vehicle if(next_part.location == "on_roof") { next_part.z_order = 9; next_part.list_order = 3; } else if(next_part.location == "on_cargo") { next_part.z_order = 8; next_part.list_order = 6; } else if(next_part.location == "center") { next_part.z_order = 7; next_part.list_order = 7; } else if(next_part.location == "under") { //Have wheels show up over frames next_part.z_order = 6; next_part.list_order = 10; } else if(next_part.location == "structure") { next_part.z_order = 5; next_part.list_order = 1; } else if(next_part.location == "engine_block") { //Should be hidden by frames next_part.z_order = 4; next_part.list_order = 8 ; } else if (next_part.location == "on_battery_mount"){ //Should be hidden by frames next_part.z_order = 3; next_part.list_order = 10; } else if(next_part.location == "fuel_source") { //Should be hidden by frames next_part.z_order = 3; next_part.list_order = 9; } else if(next_part.location == "roof") { //Shouldn't be displayed next_part.z_order = -1; next_part.list_order = 4; } else if(next_part.location == "armor") { //Shouldn't be displayed (the color is used, but not the symbol) next_part.z_order = -2; next_part.list_order = 2; } else { //Everything else next_part.z_order = 0; next_part.list_order = 5; } auto const iter = vehicle_part_types.find( next_part.id ); if( iter != vehicle_part_types.end() ) { // Entry in the map already exists, so the pointer in the vector is already correct // and does not need to be changed, only the int-id needs to be taken from the old entry. next_part.loadid = iter->second.loadid; iter->second = next_part; } else { // The entry is new, "generate" a new int-id and link the new entry from the vector. next_part.loadid = vpart_id( vehicle_part_int_types.size() ); vpart_info &new_entry = vehicle_part_types[next_part.id]; new_entry = next_part; vehicle_part_int_types.push_back( &new_entry ); } }
/** * Reads in a vehicle part from a JsonObject. */ void vpart_info::load( JsonObject &jo, const std::string &src ) { vpart_info def; if( jo.has_string( "copy-from" ) ) { auto const base = vehicle_part_types.find( vpart_str_id( jo.get_string( "copy-from" ) ) ); auto const ab = abstract_parts.find( vpart_str_id( jo.get_string( "copy-from" ) ) ); if( base != vehicle_part_types.end() ) { def = base->second; } else if( ab != abstract_parts.end() ) { def = ab->second; } else { deferred.emplace_back( jo.str(), src ); } } if( jo.has_string( "abstract" ) ) { def.id = vpart_str_id( jo.get_string( "abstract" ) ); } else { def.id = vpart_str_id( jo.get_string( "id" ) ); } assign( jo, "name", def.name_ ); assign( jo, "item", def.item ); assign( jo, "location", def.location ); assign( jo, "durability", def.durability ); assign( jo, "damage_modifier", def.dmg_mod ); assign( jo, "power", def.power ); assign( jo, "epower", def.epower ); assign( jo, "fuel_type", def.fuel_type ); assign( jo, "folded_volume", def.folded_volume ); assign( jo, "size", def.size ); assign( jo, "difficulty", def.difficulty ); assign( jo, "bonus", def.bonus ); assign( jo, "flags", def.flags ); auto reqs = jo.get_object( "requirements" ); if( reqs.has_object( "install" ) ) { auto ins = reqs.get_object( "install" ); auto sk = ins.get_array( "skills" ); if( !sk.empty() ) { def.install_skills.clear(); } while( sk.has_more() ) { auto cur = sk.next_array(); def.install_skills.emplace( skill_id( cur.get_string( 0 ) ) , cur.size() >= 2 ? cur.get_int( 1 ) : 1 ); } assign( ins, "time", def.install_moves ); if( ins.has_string( "using" ) ) { def.install_reqs = { { requirement_id( ins.get_string( "using" ) ), 1 } }; } else if( ins.has_array( "using" ) ) { auto arr = ins.get_array( "using" ); while( arr.has_more() ) { auto cur = arr.next_array(); def.install_reqs.emplace_back( requirement_id( cur.get_string( 0 ) ), cur.get_int( 1 ) ); } } else { auto req_id = std::string( "inline_vehins_" ) += def.id.str(); requirement_data::load_requirement( ins, req_id ); def.install_reqs = { { requirement_id( req_id ), 1 } }; } def.legacy = false; } if( reqs.has_object( "removal" ) ) { auto rem = reqs.get_object( "removal" ); auto sk = rem.get_array( "skills" ); if( !sk.empty() ) { def.removal_skills.clear(); } while( sk.has_more() ) { auto cur = sk.next_array(); def.removal_skills.emplace( skill_id( cur.get_string( 0 ) ) , cur.size() >= 2 ? cur.get_int( 1 ) : 1 ); } assign( rem, "time", def.removal_moves ); if( rem.has_string( "using" ) ) { def.removal_reqs = { { requirement_id( rem.get_string( "using" ) ), 1 } }; } else if( rem.has_array( "using" ) ) { auto arr = rem.get_array( "using" ); while( arr.has_more() ) { auto cur = arr.next_array(); def.removal_reqs.emplace_back( requirement_id( cur.get_string( 0 ) ), cur.get_int( 1 ) ); } } else { auto req_id = std::string( "inline_vehins_" ) += def.id.str(); requirement_data::load_requirement( rem, req_id ); def.removal_reqs = { { requirement_id( req_id ), 1 } }; } def.legacy = false; } if( jo.has_member( "symbol" ) ) { def.sym = jo.get_string( "symbol" )[ 0 ]; } if( jo.has_member( "broken_symbol" ) ) { def.sym_broken = jo.get_string( "broken_symbol" )[ 0 ]; } if( jo.has_member( "color" ) ) { def.color = color_from_string( jo.get_string( "color" ) ); } if( jo.has_member( "broken_color" ) ) { def.color_broken = color_from_string( jo.get_string( "broken_color" ) ); } if( jo.has_member( "breaks_into" ) ) { JsonIn& stream = *jo.get_raw( "breaks_into" ); def.breaks_into_group = item_group::load_item_group( stream, "collection" ); } auto qual = jo.get_array( "qualities" ); if( !qual.empty() ) { def.qualities.clear(); while( qual.has_more() ) { auto pair = qual.next_array(); def.qualities[ quality_id( pair.get_string( 0 ) ) ] = pair.get_int( 1 ); } } if( jo.has_member( "damage_reduction" ) ) { JsonObject dred = jo.get_object( "damage_reduction" ); def.damage_reduction = load_damage_array( dred ); } else { def.damage_reduction.fill( 0.0f ); } if( jo.has_string( "abstract" ) ) { abstract_parts[ def.id ] = def; return; } auto const iter = vehicle_part_types.find( def.id ); if( iter != vehicle_part_types.end() ) { // Entry in the map already exists, so the pointer in the vector is already correct // and does not need to be changed, only the int-id needs to be taken from the old entry. def.loadid = iter->second.loadid; iter->second = def; } else { // The entry is new, "generate" a new int-id and link the new entry from the vector. def.loadid = vpart_id( vehicle_part_int_types.size() ); vpart_info &new_entry = vehicle_part_types[ def.id ]; new_entry = def; vehicle_part_int_types.push_back( &new_entry ); } }
void mutation_branch::load( JsonObject &jsobj ) { const std::string id = jsobj.get_string( "id" ); mutation_branch &new_mut = mutation_data[id]; JsonArray jsarr; new_mut.name = _(jsobj.get_string("name").c_str()); new_mut.description = _(jsobj.get_string("description").c_str()); new_mut.points = jsobj.get_int("points"); new_mut.visibility = jsobj.get_int("visibility", 0); new_mut.ugliness = jsobj.get_int("ugliness", 0); new_mut.startingtrait = jsobj.get_bool("starting_trait", false); new_mut.mixed_effect = jsobj.get_bool("mixed_effect", false); new_mut.activated = jsobj.get_bool("active", false); new_mut.starts_active = jsobj.get_bool("starts_active", false); new_mut.destroys_gear = jsobj.get_bool("destroys_gear", false); new_mut.allow_soft_gear = jsobj.get_bool("allow_soft_gear", false); new_mut.cost = jsobj.get_int("cost", 0); new_mut.cooldown = jsobj.get_int("time",0); new_mut.hunger = jsobj.get_bool("hunger",false); new_mut.thirst = jsobj.get_bool("thirst",false); new_mut.fatigue = jsobj.get_bool("fatigue",false); new_mut.valid = jsobj.get_bool("valid", true); new_mut.purifiable = jsobj.get_bool("purifiable", true); for( auto & s : jsobj.get_string_array( "initial_ma_styles" ) ) { new_mut.initial_ma_styles.push_back( matype_id( s ) ); } JsonArray bodytemp_array = jsobj.get_array( "bodytemp_modifiers" ); if( bodytemp_array.has_more() ) { new_mut.bodytemp_min = bodytemp_array.get_int( 0 ); new_mut.bodytemp_max = bodytemp_array.get_int( 1 ); } new_mut.bodytemp_sleep = jsobj.get_int( "bodytemp_sleep", 0 ); new_mut.threshold = jsobj.get_bool("threshold", false); new_mut.profession = jsobj.get_bool("profession", false); auto vr = jsobj.get_array( "vitamin_rates" ); while( vr.has_more() ) { auto pair = vr.next_array(); new_mut.vitamin_rates[ vitamin_id( pair.get_string( 0 ) ) ] = pair.get_int( 1 ); } load_mutation_mods(jsobj, "passive_mods", new_mut.mods); /* Not currently supported due to inability to save active mutation state load_mutation_mods(jsobj, "active_mods", new_mut.mods); */ new_mut.prereqs = jsobj.get_string_array( "prereqs" ); // Helps to be able to have a trait require more than one other trait // (Individual prereq-lists are "OR", not "AND".) // Traits shoud NOT appear in both lists for a given mutation, unless // you want that trait to satisfy both requirements. // These are additional to the first list. new_mut.prereqs2 = jsobj.get_string_array( "prereqs2" ); // Dedicated-purpose prereq slot for Threshold mutations // Stuff like Huge might fit in more than one mutcat post-threshold, so yeah new_mut.threshreq = jsobj.get_string_array( "threshreq" ); new_mut.cancels = jsobj.get_string_array( "cancels" ); new_mut.replacements = jsobj.get_string_array( "changes_to" ); new_mut.additions = jsobj.get_string_array( "leads_to" ); new_mut.flags = jsobj.get_tags( "flags" ); jsarr = jsobj.get_array("category"); while (jsarr.has_more()) { std::string s = jsarr.next_string(); new_mut.category.push_back(s); mutations_category[s].push_back(id); } jsarr = jsobj.get_array("wet_protection"); while (jsarr.has_more()) { JsonObject jo = jsarr.next_object(); std::string part_id = jo.get_string("part"); int ignored = jo.get_int("ignored", 0); int neutral = jo.get_int("neutral", 0); int good = jo.get_int("good", 0); tripoint protect = tripoint(ignored, neutral, good); new_mut.protection[get_body_part_token( part_id )] = protect; } jsarr = jsobj.get_array("encumbrance_always"); while (jsarr.has_more()) { JsonArray jo = jsarr.next_array(); std::string part_id = jo.next_string(); int enc = jo.next_int(); new_mut.encumbrance_always[get_body_part_token( part_id )] = enc; } jsarr = jsobj.get_array("encumbrance_covered"); while (jsarr.has_more()) { JsonArray jo = jsarr.next_array(); std::string part_id = jo.next_string(); int enc = jo.next_int(); new_mut.encumbrance_covered[get_body_part_token( part_id )] = enc; } jsarr = jsobj.get_array("restricts_gear"); while( jsarr.has_more() ) { new_mut.restricts_gear.insert( get_body_part_token( jsarr.next_string() ) ); } jsarr = jsobj.get_array( "armor" ); while( jsarr.has_more() ) { JsonObject jo = jsarr.next_object(); auto parts = jo.get_tags( "parts" ); std::set<body_part> bps; for( const std::string &part_string : parts ) { if( part_string == "ALL" ) { // Shorthand, since many muts protect whole body for( size_t i = 0; i < num_bp; i++ ) { bps.insert( static_cast<body_part>( i ) ); } } else { bps.insert( get_body_part_token( part_string ) ); } } resistances res = load_resistances_instance( jo ); for( body_part bp : bps ) { new_mut.armor[ bp ] = res; } } }
int is_array( char *id) { job_array *pa; int iter = -1; char *bracket_ptr; char *end_bracket_ptr; char jobid[PBS_MAXSVRJOBID]; char temp_jobid[PBS_MAXSVRJOBID]; snprintf(jobid, sizeof(jobid), "%s", id); /* Check to see if we have an array dependency */ /* If there is an array dependency count then we will */ /* have an id of something like arrayid[][1]. We need to take */ /* off the [1] so we can compare the array id with and existing */ /* array entry. */ if ((bracket_ptr = strchr(jobid,'[')) != NULL) { /* Make sure the next character is ']' */ if (*(++bracket_ptr) != ']') { /* If we do not have a ']' then we have bad syntax. */ return(FALSE); } if (*(++bracket_ptr) == '[') { /* we made it to here. That means we have a count inside brackets. Just truncate them for the name comparison */ end_bracket_ptr = strchr(bracket_ptr, ']'); if (end_bracket_ptr == NULL) { /* we do not have a ']' then we have bad syntax. */ return(FALSE); } /* advance end_bracket_ptr one. We should be either NULL or '.' */ end_bracket_ptr++; /* truncate the string */ *bracket_ptr = 0; /* this makes jobid just the arrayid name */ /* append the rest of the job id */ snprintf(temp_jobid, sizeof(jobid), "%s%s", jobid, end_bracket_ptr); snprintf(jobid, sizeof(jobid), "%s", temp_jobid); } } else { /* No '[' then we do not have an array */ return (FALSE); } while ((pa = next_array(&iter)) != NULL) { lock_ai_mutex(pa, __func__, NULL, LOGLEVEL); if (strcmp(pa->ai_qs.parent_id, jobid) == 0) { unlock_ai_mutex(pa, __func__, "1", LOGLEVEL); return(TRUE); } unlock_ai_mutex(pa, __func__, "1", LOGLEVEL); } return(FALSE); } /* END is_array() */
void mutation_branch::load( JsonObject &jo, const std::string & ) { mandatory( jo, was_loaded, "id", id ); mandatory( jo, was_loaded, "name", raw_name, translated_string_reader ); mandatory( jo, was_loaded, "description", raw_desc, translated_string_reader ); mandatory( jo, was_loaded, "points", points ); optional( jo, was_loaded, "visibility", visibility, 0 ); optional( jo, was_loaded, "ugliness", ugliness, 0 ); optional( jo, was_loaded, "starting_trait", startingtrait, false ); optional( jo, was_loaded, "mixed_effect", mixed_effect, false ); optional( jo, was_loaded, "active", activated, false ); optional( jo, was_loaded, "starts_active", starts_active, false ); optional( jo, was_loaded, "destroys_gear", destroys_gear, false ); optional( jo, was_loaded, "allow_soft_gear", allow_soft_gear, false ); optional( jo, was_loaded, "cost", cost, 0 ); optional( jo, was_loaded, "time", cooldown, 0 ); optional( jo, was_loaded, "hunger", hunger, false ); optional( jo, was_loaded, "thirst", thirst, false ); optional( jo, was_loaded, "fatigue", fatigue, false ); optional( jo, was_loaded, "valid", valid, true ); optional( jo, was_loaded, "purifiable", purifiable, true ); if( jo.has_object( "spawn_item" ) ) { auto si = jo.get_object( "spawn_item" ); optional( si, was_loaded, "type", spawn_item ); optional( si, was_loaded, "message", raw_spawn_item_message ); } if( jo.has_object( "ranged_mutation" ) ) { auto si = jo.get_object( "ranged_mutation" ); optional( si, was_loaded, "type", ranged_mutation ); optional( si, was_loaded, "message", raw_ranged_mutation_message ); } optional( jo, was_loaded, "initial_ma_styles", initial_ma_styles ); if( jo.has_array( "bodytemp_modifiers" ) ) { auto bodytemp_array = jo.get_array( "bodytemp_modifiers" ); bodytemp_min = bodytemp_array.get_int( 0 ); bodytemp_max = bodytemp_array.get_int( 1 ); } optional( jo, was_loaded, "bodytemp_sleep", bodytemp_sleep, 0 ); optional( jo, was_loaded, "threshold", threshold, false ); optional( jo, was_loaded, "profession", profession, false ); optional( jo, was_loaded, "debug", debug, false ); optional( jo, was_loaded, "player_display", player_display, true ); JsonArray vr = jo.get_array( "vitamin_rates" ); while( vr.has_more() ) { auto pair = vr.next_array(); vitamin_rates.emplace( vitamin_id( pair.get_string( 0 ) ), time_duration::from_turns( pair.get_int( 1 ) ) ); } auto vam = jo.get_array( "vitamins_absorb_multi" ); while( vam.has_more() ) { auto pair = vam.next_array(); std::map<vitamin_id, double> vit; auto vit_array = pair.get_array( 1 ); // fill the inner map with vitamins while( vit_array.has_more() ) { auto vitamins = vit_array.next_array(); vit.emplace( vitamin_id( vitamins.get_string( 0 ) ), vitamins.get_float( 1 ) ); } // assign the inner vitamin map to the material_id key vitamin_absorb_multi.emplace( material_id( pair.get_string( 0 ) ), vit ); } optional( jo, was_loaded, "healing_awake", healing_awake, 0.0f ); optional( jo, was_loaded, "healing_resting", healing_resting, 0.0f ); optional( jo, was_loaded, "hp_modifier", hp_modifier, 0.0f ); optional( jo, was_loaded, "hp_modifier_secondary", hp_modifier_secondary, 0.0f ); optional( jo, was_loaded, "hp_adjustment", hp_adjustment, 0.0f ); optional( jo, was_loaded, "stealth_modifier", stealth_modifier, 0.0f ); optional( jo, was_loaded, "str_modifier", str_modifier, 0.0f ); optional( jo, was_loaded, "dodge_modifier", dodge_modifier, 0.0f ); optional( jo, was_loaded, "speed_modifier", speed_modifier, 1.0f ); optional( jo, was_loaded, "movecost_modifier", movecost_modifier, 1.0f ); optional( jo, was_loaded, "movecost_flatground_modifier", movecost_flatground_modifier, 1.0f ); optional( jo, was_loaded, "movecost_obstacle_modifier", movecost_obstacle_modifier, 1.0f ); optional( jo, was_loaded, "attackcost_modifier", attackcost_modifier, 1.0f ); optional( jo, was_loaded, "max_stamina_modifier", max_stamina_modifier, 1.0f ); optional( jo, was_loaded, "weight_capacity_modifier", weight_capacity_modifier, 1.0f ); optional( jo, was_loaded, "hearing_modifier", hearing_modifier, 1.0f ); optional( jo, was_loaded, "noise_modifier", noise_modifier, 1.0f ); optional( jo, was_loaded, "metabolism_modifier", metabolism_modifier, 0.0f ); optional( jo, was_loaded, "thirst_modifier", thirst_modifier, 0.0f ); optional( jo, was_loaded, "fatigue_modifier", fatigue_modifier, 0.0f ); optional( jo, was_loaded, "fatigue_regen_modifier", fatigue_regen_modifier, 0.0f ); optional( jo, was_loaded, "stamina_regen_modifier", stamina_regen_modifier, 0.0f ); optional( jo, was_loaded, "overmap_sight", overmap_sight, 0.0f ); optional( jo, was_loaded, "overmap_multiplier", overmap_multiplier, 1.0f ); if( jo.has_object( "social_modifiers" ) ) { JsonObject sm = jo.get_object( "social_modifiers" ); social_mods = load_mutation_social_mods( sm ); } load_mutation_mods( jo, "passive_mods", mods ); /* Not currently supported due to inability to save active mutation state load_mutation_mods(jsobj, "active_mods", new_mut.mods); */ optional( jo, was_loaded, "prereqs", prereqs ); optional( jo, was_loaded, "prereqs2", prereqs2 ); optional( jo, was_loaded, "threshreq", threshreq ); optional( jo, was_loaded, "cancels", cancels ); optional( jo, was_loaded, "changes_to", replacements ); optional( jo, was_loaded, "leads_to", additions ); optional( jo, was_loaded, "flags", flags ); optional( jo, was_loaded, "types", types ); auto jsarr = jo.get_array( "category" ); while( jsarr.has_more() ) { std::string s = jsarr.next_string(); category.push_back( s ); mutations_category[s].push_back( trait_id( id ) ); } jsarr = jo.get_array( "wet_protection" ); while( jsarr.has_more() ) { JsonObject jo = jsarr.next_object(); std::string part_id = jo.get_string( "part" ); int ignored = jo.get_int( "ignored", 0 ); int neutral = jo.get_int( "neutral", 0 ); int good = jo.get_int( "good", 0 ); tripoint protect = tripoint( ignored, neutral, good ); protection[get_body_part_token( part_id )] = protect; } jsarr = jo.get_array( "encumbrance_always" ); while( jsarr.has_more() ) { JsonArray jo = jsarr.next_array(); std::string part_id = jo.next_string(); int enc = jo.next_int(); encumbrance_always[get_body_part_token( part_id )] = enc; } jsarr = jo.get_array( "encumbrance_covered" ); while( jsarr.has_more() ) { JsonArray jo = jsarr.next_array(); std::string part_id = jo.next_string(); int enc = jo.next_int(); encumbrance_covered[get_body_part_token( part_id )] = enc; } jsarr = jo.get_array( "restricts_gear" ); while( jsarr.has_more() ) { restricts_gear.insert( get_body_part_token( jsarr.next_string() ) ); } jsarr = jo.get_array( "armor" ); while( jsarr.has_more() ) { JsonObject jo = jsarr.next_object(); auto parts = jo.get_tags( "parts" ); std::set<body_part> bps; for( const std::string &part_string : parts ) { if( part_string == "ALL" ) { // Shorthand, since many mutations protect whole body bps.insert( all_body_parts.begin(), all_body_parts.end() ); } else { bps.insert( get_body_part_token( part_string ) ); } } resistances res = load_resistances_instance( jo ); for( body_part bp : bps ) { armor[ bp ] = res; } } if( jo.has_array( "attacks" ) ) { jsarr = jo.get_array( "attacks" ); while( jsarr.has_more() ) { JsonObject jo = jsarr.next_object(); attacks_granted.emplace_back( load_mutation_attack( jo ) ); } } else if( jo.has_object( "attacks" ) ) { JsonObject attack = jo.get_object( "attacks" ); attacks_granted.emplace_back( load_mutation_attack( attack ) ); } }
void gun_actor::load_internal( JsonObject &obj, const std::string & ) { gun_type = obj.get_string( "gun_type" ); obj.read( "ammo_type", ammo_type ); if( obj.has_array( "fake_skills" ) ) { JsonArray jarr = obj.get_array( "fake_skills" ); while( jarr.has_more() ) { JsonArray cur = jarr.next_array(); fake_skills[skill_id( cur.get_string( 0 ) )] = cur.get_int( 1 ); } } obj.read( "fake_str", fake_str ); obj.read( "fake_dex", fake_dex ); obj.read( "fake_int", fake_int ); obj.read( "fake_per", fake_per ); auto arr = obj.get_array( "ranges" ); while( arr.has_more() ) { auto mode = arr.next_array(); if( mode.size() < 2 || mode.get_int( 0 ) > mode.get_int( 1 ) ) { obj.throw_error( "incomplete or invalid range specified", "ranges" ); } ranges.emplace( std::make_pair<int, int>( mode.get_int( 0 ), mode.get_int( 1 ) ), gun_mode_id( mode.size() > 2 ? mode.get_string( 2 ) : "" ) ); } obj.read( "max_ammo", max_ammo ); obj.read( "move_cost", move_cost ); if( obj.read( "description", description ) ) { description = _( description ); } if( obj.read( "failure_msg", failure_msg ) ) { failure_msg = _( failure_msg ); } if( obj.read( "no_ammo_sound", no_ammo_sound ) ) { no_ammo_sound = _( no_ammo_sound ); } else { no_ammo_sound = _( "Click." ); } obj.read( "targeting_cost", targeting_cost ); obj.read( "require_targeting_player", require_targeting_player ); obj.read( "require_targeting_npc", require_targeting_npc ); obj.read( "require_targeting_monster", require_targeting_monster ); obj.read( "targeting_timeout", targeting_timeout ); obj.read( "targeting_timeout_extend", targeting_timeout_extend ); if( obj.read( "targeting_sound", targeting_sound ) ) { targeting_sound = _( targeting_sound ); } else { targeting_sound = _( "Beep." ); } obj.read( "targeting_volume", targeting_volume ); obj.get_bool( "laser_lock", laser_lock ); obj.read( "require_sunlight", require_sunlight ); }
void material_type::load( JsonObject &jsobj, const std::string & ) { mandatory( jsobj, was_loaded, "name", _name ); mandatory( jsobj, was_loaded, "bash_resist", _bash_resist ); mandatory( jsobj, was_loaded, "cut_resist", _cut_resist ); mandatory( jsobj, was_loaded, "acid_resist", _acid_resist ); mandatory( jsobj, was_loaded, "elec_resist", _elec_resist ); mandatory( jsobj, was_loaded, "fire_resist", _fire_resist ); mandatory( jsobj, was_loaded, "chip_resist", _chip_resist ); mandatory( jsobj, was_loaded, "density", _density ); assign( jsobj, "salvaged_into", _salvaged_into ); optional( jsobj, was_loaded, "repaired_with", _repaired_with, "null" ); optional( jsobj, was_loaded, "edible", _edible, false ); optional( jsobj, was_loaded, "soft", _soft, false ); auto arr = jsobj.get_array( "vitamins" ); while( arr.has_more() ) { auto pair = arr.next_array(); _vitamins.emplace( vitamin_id( pair.get_string( 0 ) ), pair.get_float( 1 ) ); } mandatory( jsobj, was_loaded, "bash_dmg_verb", _bash_dmg_verb ); mandatory( jsobj, was_loaded, "cut_dmg_verb", _cut_dmg_verb ); JsonArray jsarr = jsobj.get_array( "dmg_adj" ); while( jsarr.has_more() ) { _dmg_adj.push_back( jsarr.next_string() ); } JsonArray burn_data_array = jsobj.get_array( "burn_data" ); for( size_t intensity = 0; intensity < MAX_FIELD_DENSITY; intensity++ ) { if( burn_data_array.has_more() ) { JsonObject brn = burn_data_array.next_object(); _burn_data[ intensity ] = load_mat_burn_data( brn ); } else { // If not specified, supply default bool flammable = _fire_resist <= static_cast<int>( intensity ); mat_burn_data mbd; if( flammable ) { mbd.burn = 1; } _burn_data[ intensity ] = mbd; } } auto bp_array = jsobj.get_array( "burn_products" ); while( bp_array.has_more( ) ) { auto pair = bp_array.next_array(); _burn_products.emplace_back( pair.get_string( 0 ), static_cast< float >( pair.get_float( 1 ) ) ); } auto compactor_in_array = jsobj.get_array( "compact_accepts" ); while( compactor_in_array.has_more( ) ) { _compact_accepts.emplace_back( compactor_in_array.next_string() ); } auto compactor_out_array = jsobj.get_array( "compacts_into" ); while( compactor_out_array.has_more( ) ) { _compacts_into.emplace_back( compactor_out_array.next_string() ); } }