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; /// /// 所有牌 /// 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 }; /// /// 根据牌拿位置 /// /// /// 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 /// 胡牌修正 /// /// /// /// /// /// 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表示汇总后的修正*/){ } /// /// 计算胡番 奖励番 及胡的类型 /// /// /// /// /// /// /// /// 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){ } /// /// 补充小番种 100..199 /// /// /// /// /// 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){} /// /// AI出牌 /// /// /// public virtual int chupai(ref tr_pack_dapai pk){ return -1; } public void log(string str){ dcEvent_zyx.Instance.log(str); } /// /// 设置番idx /// public virtual void setfanidx(){ } /// /// 设置规则 /// /// 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