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"));
							 | 
						||
| 
								 | 
							
								}
							 |