chuyiwen_gmsv/mylua/battlebase.c
chuyiwen bea5ac05b3 sq_gmsv_chuyiwen
sa_sever
2016-12-24 09:45:52 +09:00

262 lines
6.2 KiB
C

#include <string.h>
#include "version.h"
#include "char_base.h"
#include "enemy.h"
#include "object.h"
#include "char.h"
#include "lssproto_serv.h"
#include "battle.h"
#include "battle_command.h"
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
#include "mylua/mylua.h"
#include "mylua/base.h"
#ifdef _ALLBLUES_LUA
static int CreateVsEnemy (lua_State *L)
{
const int charaindex = luaL_checkint(L, 1);
const int npcindex = luaL_checkint(L, 2);
int enemytable[11];
int i;
for( i = 0; i < 11; i ++ ) {
enemytable[i] = -1;
}
luaL_checktype(L, 3, LUA_TTABLE);
int n = luaL_getn(L, 3);
int id = 0;
for(i = 0; i < n; i++){
int enemyid = getArrayInt(L, i);
int curEnemy = ENEMY_getEnemyArrayFromId( enemyid );
if( ENEMY_CHECKINDEX( curEnemy) ) {
enemytable[id++] = curEnemy;
}else{
enemytable[i] = -1;
}
}
int ret = BATTLE_CreateVsEnemyNew(charaindex, npcindex, enemytable);
if( ret == 0 ) {
if(npcindex>-1){
CHAR_setWorkInt( npcindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_INIT );
CHAR_sendBattleEffect( npcindex, ON);
}
lua_pushinteger(L, CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEINDEX));
return 1;
}else{
return 0;
}
}
static int getCharOne(lua_State *L)
{
const int battle = luaL_checkint(L, 1);
const int num = luaL_checkint(L, 2);
const int side = luaL_checkint(L, 3);
lua_pushinteger(L, BattleArray[battle].Side[side].Entry[num].charaindex);
return 1;
}
#ifdef _ALLBLUES_LUA_1_4
static CharBase BattleBaseEvent[] = {
{{"½áÊøʼþ"}, BATTLE_FINISH}
,{{"ÌÓÅÜʼþ"}, BATTLE_ESCAPE}
};
static int CreateRandVsPlayer (lua_State *L)
{
const int floorid = luaL_checkint(L, 1);
int charaindex1 = -1, charaindex2 = -1;
int num = 0;
int i = 0;
int playernum = CHAR_getPlayerMaxNum();
for (i = 0; i < playernum; i++){
if (CHAR_getCharUse(i) == FALSE) continue;
if ( !CHAR_CHECKINDEX( i ) )continue;
if ( CHAR_getInt( i, CHAR_FLOOR ) == floorid ) {
if (CHAR_getWorkInt(i, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE){
if(charaindex1 == -1){
charaindex1 = i;
}else{
charaindex2 = i;
}
if(CHAR_CHECKINDEX( charaindex1 ) && CHAR_CHECKINDEX( charaindex2 ) ){
BATTLE_CreateVsPlayer(charaindex1, charaindex2);
num ++;
}
}
}
}
lua_pushinteger(L, num);
return 1;
}
static int CreateVsPlayer(lua_State *L)
{
const int charaindex1 = luaL_checkint(L, 1);
const int charaindex2 = luaL_checkint(L, 2);
if(CHAR_CHECKINDEX( charaindex1 ) && CHAR_CHECKINDEX( charaindex2 ) ){
if( CHAR_getWorkInt( charaindex1, CHAR_WORKBATTLEMODE ) == BATTLE_CHARMODE_NONE
&& CHAR_getWorkInt( charaindex2, CHAR_WORKBATTLEMODE ) == BATTLE_CHARMODE_NONE ){
if(BATTLE_CreateVsPlayer(charaindex1, charaindex2) == 0){
lua_pushinteger(L, CHAR_getWorkInt( charaindex1, CHAR_WORKBATTLEINDEX));
return 1;
}
}
}
lua_pushinteger(L, -1);
return 1;
}
static int setLUAFunctionPointer(lua_State *L)
{
size_t l;
const int battleindex = luaL_checkint(L, 1);
const int functype = getCharBaseValue(L, 2, BattleBaseEvent, arraysizeof(BattleBaseEvent));
char *luafunctable=luaL_checklstring(L, 3, &l);
BATTLE_setLUAFunction(battleindex, functype, L, luafunctable);
return 1;
}
static int WatchEntry(lua_State *L)
{
const int meindex = luaL_checkint(L, 1);
const int toindex = luaL_checkint(L, 2);
BATTLE_WatchEntry(meindex, toindex);
return 1;
}
static int NewEntry(lua_State *L)
{
const int charaindex = luaL_checkint(L, 1);
const int battleindex = luaL_checkint(L, 2);
const int side = luaL_checkint(L, 3);
int fd = getfdFromCharaIndex(charaindex);
int iRet = BATTLE_NewEntry(charaindex, battleindex, side);
if( iRet == 0 ){
CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_RESCUE );
iRet = BATTLE_PetDefaultEntry(
charaindex,
battleindex,
side
);
}
if( iRet == 0 ){
int flg;
if( CHAR_getInt( charaindex, CHAR_DEFAULTPET ) >= 0 ){
int pindex = CHAR_getCharPet( charaindex, CHAR_getInt( charaindex, CHAR_DEFAULTPET ) );
CHAR_setWorkInt( pindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_RESCUE );
}
if( fd != -1 ){
lssproto_EN_send( fd, BattleArray[battleindex].type, BattleArray[battleindex].field_no );
}
flg = (BattleArray[battleindex].Side[side].flg & BSIDE_FLG_HELP_OK)? TRUE:FALSE;
lssproto_HL_send( fd, flg);
char szBuffer[256];
sprintf( szBuffer, "BP|%X|%X|%X",
BATTLE_Index2No( battleindex, charaindex ), BP_FLG_JOIN, CHAR_getInt(charaindex, CHAR_MP ) );
BATTLE_CommandSend( charaindex, szBuffer );
lua_pushinteger(L, 1);
}else{
if( fd != -1 ){
lssproto_EN_send( fd, FALSE, BattleArray[battleindex].field_no );
}
lua_pushinteger(L, 0);
}
return 1;
}
#endif
#ifdef _ALLBLUES_LUA_1_9
static int CreateForWatcher(lua_State *L)
{
const int meindex = luaL_checkint(L, 1);
const int baatleindex = luaL_checkint(L, 2);
BATTLE_CreateForWatcher(meindex, baatleindex);
return 1;
}
static int checkindex(lua_State *L)
{
const int baatleindex = luaL_checkint(L, 1);
lua_pushinteger(L, BATTLE_CHECKINDEX(baatleindex));
return 1;
}
static int getType(lua_State *L)
{
const int baatleindex = luaL_checkint(L, 1);
lua_pushinteger(L, BATTLE_getType(baatleindex));
return 1;
}
#ifdef _BATTLE_TIMESPEED
static int getCreateTime(lua_State *L)
{
const int baatleindex = luaL_checkint(L, 1);
lua_pushinteger(L, BATTLE_getCreateTime(baatleindex));
return 1;
}
#endif
static int getBattleFloor(lua_State *L)
{
const int baatleindex = luaL_checkint(L, 1);
lua_pushinteger(L, BATTLE_getBattleFloor(baatleindex));
return 1;
}
#endif
static const luaL_Reg battlelib[] = {
{"CreateVsEnemy", CreateVsEnemy},
{"getCharOne", getCharOne},
#ifdef _ALLBLUES_LUA_1_4
{"CreateRandVsPlayer", CreateRandVsPlayer},
{"CreateVsPlayer", CreateVsPlayer},
{"setLUAFunctionPointer", setLUAFunctionPointer},
{"WatchEntry", WatchEntry},
{"NewEntry", NewEntry},
#endif
#ifdef _ALLBLUES_LUA_1_9
{"CreateForWatcher", CreateForWatcher},
{"checkindex", checkindex},
{"getType", getType},
#ifdef _BATTLE_TIMESPEED
{"getCreateTime", getCreateTime},
#endif
{"getBattleFloor", getBattleFloor},
#endif
{NULL, NULL}
};
LUALIB_API int luaopen_Battle (lua_State *L) {
luaL_register(L, "battle", battlelib);
return 1;
}
#endif