static int logoProc(sTaskBody *body, int msg, int lParam, int rParam) { int res = 0; LogoVar *var = (LogoVar *)TaskGetVar(body, sizeof(LogoVar), MEM_APP); switch(msg) { case MSG_CREATE: { var->logo = (Sprite *)StkRefFrameP(0); } break; case MSG_KILL: { } break; case MSG_STEP: { if(!var->inited) { var->inited = TRUE; for(int i = 0; i < LOGO_CHARANUM; i += 1) { var->logo_pos[i] = var->logo[i].pos; } } if(var->kill_req) { var->logo_eft *= 0.95; if(var->logo_eft < 0.01f) { var->logo_eft = 0.0f; res = 1; } } else { var->logo_eft += 0.01; if(var->logo_eft > 1.0f) var->logo_eft = 1.0f; } for(int i = 0; i < LOGO_CHARANUM; i += 1) { float x = sinf((float)(g.time + i * 45) * 0.02f) * 5.0f; float y = cosf((float)(g.time + i * 30 + 50) * 0.03f) * 4.0f; SetV2d(&var->logo[i].pos, var->logo_pos[i].x + x * var->logo_eft, var->logo_pos[i].y + y * var->logo_eft); } } break; case MSG_GAME_TITLE_LOGOEFT_FIN: { var->kill_req = TRUE; } break; } return res; }
FVector2 *ShotGetDamageVct(void) { return (FVector2 *)StkRefFrameP(2); }
FVector2 *ShotGetDamagePos(void) { return (FVector2 *)StkRefFrameP(1); }
/* ダメージ関連 */ sOBJ *ShotGetDamageSender(void) { return (sOBJ *)StkRefFrameP(0); }
static int spriteProc(sTaskBody *body, int msg, int lParam, int rParam) { int res = 0; SpriteVar *var = (SpriteVar *)TaskGetVar(body, sizeof(SpriteVar), MEM_APP); switch(msg) { case MSG_CREATE: { char *name = (char *)StkRefFrameP(0); var->obj = (Sprite *)StkRefFrameP(1); sParam *param = (sParam *)StkRefFrameP(2); int delay = StkRefFrameI(3); char id_str[ID_MAXLEN]; sprintf(id_str, "%s.delay", name); delay += ParamGetReal(param, id_str) * FRAME_RATE; if(delay > 0) TaskSleep(body, delay); sprintf(id_str, "%s.frame", name); var->frame = ParamGetReal(param, id_str) * FRAME_RATE; sprintf(id_str, "%s.slow", name); var->slow = ParamGetReal(param, id_str); sprintf(id_str, "%s.start", name); if(ParamIsExists(param, id_str)) { var->pos_start = *ParamGetFVec2(param, id_str); } else { var->pos_start = var->obj->pos; } sprintf(id_str, "%s.end", name); if(ParamIsExists(param, id_str)) { var->pos_end = *ParamGetFVec2(param, id_str); } else { var->pos_end = var->obj->pos; } var->obj->pos = var->pos_start; sprintf(id_str, "%s.s_sc", name); if(ParamIsExists(param, id_str)) { var->scale_start = *ParamGetFVec2(param, id_str); } else { var->scale_start = var->obj->scale; } sprintf(id_str, "%s.e_sc", name); if(ParamIsExists(param, id_str)) { var->scale_end = *ParamGetFVec2(param, id_str); } else { var->scale_end = var->obj->scale; } var->obj->scale = var->scale_start; } break; case MSG_KILL: { } break; case MSG_STEP: { var->count += 1; float d = (float)var->count / (float)var->frame; if(var->slow) d = d * d; else d = (2.0f - d) * d; var->obj->pos.x = var->pos_start.x + (var->pos_end.x - var->pos_start.x) * d; var->obj->pos.y = var->pos_start.y + (var->pos_end.y - var->pos_start.y) * d; var->obj->scale.x = var->scale_start.x + (var->scale_end.x - var->scale_start.x) * d; var->obj->scale.y = var->scale_start.y + (var->scale_end.y - var->scale_start.y) * d; res = (var->count == var->frame); } break; case MSG_GAME_TITLE_SKIP_EFFECT: { TaskAwake(body); var->count = var->frame - 1; } break; } return res; }
static int mainProc(sTaskBody *body, int msg, int lParam, int rParam) { int res = 0; RankingVar *var = (RankingVar *)TaskGetVar(body, sizeof(RankingVar), MEM_APP); switch(msg) { case MSG_CREATE: { var->param = ParamRead(PATH_DATA"/ranking.param"); var->ranking = ReadGameSettings(); RankingInfo *info = (RankingInfo *)StkRefFrameP(0); var->score = info->score; var->boss = info->boss; var->weapon = info->weapon; var->playend = lParam; FVector2 *value = ParamGetFVec2(var->param, "ranking_count"); var->abort_count = ((lParam) ? value->y : value->x) * FRAME_RATE; var->fade_in = ParamGetReal(var->param, "fade_in") * FRAME_RATE; var->input_delay = ParamGetReal(var->param, "input_delay") * FRAME_RATE; RankingScore *rankingScore = var->rankingScore; for(int i = 0; i < RANKING_MAX; i++) { char id_str[ID_MAXLEN]; sprintf(id_str, "%d.name", i + 1); char *name = ParamGetStr(var->ranking, id_str); strcpy(rankingScore->name, name); sprintf(id_str, "%d.score", i + 1); rankingScore->score = ParamGetReal(var->ranking, id_str); sprintf(id_str, "%d.boss", i + 1); rankingScore->boss = ParamGetReal(var->ranking, id_str); sprintf(id_str, "%d.weapon", i + 1); rankingScore->weapon = ParamGetReal(var->ranking, id_str); rankingScore += 1; } if(var->playend) { RankingScore *rankingScore = var->rankingScore; int index = RANKING_MAX; for(int i = 0; i < RANKING_MAX; i += 1) { if(var->score >= rankingScore->score) { index = i; break; } rankingScore += 1; } for(int i = RANKING_MAX - 1; i > index; i -= 1) { var->rankingScore[i] = var->rankingScore[i - 1]; } if(index < RANKING_MAX) { var->rank_in = TRUE; var->rank_in_index = index; rankingScore->score = var->score; rankingScore->boss = var->boss; rankingScore->weapon = var->weapon; strcpy(rankingScore->name, " "); SndEffectReq("rank_in", ParamGetReal(var->param, "se_delay") * FRAME_RATE, 1.0f); } } } break; case MSG_KILL: { ParamDestroy(var->ranking); ParamDestroy(var->param); } break; case MSG_STEP: { BOOL abort = InputGetBtnTD(MOUSE_LEFT | MOUSE_D_LEFT); BOOL inkey = FALSE; BOOL key_input = var->rank_in; if(var->fade_in > 0) { var->fade_in -= 1; float fade_in = ParamGetReal(var->param, "fade_in") * FRAME_RATE; var->alpha = (fade_in - (float)var->fade_in) / fade_in; } if(var->input_delay > 0) { var->input_delay -= 1; abort = FALSE; key_input = FALSE; } if(key_input) { char input = InputGetKey(); if(input == '"') input = '\''; /* 苦肉の策 */ RankingScore *rankingScore = &var->rankingScore[var->rank_in_index]; if(input == 0xd) { abort = TRUE; } else if((var->cursor > 0) && (input == ASCII_BS || input == ASCII_DEL)) { var->cursor -= 1; rankingScore->name[var->cursor] = ' '; inkey = TRUE; } else if((var->cursor < 3) && (input >= 0x20) && (input <= 0x7e)) { rankingScore->name[var->cursor] = input; var->cursor += 1; inkey = TRUE; } } else if(var->abort_count > 0) { var->abort_count -= 1; } if(inkey || abort) SndEffectReq("rank_key", 0, 1.0f); res = ((var->abort_count == 0) || abort); if(res) { if(var->rank_in) { recordRanking(var); } TaskPostMsgAll(TASK_PRI_NONE, MSG_GAME_RANKING_FIN, 0, 0); } } break; case MSG_DRAW: { FontPrintF(174, 115, PRIO_COCKPIT, "$A%f$$F1$C1R $C7A N K I N $C2G", var->alpha); RankingScore *rankingScore = var->rankingScore; for(int i = 0; i < RANKING_MAX; i += 1) { char *name = rankingScore->name; int score = rankingScore->score; int boss = rankingScore->boss; if(var->rank_in && (var->rank_in_index == i)) { char id_str[ID_MAXLEN]; sprintf(id_str, "%d.rank_str", i + 1); char *rank_str = ParamGetStr(var->param, id_str); int col = (g.time % 7) + 1; FontPrintF(115, 165 + 24 * i, PRIO_COCKPIT, "$A%f$$F1$C%d%s %s %7d B-%-2d", var->alpha, col, rank_str, name, score, boss); char cur[5] = " "; cur[var->cursor] = (var->input_delay == 0) ? '_' : ' '; FontPrintF(115, 167 + 24 * i, PRIO_COCKPIT, "$A%f$$F1$C%d %s", var->alpha, col, cur); } else { char id_str[ID_MAXLEN]; sprintf(id_str, "%d.rank_hdr", i + 1); char *rank_hdr = ParamGetStr(var->param, id_str); sprintf(id_str, "%d.rank_str", i + 1); char *rank_str = ParamGetStr(var->param, id_str); FontPrintF(115, 165 + 24 * i, PRIO_COCKPIT, "$A%f$$F1%s%s $C7%s %7d $C8B$C7-%-2d", var->alpha, rank_hdr, rank_str, name, score, boss); } rankingScore += 1; } } break; } return res; }
static int objProc(sOBJ *obj, sParam *param, int msg, int lParam, int rParam) { int res = 0; ObjVar *var = (ObjVar *)ObjGetVar(obj, sizeof(ObjVar)); switch(msg) { case MSG_CREATE: { var->level = lParam; var->target_flag = (u_int)rParam; var->param = (sParam *)StkRefFrameP(0); var->pos = *(FVector2 *)StkRefFrameP(1); var->vct = *(FVector2 *)StkRefFrameP(2); var->dir = StkRefFrameF(3); float powofs = StkRefFrameF(4); var->radius = ParamGetReal(param, "radius"); var->speed = ParamGetReal(param, "speed"); var->power = PowerConvertInterValue(ParamGetReal(param, "power") * powofs); FVector4 *col; col = ParamGetFVec4(param, "col1"); SetRGBA(&var->col1, col->x, col->y, col->z, col->w); col = ParamGetFVec4(param, "col2"); SetRGBA(&var->col2, col->x, col->y, col->z, col->w); var->disp_size = ParamGetFVec2(param, "disp_size"); FVector2 vct; MathCalcVector(&vct, var->dir, var->speed); var->vct.x += vct.x; var->vct.y += vct.y; ObjSetPos(obj, var->pos.x, var->pos.y); ObjSetDir(obj, var->dir); ObjSetVct(obj, var->vct.x, var->vct.y); } break; case MSG_KILL: { } break; case MSG_STEP: { #if 0 GameFieldRange(&var->pos); #endif var->pos.x += var->vct.x; var->pos.y += var->vct.y; ObjSetPos(obj, var->pos.x, var->pos.y); ObjSetDir(obj, var->dir); ObjSetVct(obj, var->vct.x, var->vct.y); res = FieldClip(&var->pos, 20.0f); if(res) { ObjKillReq(obj); } else { /* TODO:非常に重い処理なので解決策を考える */ BOOL kill = sendDamage(obj, var->target_flag, &var->pos, &var->vct, var->radius, var->power); if(kill) { ObjKillReq(obj); } } } break; case MSG_DRAW: { sGRPOBJ *grp; grp = GRPOBJ_FILLCIRCLE(PRIO_SHOT); GrpSetPos(grp, var->disp_x, var->disp_y); GrpSetRot(grp, var->dir); GrpSetRGBA(grp, var->col1.red, var->col1.green, var->col1.blue, var->col1.alpha); GrpSetSize(grp, var->disp_size->x, var->disp_size->x); GrpSetLineNum(grp, 8); GrpSetSmooth(grp, TRUE); grp = GRPOBJ_FILLCIRCLE(PRIO_SHOT); GrpSetPos(grp, var->disp_x, var->disp_y); GrpSetRot(grp, var->dir); GrpSetRGBA(grp, var->col2.red, var->col2.green, var->col2.blue, var->col2.alpha); GrpSetSize(grp, var->disp_size->y, var->disp_size->y); GrpSetLineNum(grp, 6); GrpSetSmooth(grp, TRUE); #ifdef DEBUG if(isDispDebugInfo()) { sGRPOBJ *grp = GRPOBJ_CIRCLE(PRIO_DEBUG_PRINT); GrpSetPos(grp, var->disp_x, var->disp_y); GrpSetSize(grp, var->radius, var->radius); GrpSetLineNum(grp, 12); GrpSetRGBA(grp, 1.0f, 1.0f, 0.0f, 1.0f); GrpSetDrawSize(grp, 1.0f); } #endif } break; case MSG_GAME_CAMERA: { FVector2 *pos = (FVector2 *)StkRefFrameP(0); var->disp_x = var->pos.x - pos->x; var->disp_y = var->pos.y - pos->y; } break; } return res; }