📄 npc_petracemaster.c
字号:
NPC_PetRaceMaster_selectWindow(meindex, talkerindex, 1, -1); else if (datanum == 2) NPC_PetRaceMaster_selectWindow(meindex, talkerindex, 2, -1); break; case CHAR_WINDOWTYPE_PETRACEMASTER_RULE: if (datanum == 3) NPC_PetRaceMaster_selectWindow(meindex, talkerindex, 1, -1); case CHAR_WINDOWTYPE_PETRACEMASTER_PET: case CHAR_WINDOWTYPE_PETRACEMASTER_LEAVE: default: break; }}void NPC_PetRaceMasterLoop( int meindex){ int floor = CHAR_getInt(meindex, CHAR_FLOOR); time_t t1; time(&t1); switch(CHAR_getWorkInt(meindex, NPC_WORK_STATE)) { case NPC_State_Init: // 寻找宠物index NPC_findRacePetIndex(meindex, floor); break; case NPC_State_WaitDropStake: { char tmpbuf[256]; int statechangetime = CHAR_getWorkInt(meindex, NPC_WORK_STATECHANGE); if (t1 < statechangetime) { if (statechangetime - t1 <= 5) { CHAR_setInt(meindex, CHAR_LOOPINTERVAL, PETRACEMASTER_WAITDROPIV_LOOPTIME); snprintf(tmpbuf, sizeof(tmpbuf), "还有%2d秒就要开跑了,请大家踊跃下注!", (int)(statechangetime - t1) % 60); } else if (statechangetime - t1 <= 10) { CHAR_setInt(meindex, CHAR_LOOPINTERVAL, PETRACEMASTER_WAITDROPIII_LOOPTIME); snprintf(tmpbuf, sizeof(tmpbuf), "还有%2d秒就要开跑了,请大家踊跃下注!", (int)(statechangetime - t1) % 60); } else if (statechangetime - t1 <= 30) { CHAR_setInt(meindex, CHAR_LOOPINTERVAL, PETRACEMASTER_WAITDROPII_LOOPTIME); snprintf(tmpbuf, sizeof(tmpbuf), "还有%2d秒就要开跑了,请大家踊跃下注!", (int)(statechangetime - t1) % 60); } else snprintf(tmpbuf, sizeof(tmpbuf), "还有%2d分钟%2d秒就要开跑了,请大家踊跃下注!", (int)(statechangetime - t1) / 60, (int)(statechangetime - t1) % 60); } if (t1 >= statechangetime) {#ifdef _DROPSTAKENEW#else float payrate1 = 0, payrate2 = 0, payrate3 = 0; int pet1gold = 0, pet2gold = 0, pet3gold = 0, totalgold = 0; int petindex1 = CHAR_getWorkInt(meindex, NPC_WORK_PET1); int petindex2 = CHAR_getWorkInt(meindex, NPC_WORK_PET2); int petindex3 = CHAR_getWorkInt(meindex, NPC_WORK_PET3); int randpet = CHAR_getWorkInt(meindex, NPC_WORK_PETGROUP); float droprate1 = 0, droprate2 = 0, droprate3 = 0, totaldroprate, Npayrate = PETRACESTDPAYRATE;#endif int i = 0; CHAR_setWorkInt(meindex, NPC_WORK_STATE, NPC_State_PetRacing); // 设定地面不可下注 SetCasinoMap(meindex, 0, FALSE);#ifdef _DROPSTAKENEW snprintf(tmpbuf, sizeof(tmpbuf), "请大家停止下注,宠物赛跑开始罗!");#else // 告知大家赔率(取得宠物下注金额计算赔率) GetCasinoMapGold(meindex, PET_RACE1, &pet1gold); GetCasinoMapGold(meindex, PET_RACE2, &pet2gold); GetCasinoMapGold(meindex, PET_RACE3, &pet3gold); totalgold = pet1gold + pet2gold + pet3gold; if (totalgold <= 0) { payrate1 = 2; payrate2 = 2; payrate3 = 2; } else { if (pet1gold <= PETRACESTDGOLD) pet1gold = PETRACESTDGOLD; if (pet2gold <= PETRACESTDGOLD) pet2gold = PETRACESTDGOLD; if (pet3gold <= PETRACESTDGOLD) pet3gold = PETRACESTDGOLD; totalgold = pet1gold + pet2gold + pet3gold; droprate1 = totalgold / pet1gold; droprate2 = totalgold / pet2gold; droprate3 = totalgold / pet3gold; totaldroprate = droprate1 + droprate2 + droprate3; if (totaldroprate / droprate1 > PETRACESTDPAYRATE) { payrate1 = 1; Npayrate -= 1; } if (totaldroprate / droprate2 > PETRACESTDPAYRATE) { payrate2 = 1; Npayrate -= 1; } if (totaldroprate / droprate3 > PETRACESTDPAYRATE) { payrate3 = 1; Npayrate -= 1; } if (payrate1 != 1) payrate1 = droprate1 / totaldroprate * Npayrate; if (payrate2 != 1) payrate2 = droprate2 / totaldroprate * Npayrate; if (payrate3 != 1) payrate3 = droprate3 / totaldroprate * Npayrate; } petracegra[randpet].payrate1 = payrate1; petracegra[randpet].payrate3 = payrate2; petracegra[randpet].payrate2 = payrate3; SetCasinoPayRate(meindex, PET_RACE1, payrate1); SetCasinoPayRate(meindex, PET_RACE2, payrate2); SetCasinoPayRate(meindex, PET_RACE3, payrate3); snprintf(tmpbuf, sizeof(tmpbuf), "请大家停止下注,宠物赛跑开始罗!%s的赔率为%5.2f;%s的赔率为%5.2f;%s的赔率为%5.2f", CHAR_getChar(petindex1, CHAR_NAME), payrate1, CHAR_getChar(petindex2, CHAR_NAME), payrate2, CHAR_getChar(petindex3, CHAR_NAME), payrate3);#endif CHAR_setInt(meindex, CHAR_LOOPINTERVAL, PETRACEMASTER_PETRACING_LOOPTIME); // 设定宠物状态 for (i = 0; i < PETRACEPETNUM; i++) { CHAR_setWorkInt(CHAR_getWorkInt(meindex, NPC_WORK_PET1 + i), NPC_WORK_STATE, NPC_State_Run); CHAR_setInt(CHAR_getWorkInt(meindex, NPC_WORK_PET1 + i), CHAR_LOOPINTERVAL, 1000); } } CHAR_talkToFloor(floor, meindex, tmpbuf, CHAR_COLORWHITE); } break; case NPC_State_PetRacing: if (CHAR_getWorkInt(meindex, NPC_WORK_PETGOAL) == PETRACEPETNUM) { char tmpbuf[256]; int winpetindex = CHAR_getWorkInt(meindex, NPC_WORK_WINPET); int petgroup = CHAR_getWorkInt(meindex, NPC_WORK_PETGROUP); snprintf(tmpbuf, sizeof(tmpbuf), "竞赛结束,胜利的宠物是:%s\n", CHAR_getChar(winpetindex, CHAR_NAME)); CHAR_talkToFloor(floor, meindex, tmpbuf, CHAR_COLORYELLOW); // 设定输赢,以计算赔率 if (CHAR_getWorkInt(meindex, NPC_WORK_PET1) == winpetindex) petracegra[petgroup].pet1win = petracegra[petgroup].pet1win + 1; else if (CHAR_getWorkInt(meindex, NPC_WORK_PET2) == winpetindex) petracegra[petgroup].pet2win = petracegra[petgroup].pet2win + 1; else if (CHAR_getWorkInt(meindex, NPC_WORK_PET3) == winpetindex) petracegra[petgroup].pet3win = petracegra[petgroup].pet3win + 1; CHAR_setWorkInt(meindex, NPC_WORK_STATE, NPC_State_ShowWinPet); CHAR_setInt(meindex, CHAR_LOOPINTERVAL, PETRACEMASTER_SHOWWINPET_LOOPTIME); CHAR_setWorkInt(meindex, NPC_WORK_STATECHANGE, t1 + PETRACESHOWWINPET); // 发奖金 NPC_givePriceToPlayer(meindex, floor, winpetindex); } break; case NPC_State_ShowWinPet: { int statechangetime = CHAR_getWorkInt(meindex, NPC_WORK_STATECHANGE); if (t1 >= statechangetime) { int randpet = RAND(0, arraysizeof(petracegra) - 1); int petindex1 = CHAR_getWorkInt(meindex, NPC_WORK_PET1); int petindex2 = CHAR_getWorkInt(meindex, NPC_WORK_PET2); int petindex3 = CHAR_getWorkInt(meindex, NPC_WORK_PET3); char tmpbuf[256]; CHAR_setWorkInt(meindex, NPC_WORK_PETGROUP, randpet); CHAR_setWorkInt(meindex, NPC_WORK_STATE, NPC_State_WaitDropStake); CHAR_setWorkInt(meindex, NPC_WORK_WINPET, 0); CHAR_setWorkInt(meindex, NPC_WORK_PETGOAL, 0); CHAR_setWorkInt(meindex, NPC_WORK_STATECHANGE, t1 + PETRACEDROPSTAKETIME); CHAR_setInt(meindex, CHAR_LOOPINTERVAL, PETRACEMASTER_WAITDROPI_LOOPTIME); // 设定地面可下注 SetCasinoMap(meindex, 0, TRUE); // 设定宠物 CHAR_setWorkInt(petindex1, NPC_WORK_STATE, NPC_State_Wait); CHAR_setInt(petindex1, CHAR_LOOPINTERVAL, 1000); CHAR_setInt(petindex1, CHAR_BASEIMAGENUMBER, petracegra[randpet].pet1gra); CHAR_setChar(petindex1, CHAR_NAME, petracegra[randpet].pet1name); CHAR_setWorkInt(petindex2, NPC_WORK_STATE, NPC_State_Wait); CHAR_setInt(petindex2, CHAR_LOOPINTERVAL, 1000); CHAR_setInt(petindex2, CHAR_BASEIMAGENUMBER, petracegra[randpet].pet2gra); CHAR_setChar(petindex2, CHAR_NAME, petracegra[randpet].pet2name); CHAR_setWorkInt(petindex3, NPC_WORK_STATE, NPC_State_Wait); CHAR_setInt(petindex3, CHAR_LOOPINTERVAL, 1000); CHAR_setInt(petindex3, CHAR_BASEIMAGENUMBER, petracegra[randpet].pet3gra); CHAR_setChar(petindex3, CHAR_NAME, petracegra[randpet].pet3name); // 设定宠物状况#ifdef _DROPSTAKENEW#else petracegra[randpet].payrate1 = 0; petracegra[randpet].payrate3 = 0; petracegra[randpet].payrate2 = 0;#endif { int state1 = RAND(0, 3); int state2 = RAND(0, 3); int state3 = RAND(0, 3); if (state1 == 0) sprintf(petracegra[randpet].state1, "良好"); else if (state1 == 1) sprintf(petracegra[randpet].state1, "普通"); else if (state1 == 2) sprintf(petracegra[randpet].state1, "不佳"); else if (state1 == 3) sprintf(petracegra[randpet].state1, "未知"); if (state2 == 0) sprintf(petracegra[randpet].state2, "良好"); else if (state2 == 1) sprintf(petracegra[randpet].state2, "普通"); else if (state2 == 2) sprintf(petracegra[randpet].state2, "不佳"); else if (state2 == 3) sprintf(petracegra[randpet].state2, "未知"); if (state3 == 0) sprintf(petracegra[randpet].state3, "良好"); else if (state3 == 1) sprintf(petracegra[randpet].state3, "普通"); else if (state3 == 2) sprintf(petracegra[randpet].state3, "不佳"); else if (state3 == 3) sprintf(petracegra[randpet].state3, "未知"); } snprintf(tmpbuf, sizeof(tmpbuf), "宠物竞速准备中,请大家踊跃下注!"); CHAR_talkToFloor(floor, meindex, tmpbuf, CHAR_COLORYELLOW); } } break; default: break; }}void NPC_findRacePetIndex(int meindex, int floor){ int i = 0, j = 0; time_t t1; time(&t1); if (CHAR_getWorkInt(meindex, NPC_WORK_FINDPETFLAG) == 0) { for (i = 0; i < CHAR_getCharNum(); i++) { if (CHAR_getInt(i, CHAR_FLOOR) == floor) { if (CHAR_getInt(i, CHAR_WHICHTYPE) == CHAR_PETRACEPET) { for (j = 0; j < PETRACEPETNUM; j++) { if (CHAR_getWorkInt(meindex, NPC_WORK_PET1 + j) == 0) { CHAR_setWorkInt(meindex, NPC_WORK_PET1 + j, i); CHAR_setWorkInt(i, CHAR_NPCWORKINT2, meindex); break; } } } } } if (CHAR_getWorkInt(meindex, NPC_WORK_PET1) > 0 && CHAR_getWorkInt(meindex, NPC_WORK_PET2) > 0 && CHAR_getWorkInt(meindex, NPC_WORK_PET3) > 0) { CHAR_setWorkInt(meindex, NPC_WORK_FINDPETFLAG, 1); CHAR_setWorkInt(meindex, NPC_WORK_STATE, NPC_State_WaitDropStake); CHAR_setInt(meindex, CHAR_LOOPINTERVAL, PETRACEMASTER_WAITDROPI_LOOPTIME); CHAR_setWorkInt(meindex, NPC_WORK_STATECHANGE, t1 + PETRACEDROPSTAKETIME); } else CHAR_setWorkInt(meindex, NPC_WORK_FINDPETFLAG, 0); }}void NPC_givePriceToPlayer(int meindex, int floor, int winpetindex){ int wincasinotype = 0; if (CHAR_getWorkInt(meindex, NPC_WORK_PET1) == winpetindex) wincasinotype = PET_RACE1; else if (CHAR_getWorkInt(meindex, NPC_WORK_PET2) == winpetindex) wincasinotype = PET_RACE2; else if (CHAR_getWorkInt(meindex, NPC_WORK_PET3) == winpetindex) wincasinotype = PET_RACE3; if (wincasinotype == 0) return; else CasinoPay(meindex, wincasinotype);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -