52 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			52 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | #pragma once
 | ||
|  | #include "squirrel.h"
 | ||
|  | #include "sqstdaux.h"
 | ||
|  | #include "sqstdblob.h"
 | ||
|  | #include "sqstdio.h"
 | ||
|  | #include "sqstdmath.h"
 | ||
|  | #include "sqstdstring.h"
 | ||
|  | #include "sqstdsystem.h"
 | ||
|  | #include <iostream>
 | ||
|  | 
 | ||
|  | template <typename R, typename A, typename... ARG> | ||
|  | R CallDungeon(A call_addr, const ARG... arguments) | ||
|  | { | ||
|  |     if (!call_addr) | ||
|  |     { | ||
|  |         return R(); | ||
|  |     } | ||
|  |     const auto control = reinterpret_cast<R (*)(ARG...)>(call_addr); | ||
|  |     try | ||
|  |     { | ||
|  |         return control(arguments...); | ||
|  |     } | ||
|  |     catch (...) | ||
|  |     { | ||
|  |     } | ||
|  |     return R(); | ||
|  | } | ||
|  | 
 | ||
|  | // 获取副本编号
 | ||
|  | static SQInteger Dungeon_GetIdex(HSQUIRRELVM v) | ||
|  | { | ||
|  |     SQUserPointer P; | ||
|  |     sq_getuserpointer(v, 2, &P); | ||
|  |     SQInteger Idx = CallDungeon<int>(0x80FDCF0, P); | ||
|  |     sq_pushinteger(v, Idx); | ||
|  |     return 1; | ||
|  | } | ||
|  | 
 | ||
|  | static SQInteger register_Dungeon_func(HSQUIRRELVM v, SQFUNCTION f, const char *fname) | ||
|  | { | ||
|  |     sq_pushroottable(v); | ||
|  |     sq_pushstring(v, fname, -1); | ||
|  |     sq_newclosure(v, f, 0); // create a new function
 | ||
|  |     sq_newslot(v, -3, SQFalse); | ||
|  |     sq_pop(v, 1); // pops the root table
 | ||
|  | } | ||
|  | 
 | ||
|  | static void RegisterDungeon(HSQUIRRELVM v) | ||
|  | { | ||
|  |     // 获取编号
 | ||
|  |     register_Dungeon_func(v, Dungeon_GetIdex, _SC("Sq_Dungeon_GetIdex")); | ||
|  | } |