Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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);
}
Example #4
0
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;
  }
}
Example #7
0
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);
}
Example #8
0
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;
}
Example #9
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);
}
Example #10
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;
}
Example #11
0
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++;
  }
}
Example #12
0
/* 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;
    }
  }
}
Example #14
0
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);
}
Example #15
0
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()));
}
Example #17
0
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;
}
Example #18
0
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);
}
Example #20
0
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);
}
Example #21
0
/*
 * 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;
}
Example #22
0
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;
}
Example #23
0
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;
}
Example #25
0
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);
}
Example #26
0
//纯文本协议,以特殊字符作为结束符
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;
}
Example #27
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;
}
Example #28
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;
    }
}
Example #29
0
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;
    }
}
Example #30
0
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;
}