diff state_task.cc @ 34:7aaaaf5dde40

add new task.
author koba <koba@cr.ie.u-ryukyu.ac.jp>
date Fri, 07 Jan 2011 23:19:05 +0900
parents 39e643fc4f90
children c122e3d2302e
line wrap: on
line diff
--- a/state_task.cc	Wed Jan 05 14:41:26 2011 +0900
+++ b/state_task.cc	Fri Jan 07 23:19:05 2011 +0900
@@ -79,26 +79,26 @@
     SetTaskState(STATE21, chara_state21);
     SetTaskState(STATE22, chara_state22);
     SetTaskState(STATE23, chara_state23);
-#if 0
     SetTaskState(STATE24, chara_state24);
     SetTaskState(STATE25, chara_state25);
     SetTaskState(STATE26, chara_state26);
     SetTaskState(STATE27, chara_state27);
     SetTaskState(STATE28, chara_state28);
     SetTaskState(STATE29, chara_state29);
-#endif
     SetTaskState(STATE30, chara_state30);
-#if 0
     SetTaskState(STATE31, chara_state31);
     SetTaskState(STATE32, chara_state32);
+#if 0
     SetTaskState(STATE33, chara_state33);
     SetTaskState(STATE34, chara_state34);
     SetTaskState(STATE35, chara_state35);
     SetTaskState(STATE40, chara_state40);
     SetTaskState(STATE41, chara_state41);
+#endif
     SetTaskState(STATE400, chara_state400);
     SetTaskState(STATE401, chara_state401);
     SetTaskState(STATE402, chara_state402);
+#if 0
     SetTaskState(STATE410, chara_state410);
     SetTaskState(STATE411, chara_state411);
     SetTaskState(STATE500, chara_state500);
@@ -120,6 +120,17 @@
 
 
 void
+freeObject(SchedTask *s, void *chara, void *obj)
+{
+    free(obj);
+
+    CHARACTER *p = (CHARACTER*)chara;
+    int num = GetStateNum(p->task);
+    p->state = state_list[num];
+}
+
+
+void
 checkContainer(SchedTask *s, void *chara, void *obj)
 {
     CHARACTER *p = (CHARACTER*)chara;
@@ -225,7 +236,7 @@
 
 
 CHARACTER*
-BossTask1(CHARACTER *p)
+JikiContainerTask(CHARACTER *p)
 {
     int task_num = p->task;
     int obj_size = sizeof(ObjContainer)+sizeof(ObjData)*DATA_LENGTH;
@@ -234,9 +245,65 @@
     obj->flag = false;
     obj->length = 0;
 
-    state_task->set_param(0, (memaddr)count);
+    state_task->set_inData(0, p, sizeof(CHARACTER));
+    state_task->set_inData(1, &jiki, sizeof(player));
+
+    state_task->set_outData(0, p, sizeof(CHARACTER));
+    state_task->set_outData(1, obj, 0);
+
+    state_task->set_post(checkContainer, (void*)p, (void*)obj);    
+    state_task->set_cpu(SPE_ANY);
+    state_task->spawn();
+    
+    return p;
+}
+
+
+CHARACTER*
+AsteroidTask(CHARACTER *p)
+{
+    asteroiddt[asteroidi] = p;
+
+    int task_num = ASTEROID_TASK;
+    HTaskPtr state_task = tmanager->create_task(task_num);
+    
+    state_task->set_param(0, (memaddr)asteroidi);
+    
+    state_task->set_inData(0, p, sizeof(CHARACTER));
+    
+    state_task->set_outData(0, p, sizeof(CHARACTER));
+    
+    int array_size = sizeof(CHARACTER)*asteroidi;
+    if (array_size > 0) {
+	CHARACTER *asteroid_array = (CHARACTER*)tmanager->allocate(array_size);
+	for (int i = 0; i < asteroidi; i++) {
+	    asteroid_array[i] = *asteroiddt[i];
+	}
+	state_task->set_inData(1, asteroid_array, array_size);
+	state_task->set_post(freeObject, (void*)p, (void*)asteroid_array);
+    } else {
+	state_task->set_post(updateState, (void*)p, NULL);
+    }
+    state_task->set_cpu(SPE_ANY);
+    state_task->spawn();
+
+    asteroidi++;
+    return p;
+}
+
+
+CHARACTER*
+Boss1Task1(CHARACTER *p)
+{
+    int task_num = p->task;
+    int obj_size = sizeof(ObjContainer)+sizeof(ObjData)*DATA_LENGTH;
+    HTaskPtr state_task = tmanager->create_task(task_num);
+    ObjContainerPtr obj = (ObjContainerPtr)tmanager->allocate(obj_size);
+    obj->flag = false;
+    obj->length = 0;
 
     state_task->set_inData(0, p, sizeof(CHARACTER));
+    state_task->set_inData(1, &count, sizeof(int));
 
     state_task->set_outData(0, p, sizeof(CHARACTER));
     state_task->set_outData(1, &count, sizeof(int));
@@ -251,7 +318,7 @@
 
 
 CHARACTER*
-BossTask2(CHARACTER *p)
+Boss1Task2(CHARACTER *p)
 {
     int task_num = p->task;
     int obj_size = sizeof(ObjContainer)+sizeof(ObjData)*DATA_LENGTH;
@@ -260,9 +327,8 @@
     obj->flag = false;
     obj->length = 0;
     
-    state_task->set_param(0, (memaddr)count);
-    
     state_task->set_inData(0, p, sizeof(CHARACTER));
+    state_task->set_inData(1, &count, sizeof(int));
     
     state_task->set_outData(0, p, sizeof(CHARACTER));
     state_task->set_outData(1, &count, sizeof(int));
@@ -279,7 +345,7 @@
 
 
 CHARACTER*
-BossTask3(CHARACTER *p)
+Boss1Task3(CHARACTER *p)
 {
     int task_num = p->task;
     HTaskPtr state_task = tmanager->create_task(task_num);
@@ -301,7 +367,7 @@
 
 
 CHARACTER*
-BossTask4(CHARACTER *p)
+Boss1Task4(CHARACTER *p)
 {
     int task_num = p->task;
     int obj_size = sizeof(ObjContainer)+sizeof(ObjData)*DATA_LENGTH;
@@ -328,7 +394,7 @@
 
 
 CHARACTER*
-BossTask5(CHARACTER *p)
+Boss1Task5(CHARACTER *p)
 {
     int task_num = p->task;
     int obj_size = sizeof(ObjContainer)+sizeof(ObjData)*DATA_LENGTH;
@@ -362,7 +428,7 @@
 
 
 CHARACTER*
-BossTask6(CHARACTER *p)
+Boss1Task6(CHARACTER *p)
 {
     int task_num = p->task;
     int obj_size = sizeof(ObjContainer)+sizeof(ObjData)*DATA_LENGTH;
@@ -373,19 +439,87 @@
     
     state_task->set_param(0, (memaddr)rinkx);
     state_task->set_param(1, (memaddr)rinky);
-    state_task->set_param(2, (memaddr)rinkf2);
-    state_task->set_param(3, (memaddr)count);
-    state_task->set_param(4, (memaddr)filpcount);
-    state_task->set_param(5, (memaddr)tekino0->f);
-    state_task->set_param(6, (memaddr)bomend);
+    state_task->set_param(2, (memaddr)filpcount);
+    state_task->set_param(3, (memaddr)tekino0->f);
+    state_task->set_param(4, (memaddr)count);
 
     state_task->set_inData(0, p, sizeof(CHARACTER));
-    state_task->set_inData(1, bchar, sizeof(bomchar)*(bomend+1));
+    state_task->set_inData(1, bchar, sizeof(bomchar)*100);
+    state_task->set_inData(2, &bomend, sizeof(int));
+    state_task->set_inData(3, &rinkf2, sizeof(int));
     
     state_task->set_outData(0, p, sizeof(CHARACTER));
     state_task->set_outData(1, &count, sizeof(int));
     state_task->set_outData(2, &bomend, sizeof(int));
-    state_task->set_outData(3, obj, 0);
+    state_task->set_outData(3, bchar, sizeof(bomchar)*100);
+    state_task->set_outData(4, obj, 0);
+
+    state_task->set_post(checkContainer, (void*)p, (void*)obj);
+    state_task->set_cpu(SPE_ANY);
+    state_task->spawn();
+    
+    return p;
+}
+
+
+CHARACTER*
+Boss2Task1(CHARACTER *p)
+{
+    int task_num = p->task;
+    int obj_size = sizeof(ObjContainer)+sizeof(ObjData)*DATA_LENGTH;
+    HTaskPtr state_task = tmanager->create_task(task_num);
+    ObjContainerPtr obj = (ObjContainerPtr)tmanager->allocate(obj_size);
+    obj->flag = false;
+    obj->length = 0;
+
+    state_task->set_param(0, (memaddr)enemy_part1->f);
+    state_task->set_param(1, (memaddr)enemy_part5->f);
+
+    state_task->set_inData(0, p, sizeof(CHARACTER));
+    state_task->set_inData(1, &count, sizeof(int));
+    state_task->set_inData(2, &rinkx, sizeof(int));
+    state_task->set_inData(3, &rinkf1, sizeof(int));
+    
+    state_task->set_outData(0, p, sizeof(CHARACTER));
+    state_task->set_outData(1, &count, sizeof(int));
+    state_task->set_outData(2, &rinkx, sizeof(int));
+    state_task->set_outData(3, &rinkf1, sizeof(int));
+    state_task->set_outData(4, obj, 0);
+
+    state_task->set_post(checkContainer, (void*)p, (void*)obj);
+    state_task->set_cpu(SPE_ANY);
+    state_task->spawn();
+    
+    return p;
+}
+
+
+CHARACTER*
+Boss2Task2(CHARACTER *p)
+{
+    int task_num = p->task;
+    int obj_size = sizeof(ObjContainer)+sizeof(ObjData)*DATA_LENGTH;
+    HTaskPtr state_task = tmanager->create_task(task_num);
+    ObjContainerPtr obj = (ObjContainerPtr)tmanager->allocate(obj_size);
+    obj->flag = false;
+    obj->length = 0;
+
+    state_task->set_param(0, (memaddr)enemy_part3->f);
+    state_task->set_param(1, (memaddr)enemy_part4->f);
+    state_task->set_param(2, (memaddr)enemystate[14].charano);
+    state_task->set_param(3, (memaddr)enemystate[20].charano);
+
+    state_task->set_inData(0, p, sizeof(CHARACTER));
+    state_task->set_inData(1, kyeenemyno, sizeof(CHARACTER));
+    state_task->set_inData(2, &count, sizeof(int));
+    state_task->set_inData(3, &rinkf1, sizeof(int));
+    state_task->set_inData(4, bchar, sizeof(bomchar)*100);
+    
+    state_task->set_outData(0, p, sizeof(CHARACTER));
+    state_task->set_outData(1, &count, sizeof(int));
+    state_task->set_outData(2, &rinkx, sizeof(int));
+    state_task->set_outData(3, &rinkf1, sizeof(int));
+    state_task->set_outData(4, obj, 0);
 
     state_task->set_post(checkContainer, (void*)p, (void*)obj);
     state_task->set_cpu(SPE_ANY);
@@ -487,7 +621,7 @@
     kyeenemyno = p;
 
     p->task = STATE8;
-    return BossTask1(p);
+    return Boss1Task1(p);
 }
 
 
@@ -495,7 +629,7 @@
 chara_state9(CHARACTER *p)
 {
     p->task = STATE9;    
-    return BossTask2(p);
+    return Boss1Task2(p);
 }
 
 
@@ -503,7 +637,7 @@
 chara_state10(CHARACTER *p)
 {
     p->task =STATE10;
-    return BossTask3(p);
+    return Boss1Task3(p);
 }
 
 
@@ -511,7 +645,7 @@
 chara_state11(CHARACTER *p)
 {
     p->task = STATE11;
-    return BossTask4(p);
+    return Boss1Task4(p);
 }
 
 
@@ -519,7 +653,7 @@
 chara_state12(CHARACTER *p)
 {
     p->task = STATE12;
-    return BossTask5(p);
+    return Boss1Task5(p);
 }
 
 
@@ -527,7 +661,7 @@
 chara_state13(CHARACTER *p)
 {
     p->task = STATE13;
-    return BossTask6(p);
+    return Boss1Task6(p);
 }
 
 
@@ -548,305 +682,104 @@
 //ここまでgetate boss
 
 
-CHARACTER * chara_state22(CHARACTER *p)
+CHARACTER*
+chara_state22(CHARACTER *p)
 {
+    p->task = STATE22;    
     return SimpleStateTask(p);
 }
 
 
-CHARACTER * chara_state23(CHARACTER *p)
+CHARACTER*
+chara_state23(CHARACTER *p)
 {
-//  p=asteroid(p);
-  return p;
+    p->task = STATE23;
+    return AsteroidTask(p);
 }
 
 
-#if 0
-CHARACTER * chara_state24(CHARACTER *p)
+CHARACTER*
+chara_state24(CHARACTER *p)
 {
-  kyeenemyno = p;
-  tekino0 = 0;
-  enemy_part1 = p->next;
-  enemy_part2 = enemy_part1->next;
-  enemy_part3 = enemy_part2->next;
-  enemy_part4 = enemy_part3->next;
-  enemy_part5 = enemy_part4->next;
-  rinkx = 0;
-  rinky = 0;
-  rinkf1 = 0;
-  rinkf2 = 0;
-  p->state = chara_state25;
-  return p;
-}
-
-CHARACTER * chara_state25(CHARACTER *p)
-{
-  int amari;
+    kyeenemyno = p;
+    tekino0 = 0;
+    enemy_part1 = p->next;
+    enemy_part2 = enemy_part1->next;
+    enemy_part3 = enemy_part2->next;
+    enemy_part4 = enemy_part3->next;
+    enemy_part5 = enemy_part4->next;
+    rinkx = 0;
+    rinky = 0;
+    rinkf1 = 0;
+    rinkf2 = 0;
+    p->task = STATE25;
 
-  if(p->dt1 <= 360)
-    {
-      p->x = Mycos(p->dt1) * 30 / SANKAKU + 82 + 32;
-      p->y = Mysin(p->dt1) * 30 / SANKAKU + 30;
-    }
-  if(p->dt1 > 360)
-    {
-      p->x = Mycos(p->dt1) * 30 * -1 /SANKAKU + 142 + 32;
-      p->y = Mysin(p->dt1) * 30 / SANKAKU + 30;
-    }
-  count++;
-  PutSprite(count, p->x - 42, p->y, 64);
-  amari = rand() % 160;
-  if((amari == 1) && (enemy_part5->f == TRUE))
-    {
-      p->state = chara_state26;
-      rinkf1 = 1;
-    }
-  if((amari == 2) && (enemy_part1->f == TRUE))
-    {
-      p->state = chara_state27;
-      rinkf1 = 5;
-      rinkx = 0;
-      return p;
-    }
-  if((enemy_part5->f == TRUE) && (enemy_part1->f != TRUE))
-    {
-      p->state = chara_state28;
-    }
-  p->dt1 += 3;
-  if(p->dt1 == 720)
-    {
-      p->dt1 = 0;
-    }
-  return p;
+    int num = GetStateNum(p->task);
+    p->state = state_list[num];
+    return p;
 }
 
-CHARACTER * chara_state26(CHARACTER *p)
+CHARACTER*
+chara_state25(CHARACTER *p)
 {
-  if((p->dt2 > 50) && (p->dt2 < 100))
-    {
-      rinkf1 = 2;
-    }
-  if(p->dt2 > 100)
-    {
-      rinkf1 = 3;
-    }
-  if(p->dt2 == 400)
-    {
-      rinkf1 = 4;
-    }
-  count++;
-  PutSprite(count, p->x - 42, p->y, 64);
-  if(p->dt2 == 401)
-    {
-      p->dt2 = 0;
-      rinkf1 = 0;
-      p->state = chara_state25;
-      return p;
-    }
-  p->dt2++;
-  return p;
+    p->task = STATE25;
+    return Boss2Task1(p);
 }
 
-CHARACTER * chara_state27(CHARACTER *p) //rocket punch
+CHARACTER*
+chara_state26(CHARACTER *p)
 {
-  if((p->dt2 > 50) && (p->dt2 < 60) && (p->x > -24) && (p->y > -24))
-    {
-      rinkf1 = 6;
-      rinkx -= 4;
-      p->x -= 4;
-      p->y -= 4;
-    }
-  if(p->dt2 == 80)
-    {
-      rinkf1 = 7;
-    }
-  if(p->dt2 == 81)
-    {
-      rinkf1 = 8;
-    }
-  if(p->dt2 == 124)
-    {
-      rinkf1 = 9;
-    }
-  if(p->dt2 == 400)
-    {
-      rinkf1 = 10;
-    }
-  if(p->dt2 == 444)
-    {
-      rinkf1 = 11;
-    }
-  if(p->dt2 == 500)
-    {
-      rinkf1 = 12;
-    }
-  if((p->dt2 > 80) && (p->dt2 < 200))
-    {
-      if((rinkx != 0) && (p->dt2 % 2 == 1))
-	{
-	  rinkx++;
-	  p->x++;
-	  p->y++;
-	}
-    }
-  count++;
-  PutSprite(count, p->x - 32, p->y, 6);
-  if(rinkf1 == 12)
-    {
-      p->dt2 = 0;
-      rinkf1 = 0;
-      rinkx = 0;
-      p->state = chara_state25;
-      return p;
-    }
-  p->dt2++;
-  return p;
+    p->task = STATE26;
+    return Boss2Task1(p);
 }
-CHARACTER * chara_state28(CHARACTER *p)
+
+CHARACTER*
+chara_state27(CHARACTER *p) //rocket punch
 {
-  if (p->dt1 <= 360)
-    {
-      p->x = Mycos(p->dt1) * 30 / SANKAKU + 82 + 32;
-      p->y = Mysin(p->dt1) * 30 / SANKAKU + 30;
-    }
-  if (p->dt1 > 360)
-    {
-      p->x = Mycos(p->dt1) * 30 * -1 / SANKAKU + 142 + 32;
-      p->y = Mysin(p->dt1) * 30 / SANKAKU + 30;
-    }
-  count++;
-  PutSprite(count, p->x - 42, p->y, 64);
-  if (p->dt1 % 30 == 3)
-    {
-      Putenemy(24, p->x + 14,
-	       p->y + 14,
-	       (rand() % 5 + 0.5) * (rand() % 2 ==
-				     1 ? -1 : 1),
-	       (rand() % 5 + 0.5) * (rand() % 2 ==
-				     1 ? -1 : 1), chara_state29);
-    }
-  p->dt1 += 3;
-  return p;
+    p->task = STATE27;
+    return Boss2Task1(p);
+}
+CHARACTER*
+chara_state28(CHARACTER *p)
+{
+    p->task = STATE28;
+    return Boss2Task1(p);
 }
 
 
-CHARACTER * chara_state29(CHARACTER *p)
+CHARACTER*
+chara_state29(CHARACTER *p)
 {
-  p->x += p->vx;
-  p->y += p->vy;
-  if(p->dt1 % 18 == 1)
-    {
-      Puttama(0, p->x, p->y);
-    }
-  p->dt1++;
-  return p;
+    p->task = STATE29;
+    return sendContainerTask(p);
 }
-#endif
+
 
-CHARACTER * chara_state30(CHARACTER *p)
+CHARACTER*
+chara_state30(CHARACTER *p)
 {
     p->task = STATE30;
     return SimpleStateTask(p);
 }
 
-#if 0
-CHARACTER * chara_state31(CHARACTER *p) //right hand
+
+CHARACTER*
+chara_state31(CHARACTER *p) //right hand
 {
-  
-  if((enemy_part3->f == FALSE) || (kyeenemyno->f == FALSE))
-    {
-      Bom(p->x, p->y);
-      p->f = FALSE;
-      p->state = delete_chara;
-      p->collision = noaction;
-      return p;
-    }
-
-  if(rinkf1 == 0)
-    {
-      p->x = kyeenemyno->x + 40;
-      p->y = kyeenemyno->y + 28;
-      p->dt2 = 0;
-    }
-  if(rinkf1 == 5)
-    {
-      p->x = kyeenemyno->x + 52;
-      p->y = kyeenemyno->y;
-      count++;
-      PutSprite(count, p->x - 4, p->y - 20, 80 + p->dt2 % 4);
-      p->dt2++;
-    }
-  if(rinkf1 == 6)
-    {
-      if(p->y < 240 - 40)
-	{
-	  p->y += 6;
-	}
-      else 
-	{
-	  return p;
-	}
-      count++;
-      PutSprite(count, p->x - 4, p->y - 20, 90 + p->dt2 % 4);
-      p->dt2++;
-    }
-  if(rinkf1 == 7)
-    {
-      Putenemy(22, p->x + 14, p->y + 14, 0, 0, chara_state40);
-      return p;
-    }
-  if(rinkf1 == 11)
-    {
-      if(p->y + 20 != p->y)
-	{
-	  p->y--;
-	}
-      else 
-	{
-	  return p;
-	}
-      count++;
-      PutSprite(count, p->x + 8, p->y + 44, 58 + p->dt2 % 4);
-      p->dt2++;
-    }
-  return p;
+    p->task = STATE31;
+    return Boss2Task2(p);
 }
 
 
-CHARACTER * chara_state32(CHARACTER *p) //left hand
+CHARACTER*
+chara_state32(CHARACTER *p) //left hand
 {
-  if ((enemy_part4->f == FALSE)
-      || (kyeenemyno->f == FALSE))
-    {
-      Bom(p->x, p->y);
-      p->f = FALSE;
-      p->state = delete_chara;
-      p->collision = noaction;
-      return p;
-    }
-  p->x = kyeenemyno->x - 40;
-  p->y = kyeenemyno->y + 28;
-  if (rinkf1 == 5)
-    {
-      p->x = kyeenemyno->x - 24 + 4;
-      p->y = kyeenemyno->y + 28;
-      p->charano = enemystate[20].charano;
-    }
-  if (rinkf1 == 11)
-    {
-      p->charano = enemystate[14].charano;
-    }
-  if (rinkf1 == 7)
-    {
-      Putenemy(23, p->x + 14,
-	       p->y + 14, 0, 0, chara_state41);
-      //      rinkf1=8;
-      return p;
-    }
-  return p;
+    p->task = STATE32;
+    return Boss2Task2(p);
 }
 
 
+#if 0
 CHARACTER * chara_state33(CHARACTER *p) // right shoulder
 {
   if (kyeenemyno->f == FALSE)
@@ -1051,50 +984,33 @@
   p->dt1++;
   return p;
 }
+#endif
 
 
 CHARACTER * chara_state400(CHARACTER *p)
 {
+    p->task = STATE400;
     return SimpleStateTask(p);
 }
 
 
-CHARACTER * chara_state401(CHARACTER *p)
+CHARACTER*
+chara_state401(CHARACTER *p)
 {
-  p->vx++;
-  p->x += p->vx / 8;
-  if (p->x > (jiki.x - 32))
-    {
-      p->vy--;
-    }
-  p->y += p->vy / 8;
-  if (p->dt1 % 50 == 37)
-    {
-      Puttama(1, p->x + 8, p->y + 24);
-    }
-  p->dt1++;
-  return p;
+    p->task = STATE401;
+    return JikiContainerTask(p);
 }
 
 
-CHARACTER * chara_state402(CHARACTER *p)
+CHARACTER*
+chara_state402(CHARACTER *p)
 {
-  p->vx--;
-  p->x += p->vx / 8;
-  if (p->x < (jiki.x + 32))
-    {
-      p->vy--;
-    }
-  p->y += p->vy / 8;
-  if (p->dt1 % 50 == 37)
-    {
-      Puttama(1, p->x + 8, p->y + 24);
-    }
-  p->dt1++;
-  return p;
+    p->task = STATE402;
+    return JikiContainerTask(p);
 }
 
 
+#if 0
 CHARACTER * chara_state410(CHARACTER *p)
 {
   kyeenemyno = p;
@@ -1265,29 +1181,4 @@
   return p;
 }
 
-
-CHARACTER *  asteroid(CHARACTER *p)
-{
-    int i;
-
-    asteroiddt[asteroidi] = p;
-    //            if(asteroidi==0)
-    //            {
-    p->x += p->vx;
-    p->y += p->vy;
-    //            }
-    if (asteroidi > 0) {
-	for (i = 0; i < asteroidi; i++) {
-	    if ((asteroiddt[i]->x + 32 > p->x)
-		&& (p->x + 32 > asteroiddt[i]->x)
-		&& (asteroiddt[i]->y + 32 > p->y)
-		&& (asteroiddt[i]->y < p->y + 32)) {
-		p->vx *= -1;
-		p->vy *= -1;
-	    }
-	}
-    }
-    asteroidi++;
-    return p;
-}
 #endif