?? char_angel.c
字號:
#include "version.h"
#ifdef _ANGEL_SUMMON
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h> // shan
#include <ctype.h>
#include <time.h>
#include <sys/time.h>
#include <errno.h>
#include "common.h"
#include "char_base.h"
#include "char_data.h"
#include "char.h"
#include "lssproto_serv.h"
#include "item.h"
#include "item_event.h"
#include "buf.h"
#include "object.h"
#include "map_deal.h"
#include "saacproto_cli.h"
#include "readmap.h"
#include "handletime.h"
#include "char_event.h"
#include "npccreate.h"
#include "addressbook.h"
#include "item_event.h"
#include "magic_base.h"
#include "magic.h"
#include "chatmagic.h"
#include "configfile.h"
#include "log.h"
#include "anim_tbl.h"
#include "encount.h"
#include "battle.h"
#include "pet_skill.h"
#include "util.h"
#include "enemy.h"
#include "npcutil.h"
#include "pet.h"
#include "family.h"
#include "defend.h"
#include "npcserver.h"
struct MissionInfo missionlist[MAXMISSION];
int mission_num =0;
struct MissionTable missiontable[MAXMISSIONTABLE];
//#define ANGELITEM 2884 //20701 //使者的信物 道具編號
//#define HEROITEM 2885 //20702 //勇者的信物 道具編號
extern int AngelReady;
char* getMissionNameInfo( int charaindex, char* nameinfo)
{
sprintf( nameinfo, "%s:%s", CHAR_getChar( charaindex, CHAR_CDKEY), CHAR_getChar( charaindex, CHAR_NAME) );
return nameinfo;
}
int checkIfAngel( int charaindex)
{
int i;
char nameinfo[512];
//sprintf( nameinfo, "%s:%s", CHAR_getChar( charaindex, CHAR_CDKEY), CHAR_getChar( charaindex, CHAR_NAME) );
getMissionNameInfo( charaindex, nameinfo);
for( i =0; i <MAXMISSIONTABLE; i++) {
if( missiontable[i].angelinfo[0] == NULL)
continue;
if( !strcmp( nameinfo, missiontable[i].angelinfo) ) {
return i;
}
else if( !strcmp( nameinfo, missiontable[i].heroinfo) ) {
return i;
}
}
return -1;
}
int checkIfOnlyAngel( int charaindex)
{
int i;
char nameinfo[512];
//sprintf( nameinfo, "%s:%s", CHAR_getChar( charaindex, CHAR_CDKEY), CHAR_getChar( charaindex, CHAR_NAME) );
getMissionNameInfo( charaindex, nameinfo);
for( i =0; i <MAXMISSIONTABLE; i++) {
if( missiontable[i].angelinfo[0] == NULL)
continue;
if( !strcmp( nameinfo, missiontable[i].angelinfo) ) {
return i;
}
}
return -1;
}
int checkIfOnlyHero( int charaindex)
{
int i;
char nameinfo[512];
//sprintf( nameinfo, "%s:%s", CHAR_getChar( charaindex, CHAR_CDKEY), CHAR_getChar( charaindex, CHAR_NAME) );
getMissionNameInfo( charaindex, nameinfo);
for( i =0; i <MAXMISSIONTABLE; i++) {
if( missiontable[i].angelinfo[0] == NULL)
continue;
if( !strcmp( nameinfo, missiontable[i].heroinfo) ) {
return i;
}
}
return -1;
}
int checkIfAngelByName( char* nameinfo)
{
int i;
for( i =0; i <MAXMISSIONTABLE; i++) {
if( missiontable[i].angelinfo[0] == NULL)
continue;
if( !strcmp( nameinfo, missiontable[i].angelinfo) ) {
return i;
}
else if( !strcmp( nameinfo, missiontable[i].heroinfo) ) {
return i;
}
}
return -1;
}
void addAngelData( int angelindex, int heroindex, int mission, int flag)
{
int i;
char buf[1024];
char angelinfo[512];
char heroinfo[512];
//if( checkIfAngel( angelindex) != -1 || checkIfAngel( heroindex) != -1 )
// return;
//sprintf( angelinfo, "%s:%s", CHAR_getChar( angelindex, CHAR_CDKEY), CHAR_getChar( angelindex, CHAR_NAME) );
getMissionNameInfo( angelindex, angelinfo);
//sprintf( heroinfo, "%s:%s", CHAR_getChar( heroindex, CHAR_CDKEY), CHAR_getChar( heroindex, CHAR_NAME) );
getMissionNameInfo( heroindex, heroinfo);
sprintf( buf, "%s|%s|%d|%d", angelinfo, heroinfo, mission, flag );
//saacproto_ACMissionTable_send( acfd, -1, 2, buf, angelindex);
saacproto_ACMissionTable_send( acfd, -1, 2, buf, angelinfo);
return;
}
//void selectAngel( int charaindex)
void selectAngel( int charaindex, int heroindex, int mission, int gm_cmd)
{
// gm_cmd 表示是否由GM指令產生,
//int heroindex =-1;
int findindex, startindex;
char msg[1024];
int max_char;
//int mission;
if( AngelReady <= 0 && gm_cmd == FALSE)
return;
sprintf( msg, " 使者資格檢查: %s %s ", CHAR_getChar( charaindex, CHAR_CDKEY), CHAR_getChar( charaindex, CHAR_NAME));
print( msg);
LogAngel( msg);
// 天使條件檢查
if( gm_cmd == FALSE )
{
if( checkIfAngel( charaindex) != -1) // 是否天使或勇者
{
print(" ANGEL已經是天使或勇者了 ");
return;
}
if( CHAR_getInt( charaindex, CHAR_LV) < 30 || !NPC_EventCheckFlg( charaindex, 4 ) )
{
print(" ANGEL資格不符 ");
return;
}
srand( time(NULL));
if( rand()%3 == 0 ) // 天使的機率 2/3
{
print(" ANGEL機率檢查不通過 ");
return;
}
}
print(" ANGEL決定 ");
// 挑選勇者
if( heroindex == -1 )
{
//heroindex = -1;
max_char = CHAR_getPlayerMaxNum();
startindex = RAND( 0, max_char-1);
findindex = startindex;
while(1) {
if( findindex == startindex-1) break;
findindex = (findindex+1) % max_char;
if( !CHAR_CHECKINDEX( findindex) ) continue;
if( CHAR_getInt( findindex, CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) continue;
if( findindex == charaindex ) continue;
if( checkIfAngel( findindex) != -1) continue; // 是否天使或勇者
if( CHAR_getInt( findindex, CHAR_LV) < 80 || !NPC_EventCheckFlg( findindex, 4 ) ) continue; // 勇者的條件
if( rand()%3 == 0 ) continue; // 勇者的機率 2/3
heroindex = findindex;
print(" ANGEL勇者決定 ");
break;
}
if( heroindex < 0) {
sprintf( msg, " 沒有找到勇者人選!! ");
print( msg);
//LogAngel( msg);
return;
}
}
// 決定任務
if( mission == -1 )
{
int mlist[MAXMISSION]; // 符合條件的任務列表
char eventlist[1024];
char buf[64];
int i, j, mindex =0;
memset( mlist, 0, sizeof(mlist));
for( i =0; i <MAXMISSION; i++) {
int checked =TRUE;
if( missionlist[i].id <= 0) continue;
if( CHAR_getInt( heroindex, CHAR_LV) < missionlist[i].level )
continue;
strcpy( eventlist, missionlist[i].eventflag); // 檢查必要旗標
j =0;
while(1) {
j++;
if( getStringFromIndexWithDelim( eventlist, ";", j, buf, sizeof(buf)) == FALSE )
break;
if( buf[0] != '!') { // 必要旗標或禁止旗標
if( !NPC_EventCheckFlg( heroindex, atoi(buf) )) {
checked = FALSE;
break;
}
}
else {
if( NPC_EventCheckFlg( heroindex, atoi(buf+1) )) {
checked = FALSE;
break;
}
}
}
if( checked ) {
mlist[mindex] = missionlist[i].id;
print(" mlist[%d]=%d ", mindex, mlist[mindex]);
mindex++;
}
}
if( mindex <= 0 ) {
sprintf( msg, " 找不到合適的任務 ");
print( msg);
//LogAngel( msg);
return;
}
mission = mlist[rand()%mindex];
}
addAngelData( charaindex, heroindex, mission, MISSION_WAIT_ANSWER); // 傳到AC
// 清除旗標 event8 224~255 為精靈召喚專用
CHAR_setInt( charaindex, CHAR_NOWEVENT8, 0);
CHAR_setInt( charaindex, CHAR_ENDEVENT8, 0);
CHAR_setInt( heroindex, CHAR_NOWEVENT8, 0);
CHAR_setInt( heroindex, CHAR_ENDEVENT8, 0);
if( gm_cmd == FALSE )
AngelReady = 0; // 清除缺額
{
sprintf( msg, " 產生 %s 天使候補: %s %s Lv:%d 勇者候補: %s %s Lv:%d 任務:%d ci=%d hi=%d ",
gm_cmd ? ("(GM指令)") : (" "),
CHAR_getChar( charaindex, CHAR_CDKEY), CHAR_getChar( charaindex, CHAR_NAME), CHAR_getInt( charaindex, CHAR_LV),
CHAR_getChar( heroindex, CHAR_CDKEY), CHAR_getChar( heroindex, CHAR_NAME), CHAR_getInt( heroindex, CHAR_LV),
mission, charaindex, heroindex);
print( msg);
LogAngel( msg);
}
}
void sendAngelCleanToCli( int fd)
{
lssproto_WN_send( fd, //getfdFromCharaIndex(charaindex),
WINDOW_MESSAGETYPE_ANGELMESSAGE, -1,
CHAR_WINDOWTYPE_ANGEL_CLEAN,
-1, "");
}
int AngelCreate( int angelindex)
{
int emptyitem1, emptyitem2;
int angeltokenindex, herotokenindex;
char msgbuf[1024]/*, nameinfo[1024]*/;
int mindex, mission;
char heroname[64];
if( !CHAR_CHECKINDEX( angelindex)) return FALSE;
print(" 天使答應了!! ");
mindex = checkIfAngel( angelindex);
if( mindex == -1 || missiontable[mindex].flag == MISSION_TIMEOVER ) {
//print("\n ANGEL錯誤!!Table逾時或無資料??:%d ", angelindex );
CHAR_talkToCli( angelindex, -1, "很抱歉,你太晚回答,已經逾時了。", CHAR_COLORYELLOW);
sprintf( msgbuf, " 回答逾時或無資料 i:%d 使者:%s %s ", mindex, CHAR_getChar( angelindex, CHAR_CDKEY), CHAR_getChar( angelindex, CHAR_NAME));
print( msgbuf);
LogAngel( msgbuf);
return FALSE;
}
if( missiontable[mindex].flag != MISSION_WAIT_ANSWER ) {
print(" 旗標不符:%d ", missiontable[mindex].flag);
return FALSE;
}
if( CHAR_findEmptyItemBoxNo( angelindex ) < 2 ){
CHAR_talkToCli( angelindex, -1, "空間欄位不足。至少要有兩個空道具欄位。", CHAR_COLORYELLOW);
return TRUE;
}
getStringFromIndexWithDelim( missiontable[mindex].heroinfo, ":", 2, heroname, sizeof(heroname));
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -