void proc_exit_connector(struct task_struct *task) { struct cn_msg *msg; struct proc_event *ev; __u8 buffer[CN_PROC_MSG_SIZE]; struct timespec ts; if (atomic_read(&proc_event_num_listeners) < 1) return; msg = (struct cn_msg *)buffer; ev = (struct proc_event *)msg->data; get_seq(&msg->seq, &ev->cpu); ktime_get_ts(&ts); /* get high res monotonic timestamp */ put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); ev->what = PROC_EVENT_EXIT; ev->event_data.exit.process_pid = task->pid; ev->event_data.exit.process_tgid = task->tgid; ev->event_data.exit.exit_code = task->exit_code; ev->event_data.exit.exit_signal = task->exit_signal; memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); msg->ack = 0; /* not used */ msg->len = sizeof(*ev); cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); }
void proc_fork_connector(struct task_struct *task) { struct cn_msg *msg; struct proc_event *ev; __u8 buffer[CN_PROC_MSG_SIZE]; struct timespec ts; struct task_struct *parent; if (atomic_read(&proc_event_num_listeners) < 1) return; msg = (struct cn_msg *)buffer; ev = (struct proc_event *)msg->data; get_seq(&msg->seq, &ev->cpu); ktime_get_ts(&ts); /* get high res monotonic timestamp */ put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); ev->what = PROC_EVENT_FORK; rcu_read_lock(); parent = rcu_dereference(task->real_parent); ev->event_data.fork.parent_pid = parent->pid; ev->event_data.fork.parent_tgid = parent->tgid; rcu_read_unlock(); ev->event_data.fork.child_pid = task->pid; ev->event_data.fork.child_tgid = task->tgid; memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); msg->ack = 0; /* not used */ msg->len = sizeof(*ev); /* If cn_netlink_send() failed, the data is not sent */ cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); }
void proc_exec_connector(struct task_struct *task) { struct cn_msg *msg; struct proc_event *ev; struct timespec ts; __u8 buffer[CN_PROC_MSG_SIZE]; const struct cred *cred; if (atomic_read(&proc_event_num_listeners) < 1) return; msg = (struct cn_msg*)buffer; ev = (struct proc_event*)msg->data; get_seq(&msg->seq, &ev->cpu); ktime_get_ts(&ts); /* get high res monotonic timestamp */ put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); ev->what = PROC_EVENT_EXEC; ev->event_data.exec.process_pid = task->pid; ev->event_data.exec.process_tgid = task->tgid; rcu_read_lock(); cred = __task_cred(task); ev->event_data.exec.process_euid = cred->euid; ev->event_data.exec.process_egid = cred->egid; rcu_read_unlock(); proc_get_exe(task, ev->event_data.exec.exe); memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); msg->ack = 0; /* not used */ msg->len = sizeof(*ev); cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); }
void proc_ptrace_connector(struct task_struct *task, int ptrace_id) { struct cn_msg *msg; struct proc_event *ev; struct timespec ts; __u8 buffer[CN_PROC_MSG_SIZE]; if (atomic_read(&proc_event_num_listeners) < 1) return; msg = (struct cn_msg *)buffer; ev = (struct proc_event *)msg->data; get_seq(&msg->seq, &ev->cpu); ktime_get_ts(&ts); /* get high res monotonic timestamp */ put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); ev->what = PROC_EVENT_PTRACE; ev->event_data.ptrace.process_pid = task->pid; ev->event_data.ptrace.process_tgid = task->tgid; if (ptrace_id == PTRACE_ATTACH) { ev->event_data.ptrace.tracer_pid = current->pid; ev->event_data.ptrace.tracer_tgid = current->tgid; } else if (ptrace_id == PTRACE_DETACH) { ev->event_data.ptrace.tracer_pid = 0; ev->event_data.ptrace.tracer_tgid = 0; } else return; memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); msg->ack = 0; /* not used */ msg->len = sizeof(*ev); cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); }
void FoldingEngine<SEQ>:: max_mcc_fold(const std::string& name, const SEQ& seq, std::ostream& out, uint num_samples) { double MCC = -1.0; double SEN, PPV; std::string PAREN; calculate_posterior(seq); prepare_stochastic_traceback(seq); for (uint n=0; n!=num_samples; ++n) { std::string p(seq.size(), '.'); std::vector<int> paren = stochastic_traceback(seq); for (uint i=0; i!=paren.size(); ++i) { if (paren[i]>int(i)) { p[i-1] = '('; p[paren[i]-1] = ')'; } } double sen, ppv, mcc; compute_expected_accuracy(p, sen, ppv, mcc); if (MCC<mcc) { PAREN = p; MCC = mcc; SEN = sen; PPV = ppv; } } clean_stochastic_traceback(seq); out << ">" << name << "\n" << get_seq(seq) << "\n" << PAREN << " [MCC=" << MCC << "]" << std::endl; }
void FoldingEngine<SEQ>:: centroid_fold(const std::string& name, const SEQ& seq, const std::vector<float>& gamma, std::ostream& out) { #ifdef HAVE_LIBRNA Vienna::eos_debug = -1; #endif calculate_posterior(seq); out << ">" << name << std::endl << get_seq(seq) << std::endl; std::vector<float>::const_iterator g; for (g=gamma.begin(); g!=gamma.end(); ++g) { std::string paren; float p = decode_structure(*g, paren); out << paren; #ifdef HAVE_LIBRNA float e = calc_energy(seq, paren.c_str()); #endif if (!mea_) { out << " (g=" << *g << ",th=" << (1.0/(1.0+*g)); #ifdef HAVE_LIBRNA out << ",e=" << e; #endif out << ")"; } else { out << " (g=" << *g << ",EA=" << p; #ifdef HAVE_LIBRNA out << ",e=" << e; #endif out << ")"; } out << std::endl; } }
void proc_coredump_connector(struct task_struct *task) { struct cn_msg *msg; struct proc_event *ev; __u8 buffer[CN_PROC_MSG_SIZE] __aligned(8); struct timespec ts; if (atomic_read(&proc_event_num_listeners) < 1) return; msg = buffer_to_cn_msg(buffer); ev = (struct proc_event *)msg->data; memset(&ev->event_data, 0, sizeof(ev->event_data)); get_seq(&msg->seq, &ev->cpu); ktime_get_ts(&ts); /* get high res monotonic timestamp */ ev->timestamp_ns = timespec_to_ns(&ts); ev->what = PROC_EVENT_COREDUMP; ev->event_data.coredump.process_pid = task->pid; ev->event_data.coredump.process_tgid = task->tgid; memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); msg->ack = 0; /* not used */ msg->len = sizeof(*ev); msg->flags = 0; /* not used */ cn_netlink_send(msg, 0, CN_IDX_PROC, GFP_KERNEL); }
int AceSockHdrBase::open(void* p) { if (super::open(p) != 0) { ACE_DEBUG((LM_ERROR, "[%D] AceSockHdrBase super::open failed\n")); return -1; } // 目前如果多线程使用这个类产生的序列号 sock_seq_ 是有可能重复的 sock_seq_ = total_seq_++; this->peer().get_remote_addr(remote_addr_); ACE_DEBUG((LM_DEBUG, "[%D] AceSockHdrBase conn with %s:%d" ",sock_seq:%d,sock_fd:%d\n" , remote_addr_.get_host_addr() , remote_addr_.get_port_number() , get_seq(), get_handle() )); this->peer().enable(ACE_NONBLOCK); //显式设置成非阻塞模式 //将新建连接的发送和接受缓存区设置为64K int buf_size = 2*MAX_INNER_MSG_LEN; this->peer().set_option(SOL_SOCKET, SO_RCVBUF, (void*)&buf_size, sizeof(int)); this->peer().set_option(SOL_SOCKET, SO_SNDBUF, (void*)&buf_size, sizeof(int)); return 0; }
/* Debug functions that don't use curses - handy for valgrind testing */ static void test_mode(GapIO *io, contig_t **c, int xpos) { rangec_t *r; int nr, i; r = contig_seqs_in_range(io, c, xpos, xpos+79, CSIR_SORT_BY_X, &nr); for (i = 0; i < nr; i++) { seq_t *s = get_seq(io, r[i].rec); printf("%.*s: range %d..%d seq %d+%d st=%d en=%d %.*s\n", s->name_len, s->name, r[i].start, r[i].end, s->pos, s->len, s->left, s->right, ABS(s->len), s->seq); s = dup_seq(s); complement_seq_t(s); printf("%.*s: range %d..%d seq %d+%d st=%d en=%d %.*s\n", s->name_len, s->name, r[i].start, r[i].end, s->pos, s->len, s->left, s->right, ABS(s->len), s->seq); } gio_close(io); system("ps lx | grep g_iotest | grep -v grep"); exit(0); }
int readseqs(char *filename) { int i, l1, no_seqs; FILE *fin = fopen(filename, "r"); char *seq1, chartab[128]; if (!fin) { bots_message("Could not open sequence file (%s)\n", filename); exit (-1); } if ( fscanf(fin,"Number of sequences is %d", &no_seqs) == EOF ) { bots_message("Sequence file is bogus (%s)\n", filename); exit(-1); }; fill_chartab(chartab); bots_message("Sequence format is Pearson\n"); alloc_aln(no_seqs); for (i = 1; i <= no_seqs; i++) { seq1 = get_seq(names[i], &l1, chartab, fin); seqlen_array[i] = l1; seq_array[i] = (char *) malloc((l1 + 2) * sizeof (char)); encode(seq1, seq_array[i], l1); free(seq1); } return no_seqs; }
void clean_send_window(uint8_t seq, window* to_clean, window* removed, int* len) { seq = get_seq(seq); int i = 0; while (i < MAX_WINDOW_SIZE) { if (!is_empty_frame(to_clean[i].frame) && seq == to_clean[i].frame.seq) { memcpy(&removed[*len], &to_clean[i], sizeof(window)); init_frame(&to_clean[i].frame); init_timer(&to_clean[i].timer); (*len)++; clean_send_window(get_seq(seq-1), to_clean, removed, len); } i++; } }
/* This function cannot parse a general ABCD format file, only the specific type (ABCD k*b^n+c with fixed k,b,c and variable n) written by srsieve. */ static int read_abcd_file(const char *file_name) { FILE *file; const char *line; uint64_t k, p_start; int64_t c; uint32_t seq, n, delta, b, n_count, s_count; file = xfopen(file_name, "r", error); n_count = s_count = seq = n = 0; while ((line = read_line(file)) != NULL) { if (sscanf(line, "%" SCNu32, &delta) == 1) { if (s_count == 0) { fclose(file); return 0; } n += delta; add_seq_n(seq,n); n_count++; } else switch (sscanf(line, "ABCD %" SCNu64 "*%" SCNu32 "^$a%" SCNd64 " [%" SCNu32 "] // Sieved to %" SCNu64, &k, &b, &c, &n, &p_start)) { case 5: set_p_min(p_start,file_name); /* fall through */ case 4: check_and_set_base(b,file_name); seq = get_seq(k,c); s_count++; add_seq_n(seq,n); n_count++; break; default: if (s_count == 0) { fclose(file); return 0; } else line_error("Malformed line","ABCD",file_name); } } if (ferror(file)) line_error("Read error","ABCD",file_name); fclose(file); report_read(n_count,s_count,"ABCD",file_name); return 1; }
void FoldingEngine<SEQ>:: centroid_fold(const std::string& name, const SEQ& seq, const std::vector<float>& gamma, std::ostream& out, uint num_ea_samples) { #ifdef HAVE_LIBRNA Vienna::eos_debug = -1; #endif calculate_posterior(seq); std::vector<Result> res; std::vector<float>::const_iterator g; for (g=gamma.begin(); g!=gamma.end(); ++g) { std::string paren; float p = decode_structure(*g, paren); double sen = 0.0, ppv = 0.0, mcc = 0.0; if (num_ea_samples>0) compute_expected_accuracy_sampling(paren, seq, num_ea_samples, sen, ppv, mcc); else compute_expected_accuracy(paren, sen, ppv, mcc); float e=0; #ifdef HAVE_LIBRNA e = calc_energy(seq, paren.c_str()); #endif res.push_back(Result(*g, sen, ppv, mcc, p, e, paren)); } std::sort(res.begin(), res.end(), cmp_by_mcc()); std::string prev_paren; out << ">" << name << std::endl << get_seq(seq) << std::endl; std::vector<Result>::const_iterator r; for (r=res.begin(); r!=res.end(); ++r) { if (prev_paren!=r->paren) { out << r->paren; if (!mea_) { out << " (g=" << r->g << ",th=" << (1.0/(1.0+r->g)); #ifdef HAVE_LIBRNA out << ",e=" << r->e; #endif out << ")"; } else { out << " (g=" << r->g << ",EA=" << r->ea; #ifdef HAVE_LIBRNA out << ",e=" << r->e; #endif out << ")"; } if (num_ea_samples>=0) { out << " [" << "SEN=" << r->sen << ",PPV=" << r->ppv << ",MCC=" << r->mcc << "]"; } out << std::endl; prev_paren = r->paren; } } }
void create_ack_frame(uint8_t seq, frame* frame) { frame->type = 2; frame->window = MAX_WINDOW_SIZE - 1; frame->seq = get_seq(seq); frame->length = 0; init_payload(frame->payload); frame->crc = compute_crc(*frame); }
void c_scene_sp::addeffect(c_meta *chr, int32_t idx, float x, float y, int8_t dir, int8_t order) { gfx_seq *sq = get_seq(idx); if (sq) { c_scene_fx *ff = new c_scene_fx(idx, sq, chr, x,y,dir, order); fx.push_back(ff); } }
void FoldingEngine<SEQ>:: svg_plot(const std::string& name, const SEQ& seq, float g) const { std::string paren; decode_structure(g, paren); Vienna::svg_rna_plot(const_cast<char*>(get_seq(seq).c_str()), const_cast<char*>(paren.c_str()), const_cast<char*>(name.c_str())); }
void assimilate_text(string txt, Store &s, int order){ string chars; queue<string> seq; vector<string> tab = split(txt); for (int i = 0; i < tab.size(); i++){ seq = get_seq(tab, i, order); s.add_hits(seq, 1); } cerr << "ok" << endl; }
static int read_pfgw_file(const char *file_name) { FILE *file; const char *line; uint64_t p, k; int64_t c; uint32_t b, n_count, n, old_count; char c1, c2, c3; /* ABC $a*<base>^$b$c (or ABC $a*<base>^$b+$c) k n c k n c */ file = xfopen(file_name, "r", error); line = read_line(file); /* The "%*[+$]" allows the "+" to be ignored if present, for compatibility with versions prior to 0.6.13. */ switch (sscanf(line,"ABC $%c*%"SCNu32"^$%c%*[+$]%c // Sieved to %"SCNu64, &c1,&b,&c2,&c3,&p)) { case 5: set_p_min(p,file_name); /* fall through */ case 4: if (c1 != 'a' || c2 != 'b' || c3 != 'c') line_error("Unrecognised header","abc",file_name); check_and_set_base(b,file_name); break; default: fclose(file); return 0; } old_count = seq_count; n_count = 0; while ((line = read_line(file)) != NULL) { if (sscanf(line, "%"SCNu64" %"SCNu32" %"SCNd64, &k, &n, &c) != 3) line_error("Malformed line","abc",file_name); add_seq_n(get_seq(k,c), n); n_count++; } if (ferror(file)) line_error("Read error","abc",file_name); fclose(file); report_read(n_count,seq_count-old_count,"abc",file_name); return 1; }
double openmp_performance(const int n) { double measures[64]; cpx *in = get_seq(n, 1); for (int i = 0; i < number_of_tests; ++i) { start_timer(); openmp_const_geom(FFT_FORWARD, &in, &in, n); measures[i] = stop_timer(); } free(in); return average_best(measures, number_of_tests); }
void create_data_frame(uint8_t seq, char* data, uint16_t len, frame* frame) { frame->type = 1; frame->window = 0; frame->seq = get_seq(seq); frame->length = len; init_payload(frame->payload); memcpy(frame->payload, data, frame->length + 1); frame->crc = compute_crc(*frame); }
/* * Wrapper around find_oligos() to look for all oligos listed in a FASTA file. */ int find_oligo_file(GapIO *io, int num_contigs, contig_list_t *contig_array, float mis_match, char *file, int consensus_only, int in_cutoff) { char **ids; int nids; int i; int r = 0; /* ret. code */ /* Use seq_utils to parse the input file */ if (0 != get_identifiers(file, &ids, &nids)) return -1; for (i = 0; i < nids; i++) { char *seq; int seq_len; seq = NULL; seq_len = 0; if (0 != get_seq(&seq, maxseq, &seq_len, file, ids[i])) continue; if (seq_len == 0 || !seq || *seq == 0) { if (seq) xfree(seq); continue; } vmessage("Sequence search for ID '%s'\n", ids[i]); r |= find_oligos(io, num_contigs, contig_array, mis_match, seq, consensus_only, in_cutoff); vmessage("\n"); if (seq) xfree(seq); } /* Tidy up memory */ for (i = 0; i < nids; i++) { xfree(ids[i]); } xfree(ids); return r; }
uint32_t parse_seq_str(const char *str, const char *file_name) { uint64_t k; int64_t c; uint32_t b; if (scan_seq(str,&k,&b,&c)) { check_and_set_base(b,file_name); return get_seq(k,c); } return UINT32_MAX; }
static void test_mode3(GapIO *io, int cnum, int xpos) { rangec_t *r; contig_iterator *ci; ci = contig_iter_new(io, cnum, 0, CITER_FIRST, CITER_CSTART, CITER_CEND); while (r = contig_iter_next(io, ci)) { seq_t *s = get_seq(io, r->rec); char name[256]; sprintf(name, "%.*s", s->name_len, s->name); printf("%c%-22s\t%8d..%-8d\t%.*s\n", "+-"[s->len<0], name, r->start, r->end, ABS(s->len), s->seq); } contig_iter_del(ci); exit(0); }
/* open the connection */ static const response* sq_sender(str* sender, str* params) { if(!opendb()) return &resp_internal; const response *r; if(sqlseq) { /* dump the previous one */ dosqlog(); sqlseq = 0; session_delnum("sqlseq"); } r = get_seq(); if(r) return r; /* seq error */ str_copy(&qsender, sender); str_init(&qrecips); return 0; (void)params; }
void proc_id_connector(struct task_struct *task, int which_id) { struct cn_msg *msg; struct proc_event *ev; __u8 buffer[CN_PROC_MSG_SIZE] __aligned(8); struct timespec ts; const struct cred *cred; if (atomic_read(&proc_event_num_listeners) < 1) return; msg = buffer_to_cn_msg(buffer); ev = (struct proc_event *)msg->data; memset(&ev->event_data, 0, sizeof(ev->event_data)); ev->what = which_id; ev->event_data.id.process_pid = task->pid; ev->event_data.id.process_tgid = task->tgid; rcu_read_lock(); cred = __task_cred(task); if (which_id == PROC_EVENT_UID) { ev->event_data.id.r.ruid = from_kuid_munged(&init_user_ns, cred->uid); ev->event_data.id.e.euid = from_kuid_munged(&init_user_ns, cred->euid); } else if (which_id == PROC_EVENT_GID) { ev->event_data.id.r.rgid = from_kgid_munged(&init_user_ns, cred->gid); ev->event_data.id.e.egid = from_kgid_munged(&init_user_ns, cred->egid); } else { rcu_read_unlock(); return; } rcu_read_unlock(); get_seq(&msg->seq, &ev->cpu); ktime_get_ts(&ts); /* get high res monotonic timestamp */ ev->timestamp_ns = timespec_to_ns(&ts); memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); msg->ack = 0; /* not used */ msg->len = sizeof(*ev); msg->flags = 0; /* not used */ cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); }
//纯文本协议,以特殊字符作为结束符 int ISGWIntf::handle_input(ACE_HANDLE /*fd = ACE_INVALID_HANDLE*/) { lastrtime_ = ISGWAck::instance()->get_time(); //接收消息 int ret = this->peer().recv((char*)recv_buf_ + recv_len_, MAX_RECV_BUF_LEN - recv_len_); //, &timeout switch(ret) { case -1: { ACE_DEBUG((LM_ERROR, "[%D] ISGWIntf recv failed" ",ret=%d" ",errno=%d" ",errmsg=%s" ",ip=%s" "\n" , ret , errno , strerror(errno) , remote_addr_.get_host_addr() )); if (errno == EWOULDBLOCK || errno == EAGAIN || errno == EINPROGRESS) { return 0; } return -1; } break; case 0: { ACE_DEBUG((LM_NOTICE, "[%D] ISGWIntf recv succ" ",connection closed by foreign host" ",ret=%d,ip=%s\n" , ret, remote_addr_.get_host_addr() )); return -1; } break; default: //接收成功 recv_len_ += ret; ACE_DEBUG((LM_TRACE, "[%D] ISGWIntf recv succ,recv_len=%d,ret=%d,recv_buf=%s\n" , recv_len_, ret, recv_buf_)); //粗略判断消息是否结束(即是否已经有一个完整的消息包) //因为此处判断可能包括了垃圾数据里面的结束符 if ( strstr(recv_buf_, MSG_SEPARATOR) == NULL) //未结束,继续接收 { if ( recv_len_ < MAX_RECV_BUF_LEN ) { ACE_DEBUG((LM_WARNING, "[%D] ISGWIntf recv succ,no end" ",recv_len=%d,recv_buf=%s\n" , recv_len_, recv_buf_)); return 0; } else { ACE_DEBUG((LM_ERROR, "[%D] ISGWIntf recv failed,illegal msg" ",reach max buff len and have no msg end,discard it,ip=%s\n" , remote_addr_.get_host_addr() )); return -1; //消息非法 } } } //已经获得完整的消息 //判断消息是否非法 if (is_legal(recv_buf_) != 0) { ACE_DEBUG((LM_ERROR, "[%D] ISGWIntf recv failed,illegal msg,discard it" ",ip=%s\n", remote_addr_.get_host_addr() )); recv_len_ = 0; // reset the recv pos indicator //memset(recv_buf_, 0x0, sizeof(recv_buf_)); return 0; } char *msg_start = recv_buf_; char *msg_end = NULL; int proced_len = 0; //已经处理的长度 int pend_len = recv_len_; //pend_len 未处理的消息长度 //proced_len 必须小于recv_len_ 避免处理到了buf后面的垃圾数据 while ((msg_end = strstr(msg_start, MSG_SEPARATOR)) != NULL && proced_len < recv_len_) { msg_len_ = msg_end + strlen(MSG_SEPARATOR)-msg_start; // 看看是否会处理到后面的垃圾数据(不完整的消息) if((proced_len+msg_len_) > recv_len_) { ACE_DEBUG((LM_WARNING, "[%D] ISGWIntf proc no end msg" ",proced_len=%d,msg_len_=%d,recv_len_=%d\n" , proced_len, msg_len_, recv_len_ )); break; } if (msg_len_ > strlen(MSG_SEPARATOR) && process(msg_start, get_handle(), get_seq(), msg_len_) != 0) { //如果解析或者处理出错(后端无处理能力),整个消息一起丢弃,并导致断开连接 return -1; } proced_len += msg_len_; pend_len -= msg_len_; msg_start = msg_end + strlen(MSG_SEPARATOR); ACE_DEBUG((LM_TRACE, "[%D] ISGWIntf proc msg succ,msg_len=%d,proced_len=%d,pend_len=%d\n" , msg_len_, proced_len, pend_len)); } //移动剩下的数据 if (msg_start!=recv_buf_) { memmove(recv_buf_, msg_start, pend_len); ACE_DEBUG((LM_TRACE, "[%D] ISGWIntf proc msg move,start=%d,pend_len=%d\n" , (msg_start-recv_buf_), pend_len)); } //memset(recv_buf_+pend_len, 0x0, sizeof(recv_buf_)-pend_len); recv_len_ = pend_len; // reset the recv pos indicator return 0; }
// 消息头指定长度的消息 int ISGWIntf::handle_input(ACE_HANDLE /*fd = ACE_INVALID_HANDLE*/) { lastrtime_ = ISGWAck::instance()->get_time(); // 文本协议,长度字段在消息中额外占MSG_LEN_SIZE字节 unsigned int len_field_extra_size = MSG_LEN_SIZE; #ifdef BINARY_PROTOCOL // 二进制协议,长度字段本身包含在消息中 len_field_extra_size = 0; #endif //接收消息 int ret = this->peer().recv((char*)recv_buf_ + recv_len_, MAX_RECV_BUF_LEN - recv_len_); //, &timeout switch(ret) { case -1: { ACE_DEBUG((LM_ERROR, "[%D] ISGWIntf recv failed" ",ret=%d" ",errno=%d" ",errmsg=%s" ",ip=%s" "\n" , ret , errno , strerror(errno) , remote_addr_.get_host_addr() )); if (errno == EWOULDBLOCK || errno == EAGAIN || errno == EINPROGRESS) { return 0; } return -1; } break; case 0: { ACE_DEBUG((LM_TRACE, "[%D] ISGWIntf recv failed" ",connection closed by foreign host" ",ret=%d,ip=%s\n" , ret, remote_addr_.get_host_addr())); return -1; } break; default: //接收成功 recv_len_ += ret; ACE_DEBUG((LM_TRACE, "[%D] ISGWIntf recv succ,ret=%d" ",recv_buf_=%s\n" , ret, recv_buf_ )); //判断消息是否结束 if (msg_len_ == 0) //没获取到消息包长度的情况 { if (recv_len_ >= MSG_LEN_SIZE) { memcpy(&msg_len_, recv_buf_, MSG_LEN_SIZE); if(MSG_LEN_SIZE == 2) { msg_len_ = ntohs(msg_len_); } else { msg_len_ = ntohl(msg_len_); } if (msg_len_ > MAX_RECV_BUF_LEN || msg_len_ <= MSG_LEN_SIZE) { ACE_DEBUG((LM_ERROR, "[%D] ISGWIntf recv failed,illegal msg" ",msg_len_=%d,ip=%s\n" , msg_len_, remote_addr_.get_host_addr() )); return -1; } } else { // not complete ACE_DEBUG((LM_TRACE, "[%D] ISGWIntf recv succ but uncompleted msg 1\n")); return 0; } } if (recv_len_ < (len_field_extra_size + msg_len_ )) { // not complete ACE_DEBUG((LM_TRACE, "[%D] ISGWIntf recv succ but uncompleted msg 2" ",recv_len_=%d,msg_len_=%d\n" , recv_len_, msg_len_ )); return 0; } } //注释掉,同一个网络包有多个消息的情况下有可能会覆盖后面的消息头 //recv_buf_[recv_len_] = '\0'; //最后一位置空表示字符串结束 //已经获得完整的消息 unsigned int msg_len = msg_len_; unsigned int pend_len = recv_len_;//待处理的长度 unsigned int proced_len = 0; //已经处理的长度 char* msg_buf = NULL; //作为recv_buf_ 的游标指针 int i = 0; //只是标记第几次循环 ? //循环处理每一个完整的消息,不完整的需要等再接收完再处理 while( pend_len >= (len_field_extra_size + msg_len) ) { ACE_DEBUG((LM_TRACE, "[%D] ISGWIntf in while,i=%d,pend_len=%d" ",proced_len=%d,msg_len=%d\n" , i, pend_len, proced_len, msg_len)); //消息指针下移 msg_buf = &recv_buf_[proced_len + len_field_extra_size]; //解析当前消息长度指定的消息块,并进行处理 if (process(msg_buf, get_handle(), get_seq(), msg_len) != 0) { //如果解析或者处理出错(后端无处理能力),整个消息一起丢弃,并导致断开连接 return -1; } //已经处理的长度 增加 proced_len += len_field_extra_size + msg_len; //待处理的长度减少 pend_len -= len_field_extra_size + msg_len; //取下一个完整消息的长度 //从proced_len 位置取出 msg_len = 0; if (pend_len < MSG_LEN_SIZE) { //如果剩余的长度不够四个字节直接跳出循环,继续接收消息才能处理 break; } memcpy(&msg_len , &recv_buf_[proced_len], MSG_LEN_SIZE); if(MSG_LEN_SIZE == 2) { msg_len = ntohs(msg_len); } else { msg_len = ntohl(msg_len); } ACE_DEBUG((LM_TRACE, "[%D] ISGWIntf end while,i=%d,MSG_LEN_SIZE=%d" ",pend_len=%d,proced_len=%d,msg_len=%d\n" , i, MSG_LEN_SIZE, pend_len, proced_len, msg_len )); // 如果msg_len 异常 则断开 if (msg_len > MAX_RECV_BUF_LEN || msg_len <= MSG_LEN_SIZE) { ACE_DEBUG((LM_ERROR, "[%D] ISGWIntf recv failed,illegal msg" ",msg_len=%d,ip=%s\n" , msg_len, remote_addr_.get_host_addr() )); return -1; } i++; } ACE_DEBUG((LM_DEBUG, "[%D] ISGWIntf out while,pend_len=%d,proced_len=%d,msg_len=%d\n" , pend_len, proced_len, msg_len )); if ( pend_len == 0 ) { //正好处理完的情况 recv_len_ = 0; // reset the recv pos indicator msg_len_ = 0; } else { //剩余的部分直接移动 ACE_DEBUG((LM_TRACE, "[%D] ISGWIntf memmove,proced_len=%d,pend_len=%d" , proced_len, pend_len)); memmove(recv_buf_, &recv_buf_[proced_len], pend_len); recv_len_ = pend_len;//接收到的消息长度赋值为待处理的长度 msg_len_ = msg_len;//下一个完整的消息长度等于while中最后一次取出的数据 } return 0; }
void c_scene_fx::func10() { switch(get_seq()) { case 1: if ( get_elaps_frames() == 0 ) { angZ = scene_rand_rng(360); for (int8_t i = 0; i < 4; i++) scene_add_effect(parent, 101, x,y,dir,1); } if (process()) active = false; break; case 2: if ( get_elaps_frames() == 0 ) { angZ = scene_rand_rng(360); for (int8_t i = 0; i < 6; i++) scene_add_effect(parent, 101, x,y,dir,1); for (int8_t i = 0; i < 3; i++) { scene_add_effect(parent, 102, x,y,dir,1); scene_add_effect(parent, 103, x,y,dir,1); } } if (process()) active = false; break; case 3: if ( get_elaps_frames() == 0 ) { angZ = scene_rand_rng(360); scene_add_effect(parent, 100, x,y,dir,1); for (int8_t i = 0; i < 8; i++) scene_add_effect(parent, 101, x,y,dir,1); for (int8_t i = 0; i < 6; i++) { scene_add_effect(parent, 102, x,y,dir,1); scene_add_effect(parent, 103, x,y,dir,1); } } if (process()) active = false; break; case 4: if ( get_elaps_frames() == 0) { angZ = scene_rand_rng(360); scene_add_effect(parent, 104, x,y,dir,1); for (int8_t i = 0; i < 10; i++) scene_add_effect(parent, 101, x,y,dir,1); for (int8_t i = 0; i < 6; i++) { scene_add_effect(parent, 102, x,y,dir,1); scene_add_effect(parent, 103, x,y,dir,1); } } if (process()) active = false; break; case 5: if ( get_elaps_frames() == 0 ) { angZ = scene_rand_rng(360); for (int8_t i = 0; i < 4; i++) scene_add_effect(parent, 101, x,y,dir,1); } if (process()) active = false; break; case 6: if ( get_elaps_frames() == 0 ) { angZ = scene_rand_rng(360); for (int8_t i = 0; i < 6; i++) scene_add_effect(parent, 101, x,y,dir,1); for (int8_t i = 0; i < 3; i++) { scene_add_effect(parent, 102, x,y,dir,1); scene_add_effect(parent, 103, x,y,dir,1); } } if (process()) active = false; break; case 7: if ( get_elaps_frames() == 0 ) { angZ = scene_rand_rng(360); scene_add_effect(parent, 100, x,y,dir,1); for (int8_t i = 0; i < 8; i++) scene_add_effect(parent, 101, x,y,dir,1); for (int8_t i = 0; i < 3; i++) { scene_add_effect(parent, 102, x,y,dir,1); scene_add_effect(parent, 103, x,y,dir,1); } } scaleY = scaleX += 0.1; if (process()) active = false; break; case 8: if ( get_elaps_frames() == 0 ) { angZ = scene_rand_rng(360); scene_add_effect(parent, 100, x,y,dir,1); for (int8_t i = 0; i < 10; i++) scene_add_effect(parent, 101, x,y,dir,1); for (int8_t i = 0; i < 5; i++) { scene_add_effect(parent, 102, x,y,dir,1); scene_add_effect(parent, 103, x,y,dir,1); } } scaleY = scaleX += 0.1; if (process()) active = false; break; case 9: case 10: case 11: case 12: if ( get_elaps_frames() == 0 ) angZ = scene_rand_rng(40) - 20; if (process()) active = false; break; case 13: if ( get_elaps_frames() == 0 ) { angZ = scene_rand_rng(360); scene_add_effect(parent, 105, x,y,dir,1); for (int8_t i = 0; i < 4; i++) scene_add_effect(parent, 102, x,y,dir,1); } if (process()) active = false; break; case 14: if ( get_elaps_frames() == 0 ) { angZ = scene_rand_rng(360); scene_add_effect(parent, 106, x,y,dir,1); for (int8_t i = 0; i < 6; i++) scene_add_effect(parent, 102, x,y,dir,1); } if (process()) active = false; break; case 15: case 16: case 38: if ( get_elaps_frames() == 0 ) angZ = scene_rand_rng(360); if (process()) active = false; break; case 50: if ( get_elaps_frames() == 0 ) for (int8_t i = 0; i < 4; i++) scene_add_effect(parent, 101, x,y,dir,1); if (process()) active = false; break; case 51: if ( get_elaps_frames() == 0 ) for (int8_t i = 0; i < 4; i++) scene_add_effect(parent, 103, x,y,dir,1); if (process()) active = false; break; case 52: if ( get_elaps_frames() == 0 ) { scene_play_sfx(37); for (int8_t i = 0; i < 3; i++) scene_add_effect(parent, 101, x,y,dir,1); } if (process()) active = false; break; case 53: if ( get_elaps_frames() == 0 ) { scene_play_sfx(38); scene_add_effect(parent, 104, x,y,dir,1); for (int8_t i = 0; i < 16; i++) scene_add_effect(parent, 101, x,y,dir,1); for (int8_t i = 0; i < 8; i++) { scene_add_effect(parent, 102, x,y,dir,1); scene_add_effect(parent, 103, x,y,dir,1); } for (int8_t i = 0; i < 6; i++) scene_add_effect(parent, 200, x,y,dir,1); for (int8_t i = 0; i < 10; i++) scene_add_effect(parent, 201, x,y,dir,1); } angZ += 5; scaleX += 0.3; scaleY += 0.3; if (c_A >= 10) { c_A -= 10; c_R -= 10; c_G -= 10; if (process()) active = false; } else active = false; break; case 54: if ( get_elaps_frames() == 0 ) { scene_play_sfx(25); scene_add_effect(parent, 104, x,y,dir,1); for (int8_t i = 0; i < 8; i++) scene_add_effect(parent, 101, x,y,dir,1); for (int8_t i = 0; i < 4; i++) { scene_add_effect(parent, 102, x,y,dir,1); scene_add_effect(parent, 103, x,y,dir,1); } } scaleX += 0.3; scaleY += 0.3; if (c_A >= 10) { c_A -= 10; if (process()) active = false; } else active = false; break; case 58: case 59: scaleY = scaleX += 0.4; if (c_A >= 20) { c_A -= 20; if (process()) active = false; } else active = false; break; case 61: if ( get_elaps_frames() == 0 ) scene_play_sfx(43); scaleX += 0.3; scaleY += 0.3; if (c_A >= 20) { c_A -= 20; c_R -= 20; c_G -= 20; if (process()) active = false; } else active = false; break; case 62: if (get_elaps_frames() == 0) { scene_play_sfx(45); scene_add_effect(parent, 113,x,y,dir,1); } scaleX+=0.2; scaleY+=0.2; if (c_A >= 25) { c_A -= 25; c_R -= 25; c_G -= 25; if (process()) active = false; } else active = false; break; case 63: if ( get_elaps_frames() == 0 ) { scene_play_sfx(43); scene_add_effect(parent,60,x,y,dir,-1); } scaleX += 0.1; scaleY += 0.15; if (process()) active = false; break; case 64: if ( get_elaps_frames() == 0 ) { scene_play_sfx(50); scene_add_effect(parent, 104, x,y,dir,1); for (int8_t i = 0; i < 16; i++) scene_add_effect(parent, 101, x,y,dir,1); for (int8_t i = 0; i < 8; i++) { scene_add_effect(parent, 102, x,y,dir,1); scene_add_effect(parent, 103, x,y,dir,1); } } scaleX += 0.3; scaleY += 0.3; if (c_A >= 10) { c_A -= 10; if (process()) active = false; } else active = false; break; case 65: case 66: case 67: case 68: if ( get_elaps_frames() == 0 ) { scene_add_effect(parent, 104, x,y,dir,1); for (int8_t i = 0; i < 16; i++) scene_add_effect(parent, 101, x,y,dir,1); for (int8_t i = 0; i < 8; i++) { scene_add_effect(parent, 102, x,y,dir,1); scene_add_effect(parent, 103, x,y,dir,1); } } scaleX += 0.3; scaleY += 0.3; if (c_A >= 10) { c_A -= 10; if (process()) active = false; } else active = false; break; case 69: if ( get_elaps_frames() == 0 ) scene_play_sfx(35); scaleX += 0.3; scaleY += 0.3; angZ -= 25; if (c_A >= 15) { c_A -= 15; c_R -= 15; c_G -= 15; if (process()) active = false; } else active = false; break; case 70: if ( get_elaps_frames() == 0 ) scene_play_sfx(53); scaleX += 0.3; scaleY += 0.3; angZ -= 25; if (c_A >= 15) { c_A -= 15; c_R -= 15; c_G -= 15; if (process()) active = false; } else active = false; break; case 71: if ( get_elaps_frames() == 0 ) scene_play_sfx(54); if ( get_frame() == 0 ) scaleY = scaleX *= 0.8; else if (get_frame() == 1) { scaleY = scaleX += 0.3; angZ -= 25; if (c_A >= 15) { c_A -= 15; c_B -= 15; } else { active = false; } } if (active && process()) active = false; break; case 100: scaleX += 0.5; scaleY += 0.5; if (c_A >= 20) { c_A -= 20; c_R -= 20; c_G -= 20; if (process()) active = false; } else active = false; break; case 101: v_inerc--; y += v_inerc; x += h_inerc; if ( v_inerc < 0.0 && y < 0.0 ) if ( scene_rand_rng(100) < 15 ) v_inerc = (-v_inerc) * 0.5; if (c_A > 20) { scaleX *= 0.8; scaleY *= 0.8; c_A -= 20; c_R -= 20; c_G -= 20; if (scaleX <= 0 || process()) active=false; } else active = false; break; case 102: case 103: x += h_inerc*dir; y += v_inerc; if (c_A > 10) { scaleY *= 0.98; scaleX += 0.05; c_A -= 10; if (process()) active = false; } else active = false; break; case 104: scaleX += 1.25; scaleY += 1.25; if (c_A >= 20) { c_A -= 20; c_R -= 20; c_G -= 20; if (process()) active = false; } else active = false; break; case 105: scaleY = scaleX += 0.15; if (c_A > 15) { c_A -= 15; c_R -= 15; c_G -= 15; if (process()) active = false; } else active = false; break; case 60: case 106: scaleX += 0.4; scaleY += 0.4; if (c_A >= 20) { c_A -= 20; c_R -= 20; c_G -= 20; if (process()) active = false; } else active = false; break; case 112: case 137: { c_meta *chr = parent; if ( chr ) { x = chr->getX(); y = chr->getY()+100; par1 -= 0.3; if (par1 < 1.0) par1 = 1.0; par2 += 3.0; if (get_seq() == 137) { angZ ++; scaleY = scaleX = (sin_deg(par2) * 0.1 + 1.1) * par1; } else { angZ --; scaleY = scaleX = (sin_deg(par2) * 0.1 + 1.0) * par1; } if (get_frame() == 0) { if (chr->chrt->damage_limit < 100 || chr->chrt->get_seq() == 99) if ( chr->chrt->field_4C2 <= 0) { set_frame(1); break; } } if (get_frame() == 1) { if (c_A > 20) { c_A -= 20; c_R -= 20; c_G -= 20; } else active = false; } if (active && process() ) active = false; } else active = false; } break; case 113: scaleX+=0.4; scaleY+=0.4; if (c_A >= 15) { c_A -= 15; c_R -= 15; c_G -= 15; if (process()) active = false; } else active = false; break; case 115: if ( get_elaps_frames() == 0 ) { angZ = scene_rand_rng(360); scaleX = 2.0; scaleY = 2.0; } angZ += 2; if (get_frame() == 41) { if (c_A >= 5) c_A -= 5; else active = false; } if (active && process()) active = false; break; case 123: if ( get_elaps_frames() == 0 ) v_inerc = -10; if (c_A >= 15) { y += v_inerc; c_A -= 15; c_R -= 15; c_G -= 15; if (process()) active = false; } else active = false; break; case 124: if ( get_elaps_frames() == 0 ) h_inerc = -10.0; if ( c_A >= 15 ) { x += dir * h_inerc; c_A -= 15; c_R -= 15; c_G -= 15; if (process()) active = false; } else active = false; break; case 125: scaleX += 0.2; scaleY += 0.2; if (c_A >= 25) { c_A -= 25; c_R -= 25; c_G -= 25; if (process()) active = false; } else active = false; break; case 136: scaleX -= 0.005; scaleY += 0.02; y += 15; c_A = sin_deg(get_elaps_frames() * 6) * 255.0; if (get_elaps_frames() * 6 >= 180) active = false; if (active && process()) active = false; break; case 131: case 132: case 133: case 134: case 139: if (get_elaps_frames() == 0) v_inerc = 20; v_inerc--; if (v_inerc < 1) v_inerc = 1; scaleX += 0.1; if (scaleX > 1) scaleX = 1; scaleY = scaleX; if (get_elaps_frames() >= 60) { if (c_A > 15) c_A -= 15; else active = false; } y += v_inerc; if (active && process()) active = false; break; case 140: scaleX += par1 * 0.5; par1 *= 0.94; if (c_A >= 5) { c_A -= 5; c_R -= 5; c_G -= 5; if (process()) active = false; } else active = false; break; case 141: scaleY = scaleX *= 0.85; if (c_A >= 15) { c_A -= 15; c_R -= 15; c_G -= 15; if (process()) active = false; } else active = false; break; case 135: case 142: scaleY = scaleX += 0.3; if (c_A >= 15) { c_A -= 15; if (process()) active = false; } else active = false; break; case 150: case 152: case 154: scaleY = scaleX += 0.15; if (c_A >= 15) { c_A -= 15; if (process()) active = false; } else active = false; break; case 151: case 153: case 155: if (par1 == 0) { if (c_A >= 240) { c_A = 255; par1 = 1.0; y += 10; if (process()) active = false; break; } c_A += 15; } else { if (c_A < 15) { active = false; break; } c_A -= 15; } y += 10; if (active && process()) active = false; break; case 160: if ( get_elaps_frames() >= 25 ) { if (c_A >= 15 ) c_A -= 15; else { active = false; break; } } if (get_elaps_frames() % 6 == 0) scene_add_effect(parent,161,x,y,dir,-1); angZ += 6; v_inerc -= 0.3; h_inerc *= 0.96; if ( v_inerc + y <= 0 && v_inerc < 0 ) v_inerc = -v_inerc; x += h_inerc * dir; y += v_inerc; if ( process() ) active = false; break; case 161: if ( c_A >= 15 ) { c_A -= 15; v_inerc -= 0.005; y += v_inerc; if (process()) active = false; } else active = false; break; case 162: case 163: case 164: if (c_A >= par1) { angZ += par2; c_A -= par1; v_inerc -= 0.3; h_inerc *= 0.92; if (y + v_inerc <= 0 && v_inerc < 0) v_inerc = -v_inerc; x += h_inerc * dir; y += v_inerc; if (process()) active = false; } else active = false; break; case 165: if (c_A >= 15) { c_A -= 15; angZ -= 15; scaleY = scaleX += 0.3; if (process()) active = false; } else active = false; break; case 200: if ( get_elaps_frames() == 0 ) set_vec_speed(scene_rand_rng(180),scene_rand_rng(10) + 5); angZ += 6; v_inerc -= 0.5; if (scene_rand_rng(100) < 20) scene_add_effect(parent,202,x,y,dir,1); if (v_inerc < 0 && y < 0) { if (scene_rand_rng(100) < 20) v_inerc = (-v_inerc) * 0.5; set_elaps_frames(60); } if ( get_elaps_frames() <= 60 || c_A >= 15 ) { if( get_elaps_frames() > 60 ) c_A -= 15; x += h_inerc * dir; y += v_inerc; if ( process() ) active = false; } else { //HACK /*if ( weather == 21 ) { weather_time += 40; if ( weather_time > 999 ) weather_time = 999; } else if ( weather_time >= 41 ) { weather_time -= 40; } else { weather_time = 1; }*/ scene_play_sfx(26); active = false; } break; case 201: if ( get_elaps_frames() == 0 ) set_vec_speed(scene_rand_rng(180),scene_rand_rng(8)+4); angZ -= 12; v_inerc -= 0.25; if (scene_rand_rng(100) < 10) scene_add_effect(parent, 202, x,y,dir,1); if ( v_inerc < 0.0 && y < 0.0 ) { if ( scene_rand_rng(100) < 20 ) v_inerc = (-v_inerc) * 0.5; set_elaps_frames(60); } if ( get_elaps_frames() <= 60 || c_A >= 15 ) { if( get_elaps_frames() > 60 ) c_A -= 15; x += h_inerc * dir; y += v_inerc; if ( process() ) active = false; } else { //HACK /*if ( weather == 21 ) { weather_time += 5; if ( weather_time > 999 ) weather_time = 999; } else if ( weather_time >= 6 ) { weather_time -= 5; } else { weather_time = 1; }*/ scene_play_sfx(26); active = false; } break; case 202: if ( get_elaps_frames() == 0 ) set_vec_speed(scene_rand_rng(180),1.0); v_inerc -= 0.05; if ( scaleX > 0.0 ) { scaleX -= 0.01; scaleY -= 0.01; } if ( c_A >= 15 ) { c_A -= 15; c_B -= 10; c_G -= 10; y += v_inerc; x += h_inerc * dir; if ( process() ) active = false; } else active = false; break; case 126: case 127: case 128: case 129: case 138: if (process()) active = false; break; default: active = false; } }
void c_scene_fx::set_seq_params() { switch(get_seq()) { case 51: scaleY = scaleX = 2.0; break; case 53: case 54: case 64: case 65: case 66: case 67: case 68: case 69: case 165: case 200: case 201: angZ = scene_rand_rng(360); break; case 59: angZ = 90; break; case 62: scaleX = scaleY =0.1; break; case 101: scaleY = scaleX = scene_rand_rng(200) * 0.01 + 0.1; h_inerc = scene_rand_rng(60) - 30; v_inerc = scene_rand_rng(60) - 30; break; case 102: case 103: scaleX = scene_rand_rng(1400) * 0.01 + 2.0; scaleY = scene_rand_rng(300) * 0.01 + 1.0; angZ = scene_rand_rng(360); set_vec_speed_2(-angZ, scene_rand_rng(20) + 5); break; case 112: scaleY = scaleX = 3.0; par1 = 3.0; par2 = 0.0; angZ = scene_rand_rng(360); break; case 125: if ( parent->get_seq() == 214 ) { if ( parent->get_subseq() == 1 || parent->get_subseq() == 2 ) angZ = parent->angZ; else if ( parent->get_subseq() == 3 || parent->get_subseq() == 4 ) angZ = parent->angZ + 180.0; } break; case 135: angX = 80; break; case 136: scaleX = scene_rand_rng(15) * 0.1 + 0.5; scaleY = scene_rand_rng(10) * 0.1 + 1.0; c_A = 0; break; case 137: scaleY = scaleX = 1.0; par1 = 1.0; par2 = 0; angZ = scene_rand_rng(360); break; case 138: scaleY = scaleX = 2.0; angZ = scene_rand_rng(360); break; case 140: par1 = 1.0; angZ = scene_rand_rng(360); angX = scene_rand_rng(140) - 70; angY = scene_rand_rng(140) - 70; break; case 142: par1 = 1.0; break; case 150: case 152: case 154: par1 = 0.0; break; case 151: case 153: case 155: c_A = 0; par1 = 0.0; break; case 160: angZ = scene_rand_rng(360); v_inerc = scene_rand_rng(30) * 0.1 + 6.0; h_inerc = scene_rand_rng(50) * 0.1 + 10.0; scene_add_effect(parent, 162, x,y,dir, 1); scene_add_effect(parent, 162, x,y,dir, 1); scene_add_effect(parent, 163, x,y,dir, 1); scene_add_effect(parent, 163, x,y,dir, 1); scene_add_effect(parent, 164, x,y,dir, 1); scene_add_effect(parent, 164, x,y,dir, 1); scene_add_effect(parent, 165, x,y,dir, 1); scene_play_sfx(58); break; case 161: angZ = scene_rand_rng(360); v_inerc = 0.0; break; case 162: case 163: case 164: angZ = scene_rand_rng(360); scaleY = scaleX = scene_rand_rng(60) * 0.01 + 0.7; par1 = scene_rand_rng(6) + 4.0; par2 = 7.0 - scene_rand_rng(14); v_inerc = scene_rand_rng(120) * 0.1 + 2.0; h_inerc = scene_rand_rng(300) * 0.1 + 20.0; break; case 202: scaleY = scaleX = scene_rand_rng(100) * 0.01 + 0.5; angZ = scene_rand_rng(360); break; case 300: case 301: case 306: case 307: case 308: case 309: c_A = 0; angZ = 10; break; case 302: angZ = 80 - scene_rand_rng(25); set_vec_speed(angZ,60); break; case 303: angZ = 80 - scene_rand_rng(25); set_vec_speed(angZ,50); break; case 304: c_A = 0; angZ = scene_rand_rng(15); break; } }
void c_meta::scn_char_ss2() { field_1B4 = health; field_1B8 = field_190; field_1BC = field_194; field_1C8 = get_seq(); field_1CA = dir; char_frame *frm = get_pframe(); atk_box_cnt = frm->box_atk.size(); hit_box_cnt = frm->box_hit.size(); for(int32_t i=0; i<atk_box_cnt; i++) { if (frm->box_unk_atk[i] != NULL || frm->fflags & FF_UNK400000) atk_area_of[i] = &atk_area_2o[5 + i]; else atk_area_of[i] = NULL; } for(int32_t i=0; i<hit_box_cnt; i++) { if (frm->fflags & FF_UNK800000) hit_area_flags[i] = &atk_area_2o[10 + i]; else hit_area_flags[i] = NULL; } for(int32_t i=0; i<atk_box_cnt; i++) { if (frm->box_unk_atk[i] != NULL) { frame_box_fullflip(&frm->box_atk[i],&atk_area_2o[i]); frame_box *bx = atk_area_of[i]; if (dir < 0) { bx->x1 = frm->box_unk_atk[i]->x2; bx->y1 = -frm->box_unk_atk[i]->y2; bx->x2 = frm->box_unk_atk[i]->x1; bx->y2 = -frm->box_unk_atk[i]->y1; } else { bx->x1 = frm->box_unk_atk[i]->x1; bx->y1 = frm->box_unk_atk[i]->y1; bx->x2 = frm->box_unk_atk[i]->x2; bx->y2 = frm->box_unk_atk[i]->y2; } } else if (frm->fflags & FF_UNK400000) { frame_box tmp,tmp2; frame_box_move_rotate(&frm->box_atk[i],angZ,x_off,-y_off,&tmp,&tmp2); frame_box_fullflip(&tmp,&atk_area_2o[i]); frame_box *bx = atk_area_of[i]; if ( dir < 0 ) { bx->x1 = tmp2.x2; bx->y1 = -tmp2.y2; bx->x2 = tmp2.x1; bx->y2 = -tmp2.y1; } else { bx->x1 = tmp2.x1; bx->y1 = tmp2.y1; bx->x2 = tmp2.x2; bx->y2 = tmp2.y2; } } else { frame_box_flip(&frm->box_atk[i],&atk_area_2o[i]); } } if ( frm->fflags & FF_UNK800000 ) { for(int32_t i=0; i<hit_box_cnt; i++) { frame_box tmp,tmp2; frame_box_move_rotate(&frm->box_hit[i],angZ,x_off,-y_off,&tmp,&tmp2); frame_box_fullflip(&tmp,&hit_area_2o[i]); frame_box *bx = hit_area_flags[i]; if ( dir < 0 ) { bx->x1 = tmp2.x2; bx->y1 = -tmp2.y2; bx->x2 = tmp2.x1; bx->y2 = -tmp2.y1; } else { bx->x1 = tmp2.x1; bx->y1 = tmp2.y1; bx->x2 = tmp2.x2; bx->y2 = tmp2.y2; } } } else { for(int32_t i=0; i<hit_box_cnt; i++) { frame_box_flip(&frm->box_hit[i],&hit_area_2o[i]); } } if ( cust_box ) { if (cust_box->angle != 0) { frame_box tmp,tmp2; atk_area_of[atk_box_cnt] = &atk_area_2o[5 + atk_box_cnt]; frame_box_move_rotate(&cust_box->box, cust_box->angle, cust_box->c_x, cust_box->c_y, &tmp,&tmp2); frame_box_fullflip(&tmp,&atk_area_2o[atk_box_cnt]); frame_box *bx = atk_area_of[atk_box_cnt]; if ( dir < 0 ) { bx->x1 = tmp2.x2; bx->y1 = -tmp2.y2; bx->x2 = tmp2.x1; bx->y2 = -tmp2.y1; } else { bx->x1 = tmp2.x1; bx->y1 = tmp2.y1; bx->x2 = tmp2.x2; bx->y2 = tmp2.y2; } } else { atk_area_of[atk_box_cnt] = NULL; frame_box_flip(&cust_box->box ,&atk_area_2o[atk_box_cnt]); } if ( frm->fflags & FF_ATK_AS_HIT ) { hit_area_2o[hit_box_cnt] = atk_area_2o[atk_box_cnt]; hit_area_flags[hit_box_cnt] = atk_area_of[atk_box_cnt]; hit_box_cnt++; } atk_box_cnt++; } if (frm->box_coll) { pcoll_box = &atk_area_2o[15]; frame_box_flip(frm->box_coll, &atk_area_2o[15]); } else pcoll_box = NULL; }