str MDBgetStackFrameN(Client cntxt, MalBlkPtr m, MalStkPtr s, InstrPtr p) { int n; bat *ret = getArgReference_bat(s, p, 0); bat *ret2 = getArgReference_bat(s, p, 1); BAT *b = BATnew(TYPE_void, TYPE_str, 256, TRANSIENT); BAT *bn = BATnew(TYPE_void, TYPE_str, 256, TRANSIENT); if (b == 0 || bn == 0) { BBPreclaim(b); BBPreclaim(bn); throw(MAL, "mdb.getStackFrame", MAL_MALLOC_FAIL); } BATseqbase(b,0); BATseqbase(bn,0); n = *getArgReference_int(s, p, 2); if (n < 0 || n >= getStkDepth(s)){ BBPunfix(b->batCacheid); throw(MAL, "mdb.getStackFrame", ILLEGAL_ARGUMENT " Illegal depth."); } pseudo(ret,b,"view","stk","frame"); pseudo(ret2,bn,"view","stk","frameB"); return MDBgetFrame(b, bn, cntxt, m, s, n); }
/* * The BAT status is redundantly stored in CMDbat_info. */ str CMDbbpLocation(bat *ret) { BAT *b; int i; char buf[MAXPATHLEN]; char cwd[MAXPATHLEN]; if (getcwd(cwd, MAXPATHLEN) == NULL) throw(MAL, "catalog.bbpLocation", RUNTIME_DIR_ERROR); b = BATnew(TYPE_void, TYPE_str, getBBPsize(), TRANSIENT); if (b == 0) throw(MAL, "catalog.bbpLocation", MAL_MALLOC_FAIL); BATseqbase(b,0); BBPlock("CMDbbpLocation"); for (i = 1; i < getBBPsize(); i++) if (i != b->batCacheid) { if (BBP_logical(i) && (BBP_refs(i) || BBP_lrefs(i))) { snprintf(buf,MAXPATHLEN,"%s/bat/%s",cwd,BBP_physical(i)); BUNappend(b, buf, FALSE); } } BBPunlock("CMDbbpLocation"); if (!(b->batDirty&2)) BATsetaccess(b, BAT_READ); pseudo(ret,b,"bbp","location"); return MAL_SUCCEED; }
str CMDbbpCount(bat *ret) { BAT *b, *bn; int i; lng l; b = BATnew(TYPE_void, TYPE_lng, getBBPsize(), TRANSIENT); if (b == 0) throw(MAL, "catalog.bbpCount", MAL_MALLOC_FAIL); BATseqbase(b,0); for (i = 1; i < getBBPsize(); i++) if (i != b->batCacheid) { if (BBP_logical(i) && (BBP_refs(i) || BBP_lrefs(i))) { bn = BATdescriptor(i); if (bn) { l = BATcount(bn); BUNappend(b, &l, FALSE); BBPunfix(bn->batCacheid); } } } if (!(b->batDirty&2)) BATsetaccess(b, BAT_READ); pseudo(ret,b,"bbp","count"); return MAL_SUCCEED; }
void menu_rand() { int a, c, m, x, i; suite_t* suite; clear(); a = get_int("Valeur a", 0, 9999); c = get_int("Valeur c", 0, 9999); m = get_int("Valeur m", 0, 9999); x = get_int("Valeur x", 0, 9999); printf("\n"); suite = pseudo(a, c, m, x); if(suite == NULL) { get_enter(); return; } printf("Voici la suite généré avec a=%d, c=%d, m=%d, x=%d :\n", a, c, m, x); printf("["); for(i = 0; i < suite->taille; i++) printf("%d, ", suite->suite[i]); printf("\b\b]\n"); get_enter(); free(suite); }
str CMDbbpNames(bat *ret) { BAT *b; int i; b = BATnew(TYPE_void, TYPE_str, getBBPsize(), TRANSIENT); if (b == 0) throw(MAL, "catalog.bbpNames", MAL_MALLOC_FAIL); BATseqbase(b,0); BBPlock("CMDbbpNames"); for (i = 1; i < getBBPsize(); i++) if (i != b->batCacheid) { if (BBP_logical(i) && (BBP_refs(i) || BBP_lrefs(i)) ) { BUNappend(b, BBP_logical(i), FALSE); if (BBP_logical(-i) && (BBP_refs(-i) || BBP_lrefs(-i)) && !BBPtmpcheck(BBP_logical(-i))) BUNappend(b, BBP_logical(-i), FALSE); } } BBPunlock("CMDbbpNames"); if (!(b->batDirty&2)) BATsetaccess(b, BAT_READ); pseudo(ret,b,"bbp","name"); return MAL_SUCCEED; }
str CMDbbpKind(bat *ret) { BAT *b; int i; b = BATnew(TYPE_void, TYPE_str, getBBPsize(), TRANSIENT); if (b == 0) throw(MAL, "catalog.bbpKind", MAL_MALLOC_FAIL); BATseqbase(b,0); BBPlock("CMDbbpKind"); for (i = 1; i < getBBPsize(); i++) if (i != b->batCacheid) if (BBP_logical(i) && (BBP_refs(i) || BBP_lrefs(i))) { char *mode = NULL; if ((BBP_status(i) & BBPDELETED) || !(BBP_status(i) & BBPPERSISTENT)) mode = "transient"; else mode = "persistent"; if (mode) BUNappend(b, mode, FALSE); } BBPunlock("CMDbbpKind"); if (!(b->batDirty&2)) BATsetaccess(b, BAT_READ); pseudo(ret,b,"bbp","kind"); return MAL_SUCCEED; }
static void client(int sock, const char *name) { char buff[BUF_SIZE + 1]; fd_set rdfs; write_server(sock, name); while (42) { do_select(sock, &rdfs); if (FD_ISSET(STDIN_FILENO, &rdfs)) { read_msg(buff); write_server(sock, buff); } else if (FD_ISSET(sock, &rdfs)) { if (read_server(sock, buff) == 0) { printf("Server disconnected !\n"); break ; } ft_putendl(buff); if (ft_strcmp(buff, "Pseudo already used") == 0) write_server(sock, pseudo()); } } close(sock); }
int pseudo(int n, int min, int max) { if (n == 0) return min; return (17 * pseudo(n-1, min, max)) % (max + 1 - min) + min; }
void tmotifcolumnsample2() { vector<string> seqs; vector<string> names; get_fasta_fast("test.seq", seqs, names); Seqset s(seqs); vector<double> pseudo(4); pseudo[0] = pseudo[1] = pseudo[2] = pseudo[3] = 0.25; vector<double> backfreq(4); backfreq[0] = backfreq[1] = backfreq[2] = backfreq[3] = 0.25; Motif m(s, 9, pseudo, backfreq); m.add_site(0, 9, 1); m.add_site(1, 12, 1); m.add_site(2, 10, 0); m.add_site(3, 19, 1); m.add_site(4, 5, 0); cerr << m.consensus() << '\n'; m.column_sample(); m.column_sample(); const vector<Site>& sites = m.sites(); assert(sites[0].posit() == 6); assert(sites[1].posit() == 9); assert(sites[2].posit() == 13); assert(sites[3].posit() == 16); assert(sites[4].posit() == 8); cerr << "Passed tmotifcolumnsample2!\n"; }
str CMDbbpHeat(bat *ret) { BAT *b; int i; b = BATnew(TYPE_void, TYPE_int, getBBPsize(), TRANSIENT); if (b == 0) throw(MAL, "catalog.bbpHeat", MAL_MALLOC_FAIL); BATseqbase(b,0); BBPlock("CMDbbpHeat"); for (i = 1; i < getBBPsize(); i++) if (i != b->batCacheid) { if (BBP_cache(i) && !monet_modulesilent) { int heat = BBP_lastused(i); BUNins(b, &i, &heat, FALSE); } else if (BBP_logical(i) && (BBP_refs(i) || BBP_lrefs(i))) { int zero = 0; BUNins(b, &i, &zero, FALSE); } } BBPunlock("CMDbbpHeat"); if (!(b->batDirty&2)) BATsetaccess(b, BAT_READ); pseudo(ret,b,"bbp","heat"); return MAL_SUCCEED; }
/* print out a linky (or fail if it's Not Allowed) */ static int linkyformat(MMIOT *f, Cstring text, int image, Footnote *ref) { linkytype *tag; if ( image ) tag = &imaget; else if ( tag = pseudo(ref->link) ) { if ( f->flags & (NO_PSEUDO_PROTO|SAFELINK) ) return 0; } else if ( (f->flags & SAFELINK) && T(ref->link) && (T(ref->link)[0] != '/') && !isautoprefix(T(ref->link)) ) /* if SAFELINK, only accept links that are local or * a well-known protocol */ return 0; else tag = &linkt; if ( f->flags & tag->flags ) return 0; if ( tag->link_pfx ) { Qstring(tag->link_pfx, f); if ( tag->kind & IS_URL ) { if ( f->base && T(ref->link) && (T(ref->link)[tag->szpat] == '/') ) puturl(f->base, strlen(f->base), f, 0); puturl(T(ref->link) + tag->szpat, S(ref->link) - tag->szpat, f, 0); } else ___mkd_reparse(T(ref->link) + tag->szpat, S(ref->link) - tag->szpat, INSIDE_TAG, f); Qstring(tag->link_sfx, f); if ( tag->WxH && ref->height && ref->width ) { Qprintf(f," height=\"%d\"", ref->height); Qprintf(f, " width=\"%d\"", ref->width); } if ( S(ref->title) ) { Qstring(" title=\"", f); ___mkd_reparse(T(ref->title), S(ref->title), INSIDE_TAG, f); Qchar('"', f); } Qstring(tag->text_pfx, f); ___mkd_reparse(T(text), S(text), tag->flags, f); Qstring(tag->text_sfx, f); } else Qwrite(T(ref->link) + tag->szpat, S(ref->link) - tag->szpat, f); return 1; } /* linkyformat */
str MDBgetStackFrame(Client cntxt, MalBlkPtr m, MalStkPtr s, InstrPtr p) { bat *ret = getArgReference_bat(s, p, 0); bat *ret2 = getArgReference_bat(s, p, 1); BAT *b = BATnew(TYPE_void, TYPE_str, 256, TRANSIENT); BAT *bn = BATnew(TYPE_void, TYPE_str, 256, TRANSIENT); if (b == 0 || bn == 0) { BBPreclaim(b); BBPreclaim(bn); throw(MAL, "mdb.getStackFrame", MAL_MALLOC_FAIL); } BATseqbase(b,0); BATseqbase(bn,0); pseudo(ret,b,"view","stk","frame"); pseudo(ret2,bn,"view","stk","frame"); return MDBgetFrame(b,bn, cntxt, m, s, 0); }
int main(int argc, char **argv) { int sock; if (argc != 3) { printf("Usage: %s <machine> <port>\n", argv[0]); exit(-1); } sock = init_connection(argv[1], ft_atoi(argv[2])); client(sock, pseudo()); return (0); }
/* print out a linky (or fail if it's Not Allowed) */ static int linkyformat(MMIOT *f, Cstring text, int image, Footnote *ref) { linkytype *tag; if ( image ) tag = &imaget; else if ( tag = pseudo(ref->link) ) { if ( f->flags & (MKD_NO_EXT|MKD_SAFELINK) ) return 0; } else if ( (f->flags & MKD_SAFELINK) && T(ref->link) && (T(ref->link)[0] != '/') && !isautoprefix(T(ref->link), S(ref->link)) ) /* if MKD_SAFELINK, only accept links that are local or * a well-known protocol */ return 0; else tag = &linkt; if ( f->flags & tag->flags ) return 0; if ( f->flags & IS_LABEL ) ___mkd_reparse(T(text), S(text), tag->flags, f); else if ( tag->link_pfx ) { printlinkyref(f, tag, T(ref->link), S(ref->link)); if ( tag->WxH ) { if ( ref->height ) Qprintf(f," height=\"%d\"", ref->height); if ( ref->width ) Qprintf(f, " width=\"%d\"", ref->width); } if ( S(ref->title) ) { Qstring(" title=\"", f); ___mkd_reparse(T(ref->title), S(ref->title), MKD_TAGTEXT, f); Qchar('"', f); } Qstring(tag->text_pfx, f); ___mkd_reparse(T(text), S(text), tag->flags, f); Qstring(tag->text_sfx, f); } else Qwrite(T(ref->link) + tag->szpat, S(ref->link) - tag->szpat, f); return 1; } /* linkyformat */
RatePseudoRootJacobianNumerical::RatePseudoRootJacobianNumerical(const Matrix& pseudoRoot, Size aliveIndex, Size numeraire, const std::vector<Time>& taus, const std::vector<Matrix>& pseudoBumps, const std::vector<Spread>& displacements) : pseudoRoot_(pseudoRoot), aliveIndex_(aliveIndex), taus_(taus), displacements_(displacements), numberBumps_(pseudoBumps.size()), factors_(pseudoRoot.columns()), drifts_(taus.size()), bumpedRates_(taus.size()) { Size numberRates= taus.size(); QL_REQUIRE(pseudoRoot_.rows()==numberRates, "pseudoRoot_.rows()<> taus.size()"); QL_REQUIRE(displacements_.size()==numberRates, "displacements_.size()<> taus.size()"); QL_REQUIRE(drifts_.size()==numberRates, "drifts_.size()<> taus.size()"); for (Size i=0; i < pseudoBumps.size(); ++i) { QL_REQUIRE(pseudoBumps[i].rows()==numberRates, "pseudoBumps[i].rows()<> taus.size() with i =" << i); QL_REQUIRE(pseudoBumps[i].columns()==factors_, "pseudoBumps[i].columns()<> factors with i = " << i); Matrix pseudo(pseudoRoot_); pseudo += pseudoBumps[i]; pseudoBumped_.push_back(pseudo); driftsComputers_.push_back(LMMDriftCalculator(pseudo, displacements, taus, numeraire, aliveIndex)); } }
// Special case of pseudo element "::" void CSSselector::pseudo(int type, std::string name) { int group = 0; int connected = 0; // Check previous tag to see if it applies to this one. if (tagContainer.size() != 0){ group = tagContainer.back().getTagGroup() + 1; connected = tagContainer.back().getTagType(); } if ( type == 1 ) { CSStag::setTag(3, group, connected, ""); CSStag::setTagExtend(1); insertSelector(); } pseudo(name); }
void tmotifcolumnsample1() { vector<string> seqs; vector<string> names; get_fasta_fast("test.seq", seqs, names); Seqset s(seqs); vector<double> pseudo(4); pseudo[0] = pseudo[1] = pseudo[2] = pseudo[3] = 0.25; vector<double> backfreq(4); backfreq[0] = backfreq[1] = backfreq[2] = backfreq[3] = 0.25; Motif m(s, 9, pseudo, backfreq); m.add_site(0, 6, 1); m.add_site(1, 9, 1); m.add_site(2, 13, 0); m.add_site(3, 16, 1); m.add_site(4, 8, 0); assert(m.column_sample() == false); cerr << "Passed tmotifcolumnsample1!\n"; }
void tmotifconsensus() { vector<string> seqs; vector<string> names; get_fasta_fast("test.seq", seqs, names); Seqset s(seqs); vector<double> pseudo(4); pseudo[0] = pseudo[1] = pseudo[2] = pseudo[3] = 0.25; vector<double> backfreq(4); backfreq[0] = backfreq[1] = backfreq[2] = backfreq[3] = 0.25; Motif m(s, 9, pseudo, backfreq); m.add_site(0, 6, 1); m.add_site(1, 9, 1); m.add_site(2, 13, 0); m.add_site(3, 16, 1); m.add_site(4, 8, 0); string cons("ACCGTTTCC"); assert(cons.compare(m.consensus()) == 0); cerr << "Passed tmotifconsensus!\n"; }
void tmotifread() { vector<string> seqs; vector<string> names; get_fasta_fast("test.seq", seqs, names); Seqset s(seqs); vector<double> pseudo(4); pseudo[0] = pseudo[1] = pseudo[2] = pseudo[3] = 0.25; vector<double> backfreq(4); backfreq[0] = backfreq[1] = backfreq[2] = backfreq[3] = 0.25; Motif m(s, 12, pseudo, backfreq); ifstream motin("test.mot"); assert(motin.good()); m.read(motin); motin.close(); assert(m.ncols() == 9); assert(m.get_width() == 9); string cons("ACCGTTTCC"); assert(cons.compare(m.consensus()) == 0); cerr << "Passed tmotifread!\n"; }
void tmotifaddcoltoright() { vector<string> seqs; vector<string> names; get_fasta_fast("test.seq", seqs, names); Seqset s(seqs); vector<double> pseudo(4); pseudo[0] = pseudo[1] = pseudo[2] = pseudo[3] = 0.25; vector<double> backfreq(4); backfreq[0] = backfreq[1] = backfreq[2] = backfreq[3] = 0.25; Motif m(s, 9, pseudo, backfreq); m.add_site(0, 6, 1); m.add_site(1, 9, 1); m.add_site(2, 13, 0); m.add_site(3, 16, 1); m.add_site(4, 8, 0); // Check sites const vector<Site>& sites = m.sites(); assert(sites[0].posit() == 6); assert(sites[1].posit() == 9); assert(sites[2].posit() == 13); assert(sites[3].posit() == 16); assert(sites[4].posit() == 8); m.add_col(10); // Check columns for(int i = 0; i < 9; i++) assert(m.column(i) == i); assert(m.column(9) == 10); // Check sites assert(sites[0].posit() == 6); assert(sites[1].posit() == 9); assert(sites[2].posit() == 11); assert(sites[3].posit() == 16); assert(sites[4].posit() == 6); cerr << "Passed tmotifaddcoltoright!\n"; }
/* * It is illustrative to dump the code when you * have encountered an error. */ str MDBgetDefinition(Client cntxt, MalBlkPtr m, MalStkPtr stk, InstrPtr p) { int i; bat *ret = getArgReference_bat(stk, p, 0); str ps; BAT *b = BATnew(TYPE_void, TYPE_str, 256, TRANSIENT); (void) cntxt; if (b == 0) throw(MAL, "mdb.getDefinition", MAL_MALLOC_FAIL); BATseqbase(b,0); for (i = 0; i < m->stop; i++) { ps = instruction2str(m,0, getInstrPtr(m, i), 1); BUNappend(b, ps, FALSE); GDKfree(ps); } if (!(b->batDirty&2)) BATsetaccess(b, BAT_READ); pseudo(ret,b,"view","fcn","stmt"); return MAL_SUCCEED; }
str CMDbbpLRefCount(bat *ret) { BAT *b; int i; b = BATnew(TYPE_void, TYPE_int, getBBPsize(), TRANSIENT); if (b == 0) throw(MAL, "catalog.bbpLRefCount", MAL_MALLOC_FAIL); BATseqbase(b,0); BBPlock("CMDbbpLRefCount"); for (i = 1; i < getBBPsize(); i++) if (i != b->batCacheid && BBP_logical(i) && (BBP_refs(i) || BBP_lrefs(i))) { int refs = BBP_lrefs(i); BUNappend(b, &refs, FALSE); } BBPunlock("CMDbbpLRefCount"); if (!(b->batDirty&2)) BATsetaccess(b, BAT_READ); pseudo(ret,b,"bbp","lrefcnt"); return MAL_SUCCEED; }
/* * The BAT status is redundantly stored in CMDbat_info. */ str CMDbbpStatus(bat *ret) { BAT *b; int i; b = BATnew(TYPE_void, TYPE_str, getBBPsize(), TRANSIENT); if (b == 0) throw(MAL, "catalog.bbpStatus", MAL_MALLOC_FAIL); BATseqbase(b,0); BBPlock("CMDbbpStatus"); for (i = 1; i < getBBPsize(); i++) if (i != b->batCacheid) if (BBP_logical(i) && (BBP_refs(i) || BBP_lrefs(i))) { char *loc = BBP_cache(i) ? "load" : "disk"; BUNappend(b, loc, FALSE); } BBPunlock("CMDbbpStatus"); if (!(b->batDirty&2)) BATsetaccess(b, BAT_READ); pseudo(ret,b,"bbp","status"); return MAL_SUCCEED; }
/* * The BAT dirty status:dirty => (mem != disk); diffs = not-committed */ str CMDbbpDirty(bat *ret) { BAT *b; int i; b = BATnew(TYPE_void, TYPE_str, getBBPsize(), TRANSIENT); if (b == 0) throw(MAL, "catalog.bbpDirty", MAL_MALLOC_FAIL); BATseqbase(b,0); BBPlock("CMDbbpDirty"); for (i = 1; i < getBBPsize(); i++) if (i != b->batCacheid) if (BBP_logical(i) && (BBP_refs(i) || BBP_lrefs(i))) { BAT *bn = BBP_cache(i); BUNappend(b, bn ? BATdirty(bn) ? "dirty" : DELTAdirty(bn) ? "diffs" : "clean" : (BBP_status(i) & BBPSWAPPED) ? "diffs" : "clean", FALSE); } BBPunlock("CMDbbpDirty"); if (!(b->batDirty&2)) BATsetaccess(b, BAT_READ); pseudo(ret,b,"bbp","status"); return MAL_SUCCEED; }
str MDBStkTrace(Client cntxt, MalBlkPtr m, MalStkPtr s, InstrPtr p) { BAT *b, *bn; str msg; char *buf; bat *ret = getArgReference_bat(s, p, 0); bat *ret2 = getArgReference_bat(s, p, 1); int k = 0; size_t len,l; b = BATnew(TYPE_void, TYPE_int, 256, TRANSIENT); if ( b== NULL) throw(MAL, "mdb.getStackTrace", MAL_MALLOC_FAIL); bn = BATnew(TYPE_void, TYPE_str, 256, TRANSIENT); if ( bn== NULL) { BBPreclaim(b); throw(MAL, "mdb.getStackTrace", MAL_MALLOC_FAIL); } BATseqbase(b,0); BATseqbase(bn,0); (void) cntxt; msg = instruction2str(s->blk, s, p, LIST_MAL_DEBUG); len = strlen(msg); buf = (char*) GDKmalloc(len +1024); if ( buf == NULL){ GDKfree(msg); throw(MAL,"mdb.setTrace",MAL_MALLOC_FAIL); } snprintf(buf,len+1024,"%s at %s.%s[%d]", msg, getModuleId(getInstrPtr(m,0)), getFunctionId(getInstrPtr(m,0)), getPC(m, p)); BUNappend(b, &k, FALSE); BUNappend(bn, buf, FALSE); GDKfree(msg); for (s = s->up, k++; s != NULL; s = s->up, k++) { msg = instruction2str(s->blk, s, getInstrPtr(s->blk,s->pcup),LIST_MAL_DEBUG); l = strlen(msg); if (l>len){ GDKfree(buf); len=l; buf = (char*) GDKmalloc(len +1024); if ( buf == NULL){ GDKfree(msg); BBPunfix(b->batCacheid); BBPunfix(bn->batCacheid); throw(MAL,"mdb.setTrace",MAL_MALLOC_FAIL); } } snprintf(buf,len+1024,"%s at %s.%s[%d]", msg, getModuleId(getInstrPtr(s->blk,0)), getFunctionId(getInstrPtr(s->blk,0)), s->pcup); BUNappend(b, &k, FALSE); BUNappend(bn, buf, FALSE); GDKfree(msg); } GDKfree(buf); if (!(b->batDirty&2)) BATsetaccess(b, BAT_READ); if (!(bn->batDirty&2)) BATsetaccess(bn, BAT_READ); pseudo(ret,b,"view","stk","trace"); pseudo(ret2,bn,"view","stk","traceB"); return MAL_SUCCEED; }
// Handles interactions with a vehicle in the examine menu. Pickup::interact_results Pickup::interact_with_vehicle( vehicle *veh, const tripoint &pos, int veh_root_part ) { if( veh == nullptr ) { return ITEMS_FROM_GROUND; } std::vector<std::string> menu_items; std::vector<uimenu_entry> options_message; const bool has_items_on_ground = g->m.sees_some_items( pos, g->u ); const bool items_are_sealed = g->m.has_flag( "SEALED", pos ); const bool has_kitchen = ( veh->part_with_feature( veh_root_part, "KITCHEN" ) >= 0 ); const bool has_faucet = ( veh->part_with_feature( veh_root_part, "FAUCET" ) >= 0 ); const bool has_weldrig = ( veh->part_with_feature( veh_root_part, "WELDRIG" ) >= 0 ); const bool has_chemlab = ( veh->part_with_feature( veh_root_part, "CHEMLAB" ) >= 0 ); const bool has_purify = ( veh->part_with_feature( veh_root_part, "WATER_PURIFIER" ) >= 0 ); const bool has_controls = ( ( veh->part_with_feature( veh_root_part, "CONTROLS" ) >= 0 ) || ( veh->part_with_feature( veh_root_part, "CTRL_ELECTRONIC" ) >= 0 ) ); const int cargo_part = veh->part_with_feature( veh_root_part, "CARGO", false ); const bool from_vehicle = veh && cargo_part >= 0 && !veh->get_items( cargo_part ).empty(); const bool can_be_folded = veh->is_foldable(); const bool is_convertible = ( veh->tags.count( "convertible" ) > 0 ); const bool remotely_controlled = g->remoteveh() == veh; typedef enum { EXAMINE, CONTROL, GET_ITEMS, GET_ITEMS_ON_GROUND, FOLD_VEHICLE, USE_HOTPLATE, FILL_CONTAINER, DRINK, USE_WELDER, USE_PURIFIER, PURIFY_TANK, } options; uimenu selectmenu; selectmenu.addentry( EXAMINE, true, 'e', _( "Examine vehicle" ) ); if( has_controls ) { selectmenu.addentry( CONTROL, true, 'v', _( "Control vehicle" ) ); } if( from_vehicle ) { selectmenu.addentry( GET_ITEMS, true, 'g', _( "Get items" ) ); } if( has_items_on_ground && !items_are_sealed ) { selectmenu.addentry( GET_ITEMS_ON_GROUND, true, 'i', _( "Get items on the ground" ) ); } if( ( can_be_folded || is_convertible ) && !remotely_controlled ) { selectmenu.addentry( FOLD_VEHICLE, true, 'f', _( "Fold vehicle" ) ); } if( ( has_kitchen || has_chemlab ) && veh->fuel_left( "battery" ) > 0 ) { selectmenu.addentry( USE_HOTPLATE, true, 'h', _( "Use the hotplate" ) ); } if( has_faucet && veh->fuel_left( "water_clean" ) > 0 ) { selectmenu.addentry( FILL_CONTAINER, true, 'c', _( "Fill a container with water" ) ); selectmenu.addentry( DRINK, true, 'd', _( "Have a drink" ) ); } if( has_weldrig && veh->fuel_left( "battery" ) > 0 ) { selectmenu.addentry( USE_WELDER, true, 'w', _( "Use the welding rig?" ) ); } if( has_purify && veh->fuel_left( "battery" ) > 0 ) { selectmenu.addentry( USE_PURIFIER, true, 'p', _( "Purify water in carried container" ) ); } if( has_purify && veh->fuel_left( "battery" ) > 0 && veh->fuel_left( "water" ) > 0 && veh->fuel_capacity( "water_clean" ) > veh->fuel_left( "water_clean" ) ) { selectmenu.addentry( PURIFY_TANK, true, 'P', _( "Purify water in vehicle's tank" ) ); } int choice; if( selectmenu.entries.size() == 1 ) { choice = selectmenu.entries.front().retval; } else { selectmenu.return_invalid = true; selectmenu.text = _( "Select an action" ); selectmenu.selected = 0; selectmenu.query(); choice = selectmenu.ret; } switch( static_cast<options>( choice ) ) { case USE_HOTPLATE: { item pseudo( "hotplate" ); itype_id ammo = pseudo.ammo_default(); pseudo.ammo_set( ammo, veh->drain( ammo, pseudo.ammo_capacity() ) ); if( pseudo.ammo_sufficient() ) { g->u.invoke_item( &pseudo ); pseudo.ammo_consume( pseudo.ammo_required(), g->u.pos() ); veh->refill( ammo, pseudo.ammo_remaining() ); } return DONE; } case FILL_CONTAINER: g->u.siphon( *veh, "water_clean" ); return DONE; case DRINK: { veh->drain( "water_clean", 1 ); item water( "water_clean", 0 ); g->u.eat( water ); g->u.moves -= 250; return DONE; } case USE_WELDER: { item pseudo( "welder" ); itype_id ammo = pseudo.ammo_default(); pseudo.ammo_set( ammo, veh->drain( ammo, pseudo.ammo_capacity() ) ); if( pseudo.ammo_sufficient() ) { g->u.invoke_item( &pseudo ); pseudo.ammo_consume( pseudo.ammo_required(), g->u.pos() ); veh->refill( ammo, pseudo.ammo_remaining() ); // Evil hack incoming auto &act = g->u.activity; if( act.type == ACT_REPAIR_ITEM ) { // Magic: first tell activity the item doesn't really exist act.index = INT_MIN; // Then tell it to search it on `pos` act.coords.push_back( pos ); // Finally tell it it is the vehicle part with weldrig act.values.resize( 2 ); act.values[1] = veh->part_with_feature( veh_root_part, "WELDRIG" ); } } return DONE; } case USE_PURIFIER: { item pseudo( "water_purifier" ); itype_id ammo = pseudo.ammo_default(); pseudo.ammo_set( ammo, veh->drain( ammo, pseudo.ammo_capacity() ) ); if( pseudo.ammo_sufficient() ) { g->u.invoke_item( &pseudo ); pseudo.ammo_consume( pseudo.ammo_required(), g->u.pos() ); veh->refill( ammo, pseudo.ammo_remaining() ); } return DONE; } case PURIFY_TANK: { const int max_water = std::min( veh->fuel_left( "water" ), veh->fuel_capacity( "water_clean" ) - veh->fuel_left( "water_clean" ) ); const int purify_amount = std::min( veh->fuel_left( "battery" ), max_water ); veh->drain( "battery", purify_amount ); veh->drain( "water", purify_amount ); veh->refill( "water_clean", purify_amount ); return DONE; } case FOLD_VEHICLE: veh->fold_up(); return DONE; case CONTROL: if( veh->interact_vehicle_locked() ) { veh->use_controls( pos ); } return DONE; case EXAMINE: g->exam_vehicle( *veh ); return DONE; case GET_ITEMS_ON_GROUND: return ITEMS_FROM_GROUND; case GET_ITEMS: return from_vehicle ? ITEMS_FROM_CARGO : ITEMS_FROM_GROUND; } return DONE; }
// Handles interactions with a vehicle in the examine menu. interact_results interact_with_vehicle( vehicle *veh, const tripoint &pos, int veh_root_part ) { if( veh == nullptr ) { return ITEMS_FROM_GROUND; } std::vector<std::string> menu_items; std::vector<uimenu_entry> options_message; const bool has_items_on_ground = g->m.sees_some_items( pos, g->u ); const bool items_are_sealed = g->m.has_flag( "SEALED", pos ); auto turret = veh->turret_query( pos ); const bool has_kitchen = ( veh->part_with_feature( veh_root_part, "KITCHEN" ) >= 0 ); const bool has_faucet = ( veh->part_with_feature( veh_root_part, "FAUCET" ) >= 0 ); const bool has_weldrig = ( veh->part_with_feature( veh_root_part, "WELDRIG" ) >= 0 ); const bool has_chemlab = ( veh->part_with_feature( veh_root_part, "CHEMLAB" ) >= 0 ); const bool has_purify = ( veh->part_with_feature( veh_root_part, "WATER_PURIFIER" ) >= 0 ); const bool has_controls = ( ( veh->part_with_feature( veh_root_part, "CONTROLS" ) >= 0 ) || ( veh->part_with_feature( veh_root_part, "CTRL_ELECTRONIC" ) >= 0 ) ); const int cargo_part = veh->part_with_feature( veh_root_part, "CARGO", false ); const bool from_vehicle = cargo_part >= 0 && !veh->get_items( cargo_part ).empty(); const bool can_be_folded = veh->is_foldable(); const bool is_convertible = ( veh->tags.count( "convertible" ) > 0 ); const bool remotely_controlled = g->remoteveh() == veh; const int washing_machine_part = veh->part_with_feature( veh_root_part, "WASHING_MACHINE" ); const bool has_washmachine = washing_machine_part >= 0; bool washing_machine_on = ( washing_machine_part == -1 ) ? false : veh->parts[washing_machine_part].enabled; const bool has_monster_capture = ( veh->part_with_feature( veh_root_part, "CAPTURE_MONSTER_VEH" ) >= 0 ); const int monster_capture_part = veh->part_with_feature( veh_root_part, "CAPTURE_MONSTER_VEH" ); typedef enum { EXAMINE, TRACK, CONTROL, CONTROL_ELECTRONICS, GET_ITEMS, GET_ITEMS_ON_GROUND, FOLD_VEHICLE, UNLOAD_TURRET, RELOAD_TURRET, USE_HOTPLATE, FILL_CONTAINER, DRINK, USE_WELDER, USE_PURIFIER, PURIFY_TANK, USE_WASHMACHINE, USE_MONSTER_CAPTURE } options; uimenu selectmenu; selectmenu.addentry( EXAMINE, true, 'e', _( "Examine vehicle" ) ); selectmenu.addentry( TRACK, true, keybind( "TOGGLE_TRACKING" ), veh->tracking_toggle_string() ); if( has_controls ) { selectmenu.addentry( CONTROL, true, 'v', _( "Control vehicle" ) ); selectmenu.addentry( CONTROL_ELECTRONICS, true, keybind( "CONTROL_MANY_ELECTRONICS" ), _( "Control multiple electronics" ) ); } if( has_washmachine ) { selectmenu.addentry( USE_WASHMACHINE, true, 'W', washing_machine_on ? _( "Deactivate the washing machine" ) : _( "Activate the washing machine (1.5 hours)" ) ); } if( from_vehicle && !washing_machine_on ) { selectmenu.addentry( GET_ITEMS, true, 'g', _( "Get items" ) ); } if( has_items_on_ground && !items_are_sealed ) { selectmenu.addentry( GET_ITEMS_ON_GROUND, true, 'i', _( "Get items on the ground" ) ); } if( ( can_be_folded || is_convertible ) && !remotely_controlled ) { selectmenu.addentry( FOLD_VEHICLE, true, 'f', _( "Fold vehicle" ) ); } if( turret.can_unload() ) { selectmenu.addentry( UNLOAD_TURRET, true, 'u', _( "Unload %s" ), turret.name().c_str() ); } if( turret.can_reload() ) { selectmenu.addentry( RELOAD_TURRET, true, 'r', _( "Reload %s" ), turret.name().c_str() ); } if( ( has_kitchen || has_chemlab ) && veh->fuel_left( "battery" ) > 0 ) { selectmenu.addentry( USE_HOTPLATE, true, 'h', _( "Use the hotplate" ) ); } if( has_faucet && veh->fuel_left( "water_clean" ) > 0 ) { selectmenu.addentry( FILL_CONTAINER, true, 'c', _( "Fill a container with water" ) ); selectmenu.addentry( DRINK, true, 'd', _( "Have a drink" ) ); } if( has_weldrig && veh->fuel_left( "battery" ) > 0 ) { selectmenu.addentry( USE_WELDER, true, 'w', _( "Use the welding rig?" ) ); } if( has_purify ) { bool can_purify = veh->fuel_left( "battery" ) >= item::find_type( "water_purifier" )->charges_to_use(); selectmenu.addentry( USE_PURIFIER, can_purify, 'p', _( "Purify water in carried container" ) ); selectmenu.addentry( PURIFY_TANK, can_purify && veh->fuel_left( "water" ), 'P', _( "Purify water in vehicle tank" ) ); } if( has_monster_capture ) { selectmenu.addentry( USE_MONSTER_CAPTURE, true, 'G', _( "Capture or release a creature" ) ); } int choice; if( selectmenu.entries.size() == 1 ) { choice = selectmenu.entries.front().retval; } else { selectmenu.return_invalid = true; selectmenu.text = _( "Select an action" ); selectmenu.selected = 0; selectmenu.query(); choice = selectmenu.ret; } auto veh_tool = [&]( const itype_id & obj ) { item pseudo( obj ); if( veh->fuel_left( "battery" ) < pseudo.ammo_required() ) { return false; } auto qty = pseudo.ammo_capacity() - veh->discharge_battery( pseudo.ammo_capacity() ); pseudo.ammo_set( "battery", qty ); g->u.invoke_item( &pseudo ); veh->charge_battery( pseudo.ammo_remaining() ); return true; }; switch( static_cast<options>( choice ) ) { case USE_MONSTER_CAPTURE: { veh->use_monster_capture( monster_capture_part, pos ); return DONE; } case USE_HOTPLATE: veh_tool( "hotplate" ); return DONE; case USE_WASHMACHINE: { veh->use_washing_machine( washing_machine_part ); return DONE; } case FILL_CONTAINER: g->u.siphon( *veh, "water_clean" ); return DONE; case DRINK: { item water( "water_clean", 0 ); if( g->u.eat( water ) ) { veh->drain( "water_clean", 1 ); g->u.moves -= 250; } return DONE; } case USE_WELDER: { if( veh_tool( "welder" ) ) { // Evil hack incoming auto &act = g->u.activity; if( act.id() == activity_id( "ACT_REPAIR_ITEM" ) ) { // Magic: first tell activity the item doesn't really exist act.index = INT_MIN; // Then tell it to search it on `pos` act.coords.push_back( pos ); // Finally tell if it is the vehicle part with welding rig act.values.resize( 2 ); act.values[1] = veh->part_with_feature( veh_root_part, "WELDRIG" ); } } return DONE; } case USE_PURIFIER: veh_tool( "water_purifier" ); return DONE; case PURIFY_TANK: { auto sel = []( const vehicle_part & pt ) { return pt.is_tank() && pt.ammo_current() == "water"; }; auto title = string_format( _( "Purify <color_%s>water</color> in tank" ), get_all_colors().get_name( item::find_type( "water" )->color ).c_str() ); auto &tank = veh_interact::select_part( *veh, sel, title ); if( tank ) { double cost = item::find_type( "water_purifier" )->charges_to_use(); if( veh->fuel_left( "battery" ) < tank.ammo_remaining() * cost ) { //~ $1 - vehicle name, $2 - part name add_msg( m_bad, _( "Insufficient power to purify the contents of the %1$s's %2$s" ), veh->name.c_str(), tank.name().c_str() ); } else { //~ $1 - vehicle name, $2 - part name add_msg( m_good, _( "You purify the contents of the %1$s's %2$s" ), veh->name.c_str(), tank.name().c_str() ); veh->discharge_battery( tank.ammo_remaining() * cost ); tank.ammo_set( "water_clean", tank.ammo_remaining() ); } } return DONE; } case UNLOAD_TURRET: { g->unload( *turret.base() ); return DONE; } case RELOAD_TURRET: { item::reload_option opt = g->u.select_ammo( *turret.base(), true ); if( opt ) { g->u.assign_activity( activity_id( "ACT_RELOAD" ), opt.moves(), opt.qty() ); g->u.activity.targets.emplace_back( turret.base() ); g->u.activity.targets.push_back( std::move( opt.ammo ) ); } return DONE; } case FOLD_VEHICLE: veh->fold_up(); return DONE; case CONTROL: veh->use_controls( pos ); return DONE; case CONTROL_ELECTRONICS: veh->control_electronics(); return DONE; case EXAMINE: g->exam_vehicle( *veh ); return DONE; case TRACK: veh->toggle_tracking( ); return DONE; case GET_ITEMS_ON_GROUND: return ITEMS_FROM_GROUND; case GET_ITEMS: return from_vehicle ? ITEMS_FROM_CARGO : ITEMS_FROM_GROUND; } return DONE; }