Files
hjha-server/base/mj_.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

339 lines
11 KiB
C#

using System;
using nativeCom;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.IO;
using MrWu.Configuration;
using System.Xml;
using Game.Data;
public class mj_ : mj {
public static mj_ instance;
protected virtual int playerCnt {
get {
return 4;
}
}
/*
[Conditional("DEBUG")]
public virtual void hufan_ut(){
//hpr fangpaonew fanidx pk.zjpos;
int hpr;
int fangpaonew;
int zjpos;
int[] fangpaos = new int[]{
-1,0,1,2,3,10,11,12,13
};
for(int i=0;i<playerCnt+1;i++){ //胡牌人
hpr = i-1;
for(int j=0;j<playerCnt;j++){ //庄家
zjpos = j;
int len = fangpaos.Length;
for(int k=0;k<len;k++){ //放炮人
fangpaonew = fangpaos[k];
tr_pack_dapai pack = new tr_pack_dapai();
tr_pack_dapai.init(ref pack);
Tr_faninfo fan = new Tr_faninfo();
Tr_faninfo.init(ref fan);
setfanidx();
int mlen = fanidx.Length;
//calFan_hupai(ref pk,
//cal_hupai(ref pack,ref fan,hpr,fangpaonew,11,1111,)
}
}
}
}
//int[count][idx][id]
/// <summary>
/// 排列组合 根据几个获取数组
/// </summary>
public int[][] pailiezuhe_count(int count){
int[][] duilie = new int[count][];
}
/// <summary>
/// 以idx开头的数组
/// </summary>
/// <param name="now"></param>
public int[] pailiezuhe_startIdx(int StartIdx,int count){
}
/// <summary>
/// 获取Startidx开头的第x个
/// </summary>
/// <param name="idx"></param>
/// <param name="StratIdx"></param>
/// <param name="count"></param>
/// <returns></returns>
public int pailiezhuhe_startIdx_idx(int idx,int StratIdx,int count){
}
*/
protected MemoryStream gzObj;
/// <summary>
/// 解析麻将子游戏规则
/// </summary>
/// <param name="now"></param>
public virtual void setZyxGz(ref tcls_mem_dll_agame now) { }
/// <summary>
/// 获取规则
/// </summary>
/// <param name="address"></param>
/// <param name="gz"></param>
unsafe protected void getGz(int address, out Tr_MJGZ gz) {
ABlock ab = new ABlock();
myCom_zyx.Instance.getDataOfStruct<ABlock>(address, ref ab, (int*)&ab);
IntPtr ptr = new IntPtr((int)ab.pt + 100);
gz = (Tr_MJGZ)Marshal.PtrToStructure(ptr, typeof(Tr_MJGZ));
}
unsafe protected void getGz(int address, ref ABlock ab, out Tr_MJGZ gz) {
IntPtr ptr = new IntPtr((int)ab.pt + 100);
gz = (Tr_MJGZ)Marshal.PtrToStructure(ptr, typeof(Tr_MJGZ));
}
/// <summary>
/// 设置规则
/// </summary>
/// <param name="now"></param>
unsafe public override void setGz(ref tcls_mem_dll_agame now, int memoryAddress) {
MrWu.Debug.Debug.Info("读取规则!");
//解析通用规则
if (now.isLibrary == 0) { //测试取测试的
//now.gz = Form2.fmSub.gzTest;
log("读取测试规则!");
return;
}
//第一步硬盘读文件
if (gzObj == null) {
string gzPath = funs.instance.getGzPath();
XmlDocument doc = new XmlDocument();
doc.Load(gzPath);
Object tmp = (Tr_MJGZ)Configuration.LoadConfiguration(typeof(Tr_MJGZ), doc.DocumentElement);
// MrWu.Debug.Debug.Log("反序列化:");
//Object tmp = baseFuntion.DeSerizeable(gzPath);
// MrWu.Debug.Debug.Log("反序列化之后!");
gzObj = baseFuntion.Serizeable(tmp);
}
now.gz = (Tr_MJGZ)baseFuntion.DeSerizeable(gzObj);
if (now.gzcs_big != null) {
string stt = "";
int len = now.gzcs_big.Length;
for (int i = 0; i < len; i++) {
stt += now.gzcs_big[i];
};
MrWu.Debug.Debug.Info("通用规则:" + stt);
//牌类型
now.gz.StyOf_Pai = (sbyte)now.gzcs_big[0];//tyGz[0].charToInt();
//1表示不能吃 2可以吃
now.gz.Not_Chi = to0(now.gzcs_big[1], now.gz.Not_Chi);
//2电脑喜欢杠
now.gz.Fan_GangPai = to0(now.gzcs_big[2], now.gz.Fan_GangPai);
//3必须自摸
if (now.gzcs_big[3] != 0) {
if (now.gzcs_big[3] == 1)
now.gz.StyOf_HuPai = 2;
else if (now.gzcs_big[3] == 2)
now.gz.StyOf_HuPai = 1;
else
now.gz.StyOf_HuPai = 0;
}
//4吃就清一色
if (now.gzcs_big[4] != 0) {
if (now.gzcs_big[4] == 1)
now.gz.chijiuqys = 1;
else if (now.gzcs_big[4] == 2)
now.gz.chijiuqys = 0;
else
now.gz.chijiuqys = 11;
}
now.gz.chijiuqys = (sbyte)now.gzcs_big[4];//.charToInt();
//5听功能
now.gz.TingStyle_ = getLast(now.gzcs_big[5], now.gz.TingStyle_);// (sbyte)(tyGz[5].charToInt() - 1);
//6牌墙蹲高
now.gz.dungaoCnt = (sbyte)now.gzcs_big[6];//.charToInt();
//8风可成阙
now.gz.ChiXi = getLast(now.gzcs_big[8], now.gz.ChiXi);// (sbyte)(tyGz[8].charToInt() - 1);
//9箭可成阙
now.gz.ChiYuan = getLast(now.gzcs_big[9], now.gz.ChiYuan);// (sbyte)(tyGz[9].charToInt() - 1);
//10加倍次数
//log("通用规则加倍次数:" + now.gz.jiabeiCnt + "," + now.gzcs_big[10]);
now.gz.jiabeiCnt = Tojiabei(now.gzcs_big[10], now.gz.jiabeiCnt);// tyGz[10].charToInt();
//11前多少张可以加倍
now.gz.jiabeichupaicnt = Tojiabei(now.gzcs_big[11], now.gz.jiabeichupaicnt);
//12听后看牌
now.gz.tinghoukanpai = getLast(now.gzcs_big[12], now.gz.tinghoukanpai);// (sbyte)(tyGz[12].charToInt() - 1);
} else {
log("没有找到通用规则!");
}
//解析前25个通用规则
if (now.gzcs_friend != null) {
int len = now.gzcs_friend.Length;
string stt = "";
for(int i=0;i<len;i++){
stt += now.gzcs_friend[i];
}
MrWu.Debug.Debug.Info("朋友房规则:" + stt);
//德国场
now.gz.fanjing968[0] = (sbyte)now.gzcs_friend[0];
//1表示不能吃 2可以吃
now.gz.Not_Chi = to0(now.gzcs_friend[1], now.gz.Not_Chi);
//2电脑喜欢杠
now.gz.Fan_GangPai = to0(now.gzcs_friend[2], now.gz.Fan_GangPai);
//3必须自摸
if (now.gzcs_friend[3] != 0) {
if (now.gzcs_friend[3] == 1)
now.gz.StyOf_HuPai = 2;
else if (now.gzcs_friend[3] == 2)
now.gz.StyOf_HuPai = 1;
else
now.gz.StyOf_HuPai = 0;
}
//4吃就清一色
if (now.gzcs_friend[4] != 0) {
if (now.gzcs_friend[4] == 1)
now.gz.chijiuqys = 1;
else if (now.gzcs_friend[4] == 2)
now.gz.chijiuqys = 0;
else
now.gz.chijiuqys = 11;
}
//5听功能
now.gz.TingStyle_ = to0(now.gzcs_friend[5], now.gz.TingStyle_);
//6无效
//7*
//8风成阙
now.gz.ChiXi = getLast(now.gzcs_friend[8], now.gz.ChiXi);
//9箭成阙
now.gz.ChiYuan = getLast(now.gzcs_friend[9], now.gz.ChiYuan);
//10加倍次数
now.gz.jiabeiCnt = Tojiabei(now.gzcs_friend[10], now.gz.jiabeiCnt);// tyGz[10].charToInt();
//11前多少张可以加倍
now.gz.jiabeichupaicnt = Tojiabei(now.gzcs_friend[11], now.gz.jiabeichupaicnt);
//12听后看牌
now.gz.tinghoukanpai = getLast(now.gzcs_friend[12], now.gz.tinghoukanpai);// (sbyte)(tyGz[12].charToInt()
//13*
//14屁胡
if (now.gzcs_friend[14] != 0) {
if (now.gzcs_friend[14] == 1) {
now.gz.pingHu_1fan[0] = 0;
now.gz.pingHu_1fan[1] = 0;
} else if (now.gzcs_friend[14] == 2) {
now.gz.pingHu_1fan[0] = 4;
now.gz.pingHu_1fan[1] = 4;
} else if (now.gzcs_friend[14] == 3) {
now.gz.pingHu_1fan[0] = 4;
now.gz.pingHu_1fan[1] = 0;
}
}
//16庄家
if (now.gzcs_friend[16] != 0) {
if (now.gzcs_friend[16] == 1) {
now.gz.lunzhuang_ = 0;
} else if (now.gzcs_friend[16] == 2) {
now.gz.lunzhuang_ = 1;
now.gz.lunzhuang_zjhp = 0;
} else if (now.gzcs_friend[16] == 3) {
now.gz.lunzhuang_ = 1;
now.gz.lunzhuang_zjhp = 1;
}
}
} else {
log("没找到子游戏规则!");
}
//解析后25个子游戏规则
setZyxGz(ref now);
if (now.gz.fanjing968[0] == 0)
now.gz.Open_JING = 0;
ABlock ab1 = new ABlock();
myCom_zyx.Instance.getDataOfStruct<ABlock>(memoryAddress, ref ab1, (int*)&ab1);
int gzSize = Marshal.SizeOf(typeof(Tr_MJGZ));
//log("规则大小:" + gzSize +"自摸方式:" + now.gz.StyOf_HuPai + ",清一色:" + now.gz.chijiuqys);
byte[] bts = new byte[gzSize];
byte[] gzdata = funs.instance.StructToBytes(now.gz);
Buffer.BlockCopy(gzdata, 0, bts, 0, gzSize);
funs.instance.memToNative_bytes(bts, ref ab1, 100);
}
/// <summary>
/// 0表示不生效 1表示可以 2表示不可以 装换成 0不可以 1可以
/// </summary>
protected sbyte to0(byte ch, int org) {
//sbyte t_sty = ch.charToInt();
if (ch == 1)
return (sbyte)ch;
if (ch == 0)
return (sbyte)org;
return 0;
}
/// <summary>
/// 获取上一个 0无效返回原值
/// </summary>
/// <returns></returns>
protected sbyte getLast(byte ch, int org) {
//sbyte t_sty = ch.charToInt();
if (ch == 0)
return (sbyte)org;
return (sbyte)(ch - 1);
}
/// <summary>
/// 加倍的转换 0无效 1不加 2加几次 转 0不加 >2加几次
/// </summary>
/// <returns></returns>
private sbyte Tojiabei(byte ch, int org) {
//sbyte t_sty = ch.charToInt();
if (ch == 0)
return (sbyte)org;
if (ch == 1)
return 0;
return (sbyte)ch;
}
}