304 lines
7.2 KiB
C
304 lines
7.2 KiB
C
![]() |
#include <string.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include "char.h"
|
|||
|
#include "object.h"
|
|||
|
#include "readmap.h"
|
|||
|
#include "map_deal.h"
|
|||
|
#include "char_base.h"
|
|||
|
#include "mylua/base.h"
|
|||
|
#include "lua.h"
|
|||
|
#include "lauxlib.h"
|
|||
|
#include "lualib.h"
|
|||
|
#include "lssproto_serv.h"
|
|||
|
|
|||
|
#ifdef _ALLBLUES_LUA
|
|||
|
#ifdef _ALLBLUES_LUA_1_1
|
|||
|
static int RandMap(lua_State *L)
|
|||
|
{
|
|||
|
lua_pushinteger(L, MAP_getfloorId(rand()% MAP_getMapNum()));
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
static int RandXAndY(lua_State *L)
|
|||
|
{
|
|||
|
const int ff = luaL_checkint(L, 1);
|
|||
|
int fx,fy;
|
|||
|
int i;
|
|||
|
for(i=0;i<50;i++){
|
|||
|
fx = rand() % MAP_getfloorX(ff);
|
|||
|
fy = rand() % MAP_getfloorY(ff);
|
|||
|
#ifdef _ITEM_PATH
|
|||
|
if(MAP_walkAbleFromPoint( ff,fx,fy,0, -1)==TRUE){
|
|||
|
lua_pushinteger(L, (fx << 16)|fy );
|
|||
|
return 1;
|
|||
|
}
|
|||
|
#else
|
|||
|
if(MAP_walkAbleFromPoint( ff,fx,fy,0)==TRUE){
|
|||
|
lua_pushinteger(L, (fx << 16)|fy );
|
|||
|
return 1;
|
|||
|
}
|
|||
|
#endif
|
|||
|
}
|
|||
|
lua_pushinteger(L, -1);
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
static int getX(lua_State *L)
|
|||
|
{
|
|||
|
const int XandY = luaL_checkint(L, 1);
|
|||
|
lua_pushinteger(L, (XandY >> 16)&0xFFFF );
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
static int getY(lua_State *L)
|
|||
|
{
|
|||
|
const int XandY = luaL_checkint(L, 1);
|
|||
|
lua_pushinteger(L, XandY&0xFFFF );
|
|||
|
return 1;
|
|||
|
}
|
|||
|
static int getfloorX(lua_State *L)
|
|||
|
{
|
|||
|
const int floorid = luaL_checkint(L, 1);
|
|||
|
lua_pushinteger(L, MAP_getfloorX(floorid) );
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
static int getfloorY(lua_State *L)
|
|||
|
{
|
|||
|
const int floorid = luaL_checkint(L, 1);
|
|||
|
lua_pushinteger(L, MAP_getfloorY(floorid) );
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
static int getFrontTile(lua_State *L)
|
|||
|
{
|
|||
|
const int charaindex = luaL_checkint(L, 1);
|
|||
|
|
|||
|
int dir, ff, fx, fy;
|
|||
|
int tile, obj;
|
|||
|
int fixtile, fixobj;
|
|||
|
char buf[16];
|
|||
|
|
|||
|
ff = CHAR_getInt( charaindex, CHAR_FLOOR );
|
|||
|
fx = CHAR_getInt( charaindex, CHAR_X );
|
|||
|
fy = CHAR_getInt( charaindex, CHAR_Y );
|
|||
|
dir = CHAR_getInt( charaindex, CHAR_DIR );
|
|||
|
|
|||
|
fx += CHAR_getDX(dir);
|
|||
|
fy += CHAR_getDY(dir);
|
|||
|
|
|||
|
if( MAP_getTileAndObjData( ff, fx, fy, &tile, &obj) == FALSE ){
|
|||
|
lua_pushstring(L, 0);
|
|||
|
return 1;
|
|||
|
}
|
|||
|
lua_pushinteger(L, tile );
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
static int getFloorName(lua_State *L)
|
|||
|
{
|
|||
|
const int floorid = luaL_checkint(L, 1);
|
|||
|
|
|||
|
char escapeshowstring[256];
|
|||
|
char *showstr = MAP_getfloorShowstring(floorid);
|
|||
|
|
|||
|
getStringFromIndexWithDelim( showstr, "|", 1, escapeshowstring, sizeof( escapeshowstring));
|
|||
|
|
|||
|
lua_pushstring(L, escapeshowstring);
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
static int getCharaindex(lua_State *L)
|
|||
|
{
|
|||
|
const int charaindex = luaL_checkint(L, 1);
|
|||
|
const int distance = luaL_checkint(L, 2);
|
|||
|
const int type = luaL_checkint(L, 3);
|
|||
|
|
|||
|
int fl ,x,y;
|
|||
|
OBJECT object;
|
|||
|
fl = CHAR_getInt(charaindex,CHAR_FLOOR);
|
|||
|
int i;
|
|||
|
for(i=1; i <=distance; i ++)
|
|||
|
{
|
|||
|
CHAR_getCoordinationDir( CHAR_getInt(charaindex,CHAR_DIR),
|
|||
|
CHAR_getInt(charaindex,CHAR_X),
|
|||
|
CHAR_getInt(charaindex,CHAR_Y),
|
|||
|
i, &x, &y );
|
|||
|
|
|||
|
for( object=MAP_getTopObj(fl,x,y) ; object ;
|
|||
|
object = NEXT_OBJECT(object) ){
|
|||
|
int objindex = GET_OBJINDEX(object);
|
|||
|
// printf("\ntype=%d objindex=%d chartype=%d",OBJECT_getType(objindex),objindex,CHAR_getInt( OBJECT_getIndex(objindex), CHAR_WHICHTYPE));
|
|||
|
if( OBJECT_getType(objindex) == OBJTYPE_CHARA ){
|
|||
|
if( CHAR_getInt( OBJECT_getIndex(objindex), CHAR_WHICHTYPE) == type){
|
|||
|
lua_pushinteger(L, OBJECT_getIndex(objindex));
|
|||
|
return 1;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
lua_pushinteger(L, -1);
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
static int getCharaNearBy(lua_State *L) {
|
|||
|
const int charaindex = luaL_checkint(L, 1);
|
|||
|
const int area = luaL_checkint(L, 2);
|
|||
|
const int type = luaL_checkint(L, 3);
|
|||
|
|
|||
|
|
|||
|
lua_newtable(L); //<2F>½<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ջ<EFBFBD><D5BB>
|
|||
|
lua_pushnumber(L,-1); //<2F><><EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>У<EFBFBD>û<EFBFBD>㶮Ϊʲô<CAB2><C3B4>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>У<EFBFBD>lua<75>л<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݾͻ<DDBE><CDBB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
lua_rawseti(L,-2,0);
|
|||
|
|
|||
|
int o, chara_index;
|
|||
|
int getnum = 0;
|
|||
|
int fl, x, y;
|
|||
|
OBJECT object;
|
|||
|
int i,j;
|
|||
|
fl = CHAR_getInt(charaindex, CHAR_FLOOR);
|
|||
|
x = CHAR_getInt(charaindex, CHAR_X);
|
|||
|
y = CHAR_getInt(charaindex, CHAR_Y);
|
|||
|
for (i = y - area; i <= y + area; i++) {
|
|||
|
for (j = x - area; j <= x + area; j++) {
|
|||
|
for (object = MAP_getTopObj(fl, j, i); object; object =
|
|||
|
NEXT_OBJECT(object)) {
|
|||
|
o = GET_OBJINDEX(object);
|
|||
|
if (OBJECT_getType(o) == OBJTYPE_CHARA) {
|
|||
|
chara_index = OBJECT_getIndex(o);
|
|||
|
if (CHAR_CHECKINDEX(chara_index) == FALSE)
|
|||
|
continue;
|
|||
|
if ( CHAR_getInt(chara_index, CHAR_WHICHTYPE)
|
|||
|
!= type)
|
|||
|
continue;
|
|||
|
if (chara_index == charaindex)
|
|||
|
continue; //<2F>ҵ<EFBFBD><D2B5>Լ<EFBFBD><D4BC><EFBFBD>
|
|||
|
|
|||
|
lua_pushinteger(L,chara_index);
|
|||
|
getnum++;
|
|||
|
lua_rawseti(L,-2,getnum);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
static int getCharaAhead(lua_State *L) {
|
|||
|
const int charaindex = luaL_checkint(L, 1);
|
|||
|
const int distance = luaL_checkint(L, 2);
|
|||
|
const int area = luaL_checkint(L, 3);
|
|||
|
const int type = luaL_checkint(L, 4);
|
|||
|
|
|||
|
|
|||
|
lua_newtable(L); //<2F>½<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ջ<EFBFBD><D5BB>
|
|||
|
lua_pushnumber(L,-1); //<2F><><EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>У<EFBFBD>û<EFBFBD>㶮Ϊʲô<CAB2><C3B4>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>У<EFBFBD>lua<75>л<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݾͻ<DDBE><CDBB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
lua_rawseti(L,-2,0);
|
|||
|
|
|||
|
int o, chara_index;
|
|||
|
int getnum = 0;
|
|||
|
int fl, x, y;
|
|||
|
OBJECT object;
|
|||
|
int i,j;
|
|||
|
fl = CHAR_getInt(charaindex, CHAR_FLOOR);
|
|||
|
|
|||
|
CHAR_getCoordinationDir( CHAR_getInt(charaindex,CHAR_DIR),
|
|||
|
CHAR_getInt(charaindex,CHAR_X),
|
|||
|
CHAR_getInt(charaindex,CHAR_Y),
|
|||
|
distance, &x, &y );
|
|||
|
|
|||
|
|
|||
|
for (i = y - area; i <= y + area; i++) {
|
|||
|
for (j = x - area; j <= x + area; j++) {
|
|||
|
for (object = MAP_getTopObj(fl, j, i); object; object =
|
|||
|
NEXT_OBJECT(object)) {
|
|||
|
o = GET_OBJINDEX(object);
|
|||
|
if (OBJECT_getType(o) == OBJTYPE_CHARA) {
|
|||
|
chara_index = OBJECT_getIndex(o);
|
|||
|
if (CHAR_CHECKINDEX(chara_index) == FALSE)
|
|||
|
continue;
|
|||
|
if ( CHAR_getInt(chara_index, CHAR_WHICHTYPE)
|
|||
|
!= type)
|
|||
|
continue;
|
|||
|
if (chara_index == charaindex)
|
|||
|
continue; //<2F>ҵ<EFBFBD><D2B5>Լ<EFBFBD><D4BC><EFBFBD>
|
|||
|
|
|||
|
lua_pushinteger(L,chara_index);
|
|||
|
getnum++;
|
|||
|
lua_rawseti(L,-2,getnum);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
static int getCharaByCoord(lua_State *L) {
|
|||
|
const int charaindex = luaL_checkint(L, 1);
|
|||
|
const int fl = luaL_checkint(L, 2);
|
|||
|
const int x = luaL_checkint(L, 3);
|
|||
|
const int y = luaL_checkint(L, 4);
|
|||
|
const int area = luaL_checkint(L, 5);
|
|||
|
const int type = luaL_checkint(L, 6);
|
|||
|
|
|||
|
lua_newtable(L); //<2F>½<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ջ<EFBFBD><D5BB>
|
|||
|
lua_pushnumber(L,-1); //<2F><><EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>У<EFBFBD>û<EFBFBD>㶮Ϊʲô<CAB2><C3B4>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>У<EFBFBD>lua<75>л<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݾͻ<DDBE><CDBB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
lua_rawseti(L,-2,0);
|
|||
|
|
|||
|
int o, chara_index;
|
|||
|
int getnum = 0;
|
|||
|
OBJECT object;
|
|||
|
int i,j;
|
|||
|
for (i = y - area; i <= y + area; i++) {
|
|||
|
for (j = x - area; j <= x + area; j++) {
|
|||
|
for (object = MAP_getTopObj(fl, j, i); object; object =
|
|||
|
NEXT_OBJECT(object)) {
|
|||
|
o = GET_OBJINDEX(object);
|
|||
|
if (OBJECT_getType(o) == OBJTYPE_CHARA) {
|
|||
|
chara_index = OBJECT_getIndex(o);
|
|||
|
if (CHAR_CHECKINDEX(chara_index) == FALSE)
|
|||
|
continue;
|
|||
|
if ( CHAR_getInt(chara_index, CHAR_WHICHTYPE)
|
|||
|
!= type)
|
|||
|
continue;
|
|||
|
if (chara_index == charaindex)
|
|||
|
continue; //<2F>ҵ<EFBFBD><D2B5>Լ<EFBFBD><D4BC><EFBFBD>
|
|||
|
|
|||
|
lua_pushinteger(L,chara_index);
|
|||
|
getnum++;
|
|||
|
lua_rawseti(L,-2,getnum);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
static const luaL_Reg maplib[] = {
|
|||
|
{"RandMap", RandMap},
|
|||
|
{"RandXAndY", RandXAndY},
|
|||
|
{"getfloorX", getfloorX},
|
|||
|
{"getfloorY", getfloorY},
|
|||
|
{"getFloorName", getFloorName},
|
|||
|
{"getX", getX},
|
|||
|
{"getY", getY},
|
|||
|
{"getCharaindex", getCharaindex},
|
|||
|
{"getCharaNearBy", getCharaNearBy},
|
|||
|
{"getCharaAhead", getCharaAhead},
|
|||
|
{"getCharaByCoord", getCharaByCoord},
|
|||
|
{"getFrontTile",getFrontTile},
|
|||
|
{NULL, NULL}
|
|||
|
};
|
|||
|
|
|||
|
LUALIB_API int luaopen_Map (lua_State *L) {
|
|||
|
luaL_register(L, "map", maplib);
|
|||
|
return 1;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
#endif
|
|||
|
|