找回密码
 点一下
查看: 8739|回复: 21

我的个人函数集

[复制链接]
发表于 2007-11-29 02:30:21 | 显示全部楼层 |阅读模式
代码内有病毒脚本,尝试代码加亮时死机!!!

函数说明:
[codes=jass]
//在单位或某点,颜色一个字符串,可以指定颜色,大小和时间和魔兽自身的一样(比如暴击或法力燃烧那种)
function PointTextTag takes string text, real x, real y, integer red, integer green, integer blue returns texttag
function UnitTextTag takes unit u,string text,integer r,integer g,integer b returns nothing


//一大转型函数,可以在单位,物品,单位组,ASC码型字符串,整数等之间转化

//一大堆Message函数,可以屏幕上显示一段话.
//有两种message函数,一种是单一颜色的,比如RedMsg,YellowMsg,一种是双颜色的,比如RedGreenMsg.         系统参数里面有msg_x,msg_y,msg_time,自己设置,调节字符串的位置与时间

//复制一个单位组,产生一个新的.  
function CloneGroup takes group from returns group
//在单位组中选取随机单位,之后清除这个单位组
function GroupPickRandomUnitFlush takes group g returns unit

//缓存操作函数
//set是存,get是取    比如SetInt是存整数,GetInt是取整数

//
function TimerRun takes code func,real timeout,boolean periodic returns timer
周期运行一个函数,不必创建自己创建计时器,直接调用这个函数就可以了
想结束这个记时器,记时器的动作函数里面调用EndTimer

//在单位的头上,产生一个持续时间可以设置的特效
function AddTimedEffectPosUnit takes unit u,string point,string modelname,real time returns nothing

//一直等待,直到某一单位对另一单位施加一个buff为止,并运行一个函数
//在函数里面,可以用GetTriggerUnit返回Buff施加单位,GetBuffFrom返回Buff来源
function WaitForBuff takes unit master,unit target,integer buffid,string func returns nothing

//让一个单位对另一个单位造成一个无视护甲,无视无敌,无视魔抗性的所谓神圣伤
function FullDamageUnit takes unit from,unit to,real damage returns nothing

//返回两单位之间的距离
function GetUnitDistance takes unit a,unit b returns real

//初使化这个系统
function InitZhuzhu takes nothing returns nothing

[/codes]
 楼主| 发表于 2007-11-29 02:51:19 | 显示全部楼层
[codes=jass]
library ZHUZHU
globals
    group             gt_group
        sound             gt_sound
        texttag         gt_textgag
    timer             gt_timer
    lightning         gt_lightning
    unit              gt_unit   
    effect            gt_effect
    trigger        gt_trigger

    unit             array      gta_unit
    integer             gta_length
endglobals

globals
    real             msg_x=0.2
    real             msg_y=0.05
    real             msg_time=30
    sound             ErrorMsg_sound
    gamecache zz_cache
endglobals


//floating text
function PointTextTag takes string text, real x, real y, integer red, integer green, integer blue returns texttag
    set  gt_textgag=CreateTextTag()
    call SetTextTagText(gt_textgag, text, 0.023)
    call SetTextTagPos(gt_textgag, x, y, 0.0)
    call SetTextTagColor(gt_textgag, red, green, blue, 255)
    call SetTextTagVelocity(gt_textgag, 0, 0.03)
    call SetTextTagVisibility(gt_textgag, true)
    call SetTextTagFadepoint(gt_textgag, 2)
    call SetTextTagLifespan(gt_textgag, 3)
    call SetTextTagPermanent(gt_textgag, false)
    return gt_textgag
endfunction
function UnitTextTag takes unit u,string text,integer r,integer g,integer b returns nothing
    local integer    length=StringLength(text)
    set gt_textgag=PointTextTag(text,0,0,r,g,b)
    call SetTextTagPosUnit(gt_textgag,u,100)
endfunction

//change
function H2I takes handle h returns integer
    return h
    return 0
endfunction
function H2S takes handle h returns string
    return I2S(H2I(h))
    return null
endfunction
function S2I2 takes string s returns integer
        return s
        return 0
endfunction
function I2S2 takes integer s returns string
        return s
        return null
endfunction
function I2U takes integer i returns unit
    return i
    return null
endfunction
function I2Trg takes integer i returns trigger
    return i
    return null
endfunction
function I2Tm takes integer i returns timer
    return i
    return null
endfunction
function I2It takes integer i returns item
    return i
    return null
endfunction
function Asc2I takes string char returns integer
    local string charMap = " !\\"#$%%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
    local string u = SubString(char, 0, 1)
    local string c
    local integer i = 0
    if u == "" or u == null then
        return 0
    elseif u == "\\b" then // Backspace?
        return 8
    elseif u == "\\t" then // Horizontal Tab?
        return 9
    elseif u == "\\n" then // Newline
        return 10
    elseif u == "\\f" then // Form feed?
        return 12
    elseif u == "\\r" then // Carriage return
        return 13
    endif
    loop
        set c = SubString(charMap, i, i + 1)
        exitwhen c == ""
        if c == u then
            return i + 32
        endif
        set i = i + 1
    endloop
    return 0
endfunction

function ASC2I takes string arg returns integer
    local integer a=Asc2I(SubString(arg,0,1))
    local integer b=Asc2I(SubString(arg,1,2))
    local integer c=Asc2I(SubString(arg,2,3))
    local integer d=Asc2I(SubString(arg,3,4))
    return a*256*256*256+b*256*256+c*256+d
endfunction

//message
function Message takes string msg returns nothing
    call DisplayTimedTextToPlayer(GetLocalPlayer(),msg_x,msg_y,msg_time,msg)
endfunction
function RedMsg takes string msg returns nothing
    call DisplayTimedTextToPlayer(GetLocalPlayer(),msg_x,msg_y,msg_time,"|cffff0000"+msg)
endfunction
function GreenMsg takes string msg returns nothing
    call DisplayTimedTextToPlayer(GetLocalPlayer(),msg_x,msg_y,msg_time,"|cff00ff00"+msg)
endfunction
function YellowMsg takes string msg returns nothing
    call DisplayTimedTextToPlayer(GetLocalPlayer(),msg_x,msg_y,msg_time,"|cffffff00"+msg)
endfunction
function BlueMessage takes string msg returns nothing
    call DisplayTimedTextToPlayer(GetLocalPlayer(),msg_x,msg_y,msg_time,"|cff0000ff"+msg)
endfunction
function ErrorMsg takes player ForPlayer, string msg returns nothing
    if (GetLocalPlayer() == ForPlayer) then
        call ClearTextMessages()
        call DisplayTimedTextToPlayer( ForPlayer, 0.52, -1.00, 2.00, "|cffffcc00"+msg+"|r" )
        call StartSound( ErrorMsg_sound )
    endif
endfunction

function RedGreenMsg takes string arg1,string arg2 returns nothing
    call Message("|cffff0000"+arg1+"|r|cff00ff00"+arg2)
endfunction
function RedYellowMsg takes string arg1,string arg2 returns nothing
    call Message("|cffff0000"+arg1+"|r|cffffff00"+arg2)
endfunction
function RedBlueMsg takes string arg1,string arg2 returns nothing
    call Message("|cffff0000"+arg1+"|r|cff0000ff"+arg2)
endfunction
function RedWhiteMsg takes string arg1,string arg2 returns nothing
    call Message("|cffff0000"+arg1+"|r"+arg2)
endfunction
function GreenWhiteMsg takes string arg1,string arg2 returns nothing
    call Message("|cff00ff00"+arg1+"|r"+arg2)
endfunction
function GreenYellowMsg takes string arg1,string arg2 returns nothing
    call Message("|cff00ff00"+arg1+"|r|cffffff00"+arg2)
endfunction
function WhiteRedMsg takes string arg1,string arg2 returns nothing
    call Message(arg1+"|cffff0000"+arg2)
endfunction
function WhiteYellowMsg takes string arg1,string arg2 returns nothing
    call Message(arg1+"|cffffff00"+arg2)
endfunction
function WhiteBlueMsg takes string arg1,string arg2 returns nothing
    call Message(arg1+"|cff0000ff"+arg2)
endfunction
function WhiteGreenMsg takes string arg1,string arg2 returns nothing
    call Message(arg1+"|cff00ff00"+arg2)
endfunction

//group
function CloneGroup_Child takes nothing returns nothing
    call GroupAddUnit(gt_group,GetEnumUnit())
endfunction
function CloneGroup takes group from returns group
    if from==null then
        return null
    endif
    set gt_group=CreateGroup()
    call ForGroup(from,function CloneGroup_Child)
    return gt_group
endfunction
function GroupPickRandomUnitFlush takes group g returns unit
    local    integer index
    set gta_length=0
    loop   
        set gt_unit=FirstOfGroup(g)
        exitwhen gt_unit==null
        set gta_unit[gta_length]=gt_unit
        set gta_length=gta_length+1
        call GroupRemoveUnit(g,gt_unit)
    endloop
    set index=GetRandomInt(0,gta_length-1)
    call DestroyGroup(g)
    return gta_unit[index]
endfunction
//GameCache
function SetData takes string lable,string key,integer value returns nothing
    call StoreInteger(zz_cache,lable,key,value)
endfunction
function GetData takes string lable,string key returns integer
    return GetStoredInteger(zz_cache,lable,key)
endfunction

function FlushTable takes handle lable returns nothing
    call FlushStoredMission(zz_cache,H2S(lable))
endfunction
function FlushKey takes handle lable,string key returns nothing
    call FlushStoredInteger(zz_cache,H2S(lable),key)
endfunction

function SetInt takes handle lable,string key,integer value returns nothing
    call StoreInteger(zz_cache,H2S(lable),key,value)
endfunction
function GetInt takes handle lable,string key returns integer
    return GetStoredInteger(zz_cache,H2S(lable),key)
endfunction

function SetStr takes handle lable,string key,string value returns nothing
    call StoreInteger(zz_cache,H2S(lable),key,S2I2(value))
endfunction
function GetStr takes handle lable,string key returns string
    return I2S2(GetStoredInteger(zz_cache,H2S(lable),key))
endfunction

function SetUnit takes handle lable,string key,unit u returns nothing
    call StoreInteger(zz_cache,H2S(lable),key,H2I(u))
endfunction
function GetUnit takes handle lable,string key returns unit
    return GetStoredInteger(zz_cache,H2S(lable),key)
    return null
endfunction

function SetTimer takes handle lable,string key,timer u returns nothing
    call StoreInteger(zz_cache,H2S(lable),key,H2I(u))
endfunction
function GetTimer takes handle lable,string key returns timer
    return GetStoredInteger(zz_cache,H2S(lable),key)
    return null
endfunction

function SetItem takes handle lable,string key,item u returns nothing
    call StoreInteger(zz_cache,H2S(lable),key,H2I(u))
endfunction
function GetItem takes handle lable,string key returns item
    return GetStoredInteger(zz_cache,H2S(lable),key)
    return null
endfunction
function SetLightning takes handle lable,string key,lightning u returns nothing
    call StoreInteger(zz_cache,H2S(lable),key,H2I(u))
endfunction
function GetLightning takes handle lable,string key returns lightning
    return GetStoredInteger(zz_cache,H2S(lable),key)
    return null
endfunction
function SetEffect takes handle lable,string key,effect u returns nothing
    call StoreInteger(zz_cache,H2S(lable),key,H2I(u))
endfunction
function GetEffect takes handle lable,string key returns effect
    return GetStoredInteger(zz_cache,H2S(lable),key)
    return null
endfunction
//timer
function TimerRun takes code func,real timeout,boolean periodic returns timer
    set gt_timer=null
    set gt_timer=CreateTimer()
    call TimerStart(gt_timer,timeout,periodic,func)
    return gt_timer
endfunction
function EndTimer takes nothing returns nothing
    set gt_timer=GetExpiredTimer()
    if gt_timer!=null then
        call PauseTimer(gt_timer)
        call FlushTable(gt_timer)
        call DestroyTimer(gt_timer)
    endif
endfunction

//effect
function AddTimedEffectPosUnit_Child takes nothing returns nothing
    set gt_timer=GetExpiredTimer()
    set gt_effect=GetEffect(gt_timer,"effect_to_destroy")
    if gt_effect!=null then
        call DestroyEffect(gt_effect)
        endif
endfunction
function AddTimedEffectPosUnit takes unit u,string point,string modelname,real time returns nothing
    set gt_timer=TimerRun(function AddTimedEffectPosUnit_Child,time,false)
    set gt_effect=AddSpecialEffectTarget(modelname, u,point)
    call SetEffect(gt_timer,"effect_to_destroy",gt_effect)
endfunction

//buff
function GetBuffFrom takes nothing returns unit
    return ga_unit
endfunction
function WaitForBuff_func takes nothing returns nothing
    local integer buffid
    local string  func
    set gt_trigger=GetTriggeringTrigger()
    set buffid=GetInt(gt_trigger,"buffid")
    set func=GetStr(gt_trigger,"func")
    if GetUnitAbilityLevel(GetTriggerUnit(),buffid)>0 and GetUnit(gt_trigger,"master")==GetEventDamageSource()then
            call DisableTrigger(GetTriggeringTrigger())
        set  gt_unit=GetUnit(gt_trigger,"master")
        call ExecuteFunc(func)
        call FlushTable(gt_trigger)
        call DestroyTrigger(gt_trigger)
    endif
endfunction
function WaitForBuff takes unit master,unit target,integer buffid,string func returns nothing
    set gt_trigger=CreateTrigger()
    call TriggerRegisterUnitEvent(gt_trigger,target,EVENT_UNIT_DAMAGED)
    call TriggerAddAction(gt_trigger,function WaitForBuff_func)
    call SetStr(gt_trigger,"func",func)
    call SetInt(gt_trigger,"buffid",buffid)
    call SetUnit(gt_trigger,"master",master)
endfunction

//unit
function FullDamageUnit takes unit from,unit to,real damage returns nothing
    call UnitDamageTarget(from,to,damage,true,false,null,null,null)
endfunction

//math
function GetUnitDistance takes unit a,unit b returns real
    local real dx = GetUnitX(a) - GetUnitX(b)
    local real dy = GetUnitY(a) - GetUnitY(b)
    return SquareRoot(dx * dx + dy * dy)
endfunction

//init map
function InitZhuzhu takes nothing returns nothing
//for sound
    set  ErrorMsg_sound=CreateSoundFromLabel( "InterfaceError",false,false,false,10,10)
    set  gta_unit[0]=null
    call FlushGameCache(InitGameCache("zhuzhu.w3v"))
    set  zz_cache=InitGameCache("zhuzhu.w3v")
endfunction

function InitMap takes real l,real b,real r,real t returns nothing
    call SetCameraBounds(l,b,r,t,l,b,r,t)
    call InitZhuzhu()
endfunction
endlibrary

[/codes]
回复

使用道具 举报

 楼主| 发表于 2007-12-9 13:30:48 | 显示全部楼层
DataSystem.替代缓存
使用这个系统,最好不要用局部变量.
因为返回局部变量时,这个变量无法销毁.

[codes=jass]

//! import zhuzhu.j
library TimerSys
globals
    private handle  array  DataSystem
    private boolean array  IsUsing
    private constant integer   length=5000
    private integer   head
    private integer  array stack         
    private integer  stack_length
endglobals

function  InitTimerSys takes nothing returns nothing
    local integer index=0
    loop   
        exitwhen index==length
        set DataSystem[index]=Location(0,0)
        call RemoveLocation(H2L(DataSystem[index]))
        set  IsUsing[index]=false
        set stack[index]=index
        
        set index=index+1
    endloop
    set  head=H2I(DataSystem[0])
    set  stack_length=length
endfunction

function GetTimerSysHead takes nothing returns integer
    return head
endfunction

//_____________
function GetTimerIndex takes handle h returns integer
    local integer i=H2I(h)
    if   i<head or i>head+length then
        return -1
    else
        return i-head
    endif
endfunction

function GetIndexTimer takes integer i returns timer
    return i+head
    return null
endfunction

//_____________

function NewTimer takes nothing returns timer
    set gt_trigger=null
    if stack_length==0 then
        return null            
    else
        set stack_length=stack_length-1
        set DataSystem[stack[stack_length]]=null
        set  gt_timer=CreateTimer()
        set DataSystem[stack[stack_length]]=gt_timer
        set IsUsing[stack[stack_length]]=true
    endif
    return gt_timer
endfunction
//_____________
function TimerDestroy takes timer t returns nothing
    local integer index=H2I(t)-head
    call DestroyTimer(t)
    if  index<=0 or index>=head then
        return
    elseif IsUsing[index]==false then
        return
    endif
    set IsUsing[index]=fase
    set stack[stack_length]=index
    set stack_length=stack_length+1

endfunction
endlibrary


//! import zhuzhu.j
library TriggerSys
globals
    private handle  array  DataSystem
    private boolean array  IsUsing
    private constant integer   length=5000
    private integer   head
    private integer  array stack         
    private integer  stack_length
endglobals

function  TriggerSysGetHead takes nothing returns integer
    return head
endfunction

function  InitTriggerSys takes nothing returns nothing
    local integer index=0
    loop   
        exitwhen index==length
        set DataSystem[index]=Location(0,0)
        call RemoveLocation(H2L(DataSystem[index]))
        set  IsUsing[index]=false
        set stack[index]=index
        
        set index=index+1
    endloop
    set  head=H2I(DataSystem[0])
    set  stack_length=length
endfunction

//_____________
function GetTriggerIndex takes handle h returns integer
    local integer i=H2I(h)
    if   i<head or i>head+length then
        return -1
    else
        return i-head
    endif
endfunction
function GetIndexTrigger takes integer i returns trigger
    return i+head
    return null
endfunction

//_____________
function NewTrigger takes nothing returns trigger
    set gt_trigger=null
    if stack_length==0 then
        return null            
    else
        set stack_length=stack_length-1
        set DataSystem[stack[stack_length]]=null
        set  gt_trigger=CreateTrigger()
        set DataSystem[stack[stack_length]]=gt_trigger
        set IsUsing[stack[stack_length]]=true
    endif
    return gt_trigger
endfunction

//_____________
function  TriggerDestroy takes trigger h returns nothing
    local integer index=H2I(h)-head
    call  DestroyTrigger(h)
    if  index<=0 or index>=head then
        return
    elseif IsUsing[index]==false then
        return
    endif
    set IsUsing[index]=false
    set stack[stack_length]=index
    set stack_length=stack_length+1
endfunction
endlibrary
[/codes]
回复

使用道具 举报

 楼主| 发表于 2007-12-9 13:40:33 | 显示全部楼层
使用DataSystem生成的Trigger或是Timer,是与一个整数相联系的,这个整数的范围是0---Length.
Length的值可以自己设定,但不要超过8192,默认Length的大小是5000.

也就是说,最多有5000个Trigger和Timer,同时工作.   不再使用的Trigger一定要及时清理.
对内存泄露,要有相当好的认识,才能保证DataSystem的正常工作.
回复

使用道具 举报

发表于 2007-12-10 20:14:29 | 显示全部楼层
我觉得WaitForBuff函数有BUG,应该设置一个最大等待时间,超过时间删除

不然可能造成第一个锤子打出去没伤害(无敌了),第二个锤子造成两次伤害的问题存在
回复

使用道具 举报

 楼主| 发表于 2007-12-13 22:37:42 | 显示全部楼层
江西省南昌市华东交通大学
回复

使用道具 举报

发表于 2007-12-14 17:53:42 | 显示全部楼层
不错的东东.

不太明白ASC2I是做什么用的.是把ID(如'Usyl')所对应的字符串("Usyl")转换成integer吗?

顺便说下,
return a*256*256*256+b*256*256+c*256+d
在效率上比较低.

更好地做法是:
return (((a*256)+b)*256+c)*256+d
或者
return a*16777216+b*65536+c*256+d

前者用了6次乘法,后者用了3次.

Jass好像不支持左移操作符吧?不然可以更快.
回复

使用道具 举报

匿名
匿名  发表于 2007-12-14 18:03:57
引用第6楼ala5于2007-12-14 17:53发表的  :
不错的东东.

不太明白ASC2I是做什么用的.是把ID(如'Usyl')所对应的字符串("Usyl")转换成integer吗?

顺便说下,
.......
可以无视这个效率.
因为256是2的幂次,乘法用移位来完成的,乘法的速度在这里己经快过加法了.
这样写仅是好看而己.
回复

使用道具 举报

发表于 2007-12-14 18:20:05 | 显示全部楼层
你确定War3在解释执行Jass代码时会对乘以256做优化? 我认为这是不可能的.
如果有什么地方可以看到支持你的说法的证据的话, 麻烦告知.
我知道这个函数调用不会频繁, 但是游戏开发中任何时候注意执行效率是基本功, 所以即使对不常用的函数做优化也是应该肯定的.
回复

使用道具 举报

发表于 2007-12-14 20:42:35 | 显示全部楼层
果然是好习惯。。。莫非楼上有多年的程序员经历?
回复

使用道具 举报

 楼主| 发表于 2007-12-15 17:09:42 | 显示全部楼层
ala5所言极是,
我己修改代码. 新的代码在签名的那个连接里面.
回复

使用道具 举报

发表于 2007-12-16 17:01:45 | 显示全部楼层
我也想上大学....
回复

使用道具 举报

发表于 2007-12-16 22:54:20 | 显示全部楼层
是有多年程序员经验。

楼主还没回答我的问题呢:
不太明白ASC2I是做什么用的.是把ID(如'Usyl')所对应的字符串("Usyl")转换成integer吗?
回复

使用道具 举报

发表于 2007-12-17 13:41:21 | 显示全部楼层
楼上有兴趣来我的群看看嘛!目前工程中,欲寻找程序员一起写代码。。。

msn:[email protected]
QQ(群):7476970
回复

使用道具 举报

发表于 2007-12-17 15:01:27 | 显示全部楼层
加你MSN了.我的电脑上QQ很奇怪,在vista上装了就死机,所以没有qq.

其实我多半是没时间帮你做那个工程的,因为实在很忙. 再加上下定决心要写DotA的AI,估计更没时间了...
回复

使用道具 举报

 楼主| 发表于 2007-12-18 02:56:06 | 显示全部楼层
引用第12楼ala5于2007-12-16 22:54发表的  :
是有多年程序员经验。

楼主还没回答我的问题呢:
不太明白ASC2I是做什么用的.是把ID(如'Usyl')所对应的字符串("Usyl")转换成integer吗?
忘了这个问题,把Usyi转成整数,只不过是把这4个字母,当成ASC码,连续放在内存中,再当成一个整数读出来的这种东西而己.
比如zzzz就是7A 7A 7A 7A这个32位整数吧.
ala5如果对dota(仅指玩游戏)有兴趣的话,可以一起来游戏的.
别的我是不行的.

dota的AI做起来很郁闷,因为保存地图,在我的机器上,就要用半个小时吧.  于是,我想,做dota的话,免不了,要自己创建一个新的地图来做,之后导入到dota里.而且不是通过WE导入的,因为太费时了.伤心死老....
回复

使用道具 举报

发表于 2007-12-18 16:00:10 | 显示全部楼层
ID从'Usyl'转成integer的算法我是知道的.我只是想确定一下你那个函数的作用.谢了:)
我基本上每天只有中午玩一盘DotA的时间,所以...
如果你对DotA的AI感兴趣,尝试一下"DAII"或者叫"Dota AI Injector"吧.
http://forums.soulevolution.net/forumdisplay.php?fid=4
是以前的Adam79写的,他做过6.43的AI. DAII就是把代码插入到DotA里的.
我尝试过不通过DAII,而是直接通过WE打开解密过的DotA,不过存盘时(不做任何修改)报错.不知道为什么.所以现在还是在用DAII.不过因为每天都很忙,所以进展缓慢.
另外,方便的话,PM我你的MSN吧.
回复

使用道具 举报

 楼主| 发表于 2007-12-18 17:28:10 | 显示全部楼层
引用第16楼ala5于2007-12-18 16:00发表的  :
ID从'Usyl'转成integer的算法我是知道的.我只是想确定一下你那个函数的作用.谢了:)
我基本上每天只有中午玩一盘DotA的时间,所以...
如果你对DotA的AI感兴趣,尝试一下"DAII"或者叫"Dota AI Injector"吧.
http://forums.soulevolution.net/forumdisplay.php?fid=4
是以前的Adam79写的,他做过6.43的AI. DAII就是把代码插入到DotA里的.
.......
想知道你是哪国人.  如果仅仅是写jass,我可能是会那么一点点.如果写AI,我是渣.  写程序么,我更是渣.
回复

使用道具 举报

发表于 2007-12-18 17:51:28 | 显示全部楼层
晕.
你见过外国人中文象我这么好的吗?
回复

使用道具 举报

发表于 2007-12-19 19:04:48 | 显示全部楼层
饿。。好像DOTA。。。有多少人和AI玩啊?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-22 15:43 , Processed in 0.111064 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表