Files
hjha-server/base/mj_base.cs
xiaoou e9616125ce feat: initial commit - HJHA game server full source
6 major server modules (PdkFriendServer/GlobalSever/ServerCore/GameModule/GameNetModule) +
game logic (GameFix/GameDAL/ServerData) +
network layer (NetWorkMessage) +
data layer (ObjectModel) +
utilities (MrWu/Core/Config/CloudAPI/dll) +
adapters (zyxAdapter/base)

.NET 8.0 C# solution, 16 projects, 958 source files
2026-07-07 12:02:15 +08:00

396 lines
11 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using nativeCom;
using zyxAdapter;
using Game.Data;
[StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi/*,Pack=1*/)]
public struct strDataChange{
[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]
public int[] dowhat;//0
public int askCnt;//1
[MarshalAs(UnmanagedType.ByValArray,SizeConst=1000)]
public int[] ask;//2
public int rltCnt;//3
[MarshalAs(UnmanagedType.ByValArray,SizeConst=1000)]
public int[] rlt;//4
[MarshalAs(UnmanagedType.ByValArray,SizeConst=1000)]
public sbyte[] ask_bts;//5
[MarshalAs(UnmanagedType.ByValArray,SizeConst=1000)]
public byte[] rlt_bts;//6
}
[Serializable]
[StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi/*,Pack=1*/)]
public struct Tr_Paixing_z1{
[MarshalAs(UnmanagedType.ByValArray,SizeConst=5)]
public Tr_Que pq;
public Tr_Dui dui;
}
[Serializable]
[StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi/*,Pack=1*/)]
public struct Tr_Paixing_z2{
[MarshalAs(UnmanagedType.ByValArray,SizeConst=7)]
public Tr_Dui dui7;
}
[Serializable]
[StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi/*,Pack=1*/)]
public struct Tr_Paixing {
[MarshalAs(UnmanagedType.ByValArray,SizeConst=20)]
public byte[] bak;
public byte UseJing;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=22)]
public Tr_Pai[] Pai_StrAll; //全部牌含杠第4张
public sbyte PaiCntAll; //全部牌数量
[MarshalAs(UnmanagedType.ByValArray,SizeConst=18)]
public sbyte[] str_Pai; //手牌+零牌 居然没用上??? 1下标开始
public int TingCount;//听数量
[MarshalAs(UnmanagedType.ByValArray,SizeConst=17)]
public TTing[] TingArr;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=3)]
public sbyte[] JingCnt; //正、副精,全部精
public int LX ;//-1不听 0听牌 >0胡牌[1平和 2七小队 3十三烂 4国士无双 8标准烂147 258 369]
// 1: (pq: Tr_Ques; dui: Tr_Dui);
// 2: (dui7: array[0..6] of Tr_Dui); //由大到小
// //3十三烂
// //4国士无双
// //8标准烂 147 258 369
}
[Serializable]
[StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi/*,Pack=1*/)]
public struct tcls_mem_dll_agame{//麻将参数----每次开局
public int a;
public Tr_MJGZ gz;
public sbyte isLibrary;//0exe测试 1网络DLL
public sbyte isSifang;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=50)]
public byte[] gzcs_big; //前50个通用
[MarshalAs(UnmanagedType.ByValArray,SizeConst=50)]
public byte[] gzcs_friend;//: array[0..49] of Byte;
}
[Serializable]
[StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi/*,Pack=1*/)]
public struct tcls_mem_dll_main{//宿主麻将参数---初始化一次
public int a;
}
[Serializable]
[StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi/*,Pack=1*/)]
public struct tcls_mem_dll {//麻将参数---初始化一次
public int huFanCnt;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=100)]
public int[] huFan_idx;
public int hufanCnt_changeBase; //0..99 哪些被DLL替换了 ********新增
[MarshalAs(UnmanagedType.ByValArray,SizeConst=40)]
public int[] hupan_dll_changeBase;
static public void init(ref tcls_mem_dll t){
t.huFan_idx=new int[100];
t.hupan_dll_changeBase=new int[40];
}
}
[Serializable]
[StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi/*,Pack=1*/)]
public struct tcls_mem_dll_main_agame{//宿主麻将参数---每次开局
public int a;
public Tr_MJGZ gz;
}
public class mjbase{
public tcls_mem_dll cs_dll;//DLL参数
public tcls_mem_dll_main cs_main;//主参数
private tcls_mem_dll_agame cs_dll_agame;//DLL参数
public tcls_mem_dll_main_agame cs_main_agame;//主参数
public int[] fanidx;
/// <summary>
/// 所有牌
/// </summary>
public static readonly byte[] paiAll = new byte[]{
11,12,13,14,15,16,17,18,19,
31,32,33,34,35,36,37,38,39,
51,52,53,54,55,56,57,58,59,
71,72,73,74,77,78,79
};
/// <summary>
/// 根据牌拿位置
/// </summary>
/// <param name="pai"></param>
/// <returns></returns>
public int getPaiIdx(int pai){
int shi = pai / 10;
if(shi < 7)
return shi/2*9+pai%10-1;
int len = paiAll.Length;
for(int i=27;i<len;i++){
if(paiAll[i] == pai)
return i;
}
log("大错误" + pai);
return 0;
}
strDataChange dc=new strDataChange();
ABlock ab_mjfun=new ABlock();
unsafe int*[] intptr_dc=new int*[10];
/// <summary>
/// 胡牌修正
/// </summary>
/// <param name="pk"></param>
/// <param name="fan"></param>
/// <param name="hpr"></param>
/// <param name="fangpaonew"></param>
/// <param name="lingpai"></param>
unsafe public virtual void cal_hupai(ref tr_pack_dapai pk,ref Tr_faninfo fan,int hpr,int fangpaonew,int lingpai,int memoryAddress,int style/*0表示汇总前的修正 1表示汇总后的修正*/){
}
/// <summary>
/// 计算胡番 奖励番 及胡的类型
/// </summary>
/// <param name="pk"></param>
/// <param name="px"></param>
/// <param name="addr_pxz"></param>
/// <param name="fan"></param>
/// <param name="hpr"></param>
/// <param name="fangpaonew"></param>
/// <param name="lingpai"></param>
unsafe public virtual void calFan_hupai(ref tr_pack_dapai pk,ref Tr_Paixing px,IntPtr addr_pxz,ref Tr_faninfo fan,int hpr,int fangpaonew,int lingpai,int memoryAddress){
}
/// <summary>
/// 补充小番种 100..199
/// </summary>
/// <param name="pk"></param>
/// <param name="px"></param>
/// <param name="fanIdx 番索引"></param>
/// <param name="hpr 谁"></param>
unsafe public virtual int calFan_world(ref tr_pack_dapai pk,ref Tr_Paixing px,int fanIdx,int hpr){
int r= -4444; //这是取底层
return r;
if (fanIdx>99)r=0; //这是我要计算的
else
//这是覆盖底层
switch(r){
case 20:r=0;
case 34:r=0;
break;
}
return r;
}
public unsafe virtual void sendPackFunc(ref tr_pack_dapai pk,int address){}
/// <summary>
/// AI出牌
/// </summary>
/// <param name="pk"></param>
/// <returns></returns>
public virtual int chupai(ref tr_pack_dapai pk){
return -1;
}
public void log(string str){
dcEvent_zyx.Instance.log(str);
}
/// <summary>
/// 设置番idx
/// </summary>
public virtual void setfanidx(){
}
/// <summary>
/// 设置规则
/// </summary>
/// <param name="now"></param>
public virtual void setGz(ref tcls_mem_dll_agame now,int memoryAddress){
}
unsafe public int initDll_agame(ref tcls_mem_dll_main_agame cs_main_,ref tcls_mem_dll_agame cs_dll_,ref ABlock ab,int memoryAddress) {
cs_main_agame=cs_main_;
cs_dll_agame=cs_dll_;
//cs_dll_agame.gz = cs_main_.gz;
//log("设置西啊伤心啊上半场卡号");
setGz(//ref cs_main_agame.gz,
ref cs_dll_agame,memoryAddress);
log("xxxss "+cs_dll_agame.gz.dungaoCnt+" "+ab.len+" "+cs_main_agame.gz.dungaoCnt+" "+cs_main_agame.gz.score_gang_jing[1]);
funs.instance.memToNative_bytes(funs.instance.StructToBytes(cs_dll_agame),ref ab,0);
//log("sdlkjf029384");
return 1;
}
unsafe void fixpt(){
fixed(int* ppp=&dc.dowhat[0]){
intptr_dc[0]=ppp;
}
fixed(int* ppp=&dc.askCnt){
intptr_dc[1]=ppp;
}
fixed(int* ppp=&dc.ask[0]){
intptr_dc[2]=ppp;
}
fixed(int* ppp=&dc.rltCnt){
intptr_dc[3]=ppp;
}
fixed(int* ppp=&dc.rlt[0]){
intptr_dc[4]=ppp;
}
fixed(sbyte* ppp=&dc.ask_bts[0]){
intptr_dc[5]=(int*)ppp;
}
fixed(byte* ppp=&dc.rlt_bts[0]){
intptr_dc[6]=(int*)ppp;
}
}
unsafe public int initDll(ref tcls_mem_dll_main cs_main_,ref tcls_mem_dll cs_dll_,ref ABlock ab,int addr_mj) {
addr_mjfun=addr_mj;
dc.ask=new int[1000];
dc.rlt=new int[1000];
dc.dowhat=new int[8];
dc.ask_bts=new sbyte[1000];
dc.rlt_bts=new byte[1000];
fixpt();
ab_mjfun.pt=(int*)addr_mjfun;
cs_main=cs_main_;
cs_dll=cs_dll_;
setfanidx();
Buffer.BlockCopy(fanidx,0,cs_dll.huFan_idx,0,fanidx.Length<<2);
cs_dll.huFanCnt=fanidx.Length;
funs.instance.memToNative_bytes(funs.instance.StructToBytes(cs_dll),ref ab,0);
// byte[] bt=funs.instance.StructToBytes(cs_dll);
// int* addr=myCom_zyx.Instance.getPointerOfBytes(bt);
// myCom_zyx.Instance.move2Process(addr,new IntPtr( ab.pt),bt.Length);
mainDo("测试",new int[]{5,6},new sbyte[]{31,54});
log("ceshi..."+getvalue_int(0)+" "+getvalue_byte(3));
return cs_dll.huFanCnt;
}
public int getvalue_int(int idx){
return dc.rlt[idx];
}
public int[] getvalue_intArr(int idx,int len){
if (idx==-1)
return dc.rlt;else
{
int[] r=new int[len];
Array.Copy(dc.rlt,idx,r,0,len);
return r;
}
}
public byte getvalue_byte(int idx){
return dc.rlt_bts[idx];
}
public byte[] getvalue_byteArr(int idx,int len){
if(idx==-1)return dc.rlt_bts;else
{
byte[] r=new byte[len];
Array.Copy(dc.rlt_bts,idx,r,0,len);
return r;
}
}
protected int addr_mjfun;//宿主mjfun
unsafe protected void mainDo(string str, int[] ask,sbyte[] bts){
int[] dow=new int[8];
switch(str){
case "测试": dow[0]=0; break;
case "门清": dow[0]=1; break;
case "零牌": dow[0]=2; break;
case "零牌类型": dow[0]=3; break;//零牌类型 0自摸 1放炮
case "垃圾牌":dow[0]=10;break;
case "剩余牌":dow[0]=11;break;
case "钱娄子": dow[0]=50;break;
case "临时番": dow[0]=51;break;
case "上把庄家":dow[0]=52;break;
case "庄家座位":dow[0]=53;break;
case "庄家":dow[0]=54;break;
case "增加杠":dow[0]=55;break;
case "删除杠":dow[0]=56;break;
case "牌是否杠":dow[0]=57;break;
}
Array.Copy(dow,dc.dowhat,dow.Length);
if(ask!=null)
Array.Copy(ask,dc.ask,ask.Length);
if( bts!=null)
Array.Copy(bts,dc.ask_bts,bts.Length);
//
ab_mjfun.sty=56;
ab_mjfun.len=678;
ABlock xb=new ABlock();
xb.pt=null;
string sx="";
string rlt=null;//!!!
tr_rltpchar sdfsdf=new tr_rltpchar ();
//fixpt();
int len=intptr_dc.Length;
for(int i=0;i<len;i++)sx+= ((int)(int*)intptr_dc[i]).ToString()+'^';
dcEvent_zyx.Instance.TestGameFun(
// myCom_zyx.Instance. doMsgNative_(
"1",
//new int*[]{ intptr_dc[0],intptr_dc[1], intptr_dc[2],intptr_dc[3],intptr_dc[4],intptr_dc[5]}
sx // intptr_dc
,ref sdfsdf
,ref ab_mjfun ,ref xb);
rlt=null;//!!!!
}
}