找回密码
 点一下
查看: 1903|回复: 3

[转载]Return Bug System系统以及其应用讲解

[复制链接]
发表于 2007-11-10 07:38:13 | 显示全部楼层 |阅读模式
作者:暗月之舞
[codes=jass]
//############################################################################
// Return Bug System
// Edit by feelerly
// 2007.09.21
// * 这是Return Bug系统,用于游戏中的数据转换,十分重要
// * 这个系统是公开的,大家可以对其进行编辑以及修改
// * 这个是专用于我所出品的地图以及演示图中所用的储存系统
// * 函数 S2ID 专用来转换代码,比如要将物品,单位,技能等代码进行编辑时,可以使用
//   ID2S 函数将代码转为字符串,再使用S2ID函数可以将字符再次化为代码
// * 这个是自己编辑的Return Bug System,仅供大家参考
//#############################################################################
//========================================================================
// 常量函数部分
// * constant 开头的函数为常量函数,一般不能更改
// * CacheValue 函数中,常量bj_lastCreatedGameCache的值可以在地图初始化中设定
//   也可以不用设定,游戏中,最好不要随便更改bj_lastCreatedGameCache的取值
// * H2I 是Return Bug函数,可以将handle类数据当作整数进行编辑,但事实上,H2I传回
// * 的是handle类数据,因为不能按照整数那样进行"+,-,*,/"等操作,否则会导致数据
// * 溢出,以致游戏崩溃.
//========================================================================
constant function StringNum takes nothing returns string
return "0123456789"
endfunction
constant function StringABC takes nothing returns string
return "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
endfunction
constant function Stringabc takes nothing returns string
return "abcdefghijklmnopqrstuvwxyz"
endfunction
constant function H2I takes handle H returns integer
return H
return 0
endfunction
function CacheValue takes nothing returns gamecache
if(bj_lastCreatedGameCache==null)then
set bj_lastCreatedGameCache=InitGameCache("ReturnBugSystem.w3v")
endif
return bj_lastCreatedGameCache
endfunction
//========================================================================
// 主要函数功能介绍: 数据存储
// * SetHandleValue(subject,missonkey,value) -- 将value值(类型为handle)
//    梆定在subject(类型为handle)上,missonkey是字符名
// * SetHandleInteger(subject,missonkey,value) -- 将value值(类型为integer)
//    梆定在subject(类型为handle)上,missonkey是字符名
// * SetHandleReal(subject,missonkey,value) -- 将value值(类型为real)
//    梆定在subject(类型为handle)上,missonkey是字符名
// * SetHandleString(subject,missonkey,value) -- 将value值(类型为string)
//    梆定在subject(类型为handle)上,missonkey是字符名
// * SetHandleBoolean(subject,missonkey,value) -- 将value值(类型为boolean)
//    梆定在subject(类型为handle)上,missonkey是字符名
//========================================================================
function SetHandleValue takes handle subject,string missonkey,handle value returns nothing
if(value==null)then
call FlushStoredInteger(CacheValue(),I2S(H2I(subject)),missonkey)
else
call StoreInteger(CacheValue(),I2S(H2I(subject)),missonkey,H2I(value))
endif
endfunction
function SetHandleInteger takes handle subject,string missonkey,integer value returns nothing
if(value==0)then
call FlushStoredInteger(CacheValue(),I2S(H2I(subject)),missonkey)
return
else
call StoreInteger(CacheValue(),I2S(H2I(subject)),missonkey,value)
endif
endfunction
function SetHandleReal takes handle subject,string missonkey,real value returns nothing
if(value==0.00)then
call FlushStoredReal(CacheValue(),I2S(H2I(subject)),missonkey)
return
else
call StoreReal(CacheValue(),I2S(H2I(subject)),missonkey,value)
endif
endfunction
function SetHandleString takes handle subject,string missonkey,string value returns nothing
if(value==null or value=="")then
call FlushStoredString(CacheValue(),I2S(H2I(subject)),missonkey)
return
else
call StoreString(CacheValue(),I2S(H2I(subject)),missonkey,value)
endif
endfunction
function SetHandleBoolean takes handle subject,string missonkey,boolean value returns nothing
if(value==false)then
call FlushStoredBoolean(CacheValue(),I2S(H2I(subject)),missonkey)
return
else
call StoreBoolean(CacheValue(),I2S(H2I(subject)),missonkey,value)
endif
endfunction
//========================================================================
// 主要函数功能介绍: 数据读取
// * GetHandleHandle(subject,missonkey) -- 取得梆定在subject(类型为handle)
//   字符名missonkey上的(handle)句柄数据
// * GetHandleInteger(subject,missonkey) -- 取得梆定在subject(类型为handle)
//   字符名missonkey上的(integer)整数数据
// * GetHandleReal(subject,missonkey) -- 取得梆定在subject(类型为handle)
//   字符名missonkey上的(real)实数数据
// * GetHandleString(subject,missonkey) -- 取得梆定在subject(类型为handle)
//   字符名missonkey上的(string)字符数据
// * GetHandleBoolean(subject,missonkey) -- 取得梆定在subject(类型为handle)
//   字符名missonkey上的(boolean)布尔数据
// * GetHandleUnit(subject,missonkey) -- 取得梆定在subject(类型为handle)
//   字符名missonkey上的(unit)单位数据
// **再以下都是GetHandleHandle的扩展类型函数,一般可以自由添加**
//========================================================================
function GetHandleHandle takes handle subject,string missonkey returns handle
return GetStoredInteger(CacheValue(),I2S(H2I(subject)),missonkey)
return null
endfunction
function GetHandleInteger takes handle subject,string missonkey returns integer
return GetStoredInteger(CacheValue(),I2S(H2I(subject)),missonkey)
endfunction
function GetHandleReal takes handle subject,string missonkey returns real
return GetStoredReal(CacheValue(),I2S(H2I(subject)),missonkey)
endfunction
function GetHandleString takes handle subject,string missonkey returns string
return GetStoredString(CacheValue(),I2S(H2I(subject)),missonkey)
endfunction
function GetHandleBoolean takes handle subject,string missonkey returns boolean
return GetStoredBoolean(CacheValue(),I2S(H2I(subject)),missonkey)
endfunction
function GetHandleUnit takes handle subject,string missonkey returns unit
return GetHandleHandle(subject,missonkey)
endfunction
function GetHandleGroup takes handle subject,string missonkey returns group
return GetHandleHandle(subject,missonkey)
endfunction
function GetHandleTrigger takes handle subject,string missonkey returns trigger
return GetHandleHandle(subject,missonkey)
endfunction
function GetHandleTriggerAction takes handle subject,string missonkey returns triggeraction
return GetHandleHandle(subject,missonkey)
endfunction
function GetHandleEffect takes handle subject,string missonkey returns effect
return GetHandleHandle(subject,missonkey)
endfunction
function GetHandleWeather takes handle subject,string missonkey returns weathereffect
return GetHandleHandle(subject,missonkey)
endfunction
function GetHandleLightning takes handle subject,string missonkey returns lightning
return GetHandleHandle(subject,missonkey)
endfunction
//#############################################################################
// Save Data System
// Edit by feelerly
// 2007.09.21
// * 附加这个系统,主要是为了主便技能以及各种代码的移植,看起来虽然作用不是很大
//   但在某些方面确实有其好的一面,配合上Return Bug System的应用,其意义也不仅限
//   于此了,其中妙用自己慢慢体会
// 函数功能介绍:
// * S2ID(source) -- 将字符source(类型string)转化为代码(类型integer)
// * ID2S(int)    -- 将代码int(类型integer)转化为字符串
//#############################################################################
function S2ID takes string source returns integer
local integer Id = 0
local integer n1 = 1
local integer n2 = 1
loop
exitwhen(n1>StringLength(source))
loop
exitwhen(n2>10)
if(SubString(source,n1-1,n1)==SubString(StringNum(),n2-1,n2))then
set Id=Id+R2I(('0'+n2-1)*Pow(256.00,I2R(StringLength(source)-n1)))
set n2=n2+1
else
set n2=n2+1
endif               
endloop
set n2=1
loop
exitwhen(n2>26)
if(SubString(source,n1-1,n1)==SubString(StringABC(),n2-1,n2))then
set Id=Id+R2I(I2R('A'+n2-1)*Pow(256.00,I2R(StringLength(source)-n1)))
set n2=n2+1
else
set n2=n2+1
endif               
endloop
set n2=1
loop
exitwhen(n2>26)
if(SubString(source,n1-1,n1) == SubString(Stringabc(),n2-1,n2))then
set Id=Id+R2I(('a'+n2-1)*Pow(256.00,I2R(StringLength(source)-n1)))
set n2=n2+1
else
set n2=n2+1
endif               
endloop
set n2=1
set n1=n1+1
endloop
return Id
endfunction
function ID2S takes integer int returns string
local string target=""
local integer n=0
local integer dis=0
loop
exitwhen(int==0)
set n=ModuloInteger(int,256)
if(n>='0' and n<='9')then
set dis=n-'0'
set target=SubString(StringNum(),dis,dis+1)+target
endif
if(n>='A' and n<='Z')then
set dis=n-'A'
set target=SubString(StringABC(),dis,dis+1)+target
endif
if(n>='a' and n<='z')then
set dis=n-'a'
set target=SubString(Stringabc(),dis,dis+1)+target
endif
set int=int/256
endloop
return target
endfunction
[/codes]
 楼主| 发表于 2007-11-10 07:39:01 | 显示全部楼层
[codes=jass]
//########################################################################
//  *****天气系统设定*****
//  作者: 暗月之舞
//  DATE: 2007.10
//  *天气类型说明*
//  *按天气代码进行编排*
//  'RAhr' -- 白杨谷大雨    'RAlr' -- 白杨谷小雨    'MEds' -- 达拉然之盾
//  'FDbh' -- 地牢蓝色浓雾  'FDbl' -- 地牢蓝色薄雾  'FDgh' -- 地牢绿色浓雾
//  'FDgl' -- 地牢绿色薄雾  'FDrh' -- 地牢红色浓雾  'FDrl' -- 地牢红色薄雾
//  'FDwh' -- 地牢白色浓雾  'FDwl' -- 地牢白色薄雾  'RLhr' -- 洛丹伦大雨
//  'RLlr' -- 洛丹伦小雨    'SNbs' -- 诺森德暴风雪  'SNhs' -- 诺森德大雪
//  'SNls' -- 诺森德小雪    'WOcw' -- 边缘之地大风  'WOlw' -- 边缘之地轻风
//  'LRaa' -- 日光          'LRma' -- 月光          'WNcw' -- 风(大的)
//  天气效果按照地域,剧情,以及时间进行变化,天气的变化带来一些附加的影响,间
//  影响单位的能力值,当然这跟周围的环境有关联的.天气系统就是主管这方面的系
//  统.通变系统控制天气的变化以及附加效果.
//  目前只是设定了变化,没有附加效果,如有不足之处还请大家谅解
//########################################################################
//========================================================================
// 天气系统部分支撑函数
// * 以下是一些必要的函数,使得天气系统能够正常运行
// * InitWeatherMessage(weatherid,message)通过这个可以为一个天气类型设定
//   一个描述内容,当游戏中这个天气出现时,会采用这个描述
// * InitWeatherTable(missonkey,id1,id2,id3,id4)这个函数用于对一个大季节的
//   天气设定,可以规化每个季节所能出现的天气
// * GetRandomWeather(missonkey)通过此功能,可以随机抽取一个大季节内的天气
//   表中的天气,使之产生一些变化
// * ShowWeatherEffect(searonname,effectregion)显示并存储一个天气效果.当然
//   这个会影响到全局的天气变化,不过大家可以改一下函数
// * GetSearonName(index)通过整数取得相应的季节名,以便于计时器周期改变时,也
//   能带动季节的变化,一个季节目前是一个天气
//========================================================================
function InitWeatherMessage takes integer weatherid,string message returns nothing
call SetHandleString(Player(0),"WeatherMessage"+ID2S(weatherid),message)
endfunction
function GetWeatherMessage takes integer weatherid returns string
return GetHandleString(Player(0),"WeatherMessage"+ID2S(weatherid))
endfunction
function InitWeatherTable takes string missonkey,integer id1,integer id2,integer id3,integer id4 returns nothing
call SetHandleInteger(Player(0),missonkey+"1",id1)
call SetHandleInteger(Player(0),missonkey+"2",id1)
call SetHandleInteger(Player(0),missonkey+"3",id1)
call SetHandleInteger(Player(0),missonkey+"4",id1)
endfunction
function GetRandomWeather takes string missonkey returns integer
return GetHandleInteger(Player(0),missonkey+I2S(GetRandomInt(1,4)))
endfunction
function ShowWeatherEffect takes string searonname,rect effectregion returns nothing
call SetHandleValue(Player(0),"当前天气特效",AddWeatherEffect(effectregion,GetRandomWeather(searonname)))
call EnableWeatherEffect(GetHandleWeather(Player(0),"当前天气特效"),true)
call DisplayTextToPlayer(GetLocalPlayer(),0.55,0,"当前天气效果为:"+GetWeatherMessage(GetRandomWeather(searonname)))
endfunction
function GetSearonName takes integer index returns string
if(index==1)then
return "春天天气"
elseif(index==2)then
return "夏天天气"
elseif(index==3)then
return "秋天天气"
elseif(index==4)then
return "冬天天气"
endif
return null
endfunction
//========================================================================
// 天气控制设定
// * 天气的变化是由计时器来控制的,测试的计时周期为9.00秒,可以自定
// * 当然,如果对于这个系统熟悉,可以自书添加天气效果设定
//========================================================================
function ContorlWeatherWithTimer_Actions takes nothing returns nothing
call EnableWeatherEffect(GetHandleWeather(Player(0),"当前天气特效"),false)
call RemoveWeatherEffect(GetHandleWeather(Player(0),"当前天气特效"))
call SetHandleValue(Player(0),"当前天气特效",null)
if(GetHandleInteger(GetExpiredTimer(),"SearonIndex")>=1)then
call ShowWeatherEffect(GetSearonName(GetHandleInteger(GetExpiredTimer(),"SearonIndex")),bj_mapInitialPlayableArea)
call SetHandleInteger(GetExpiredTimer(),"SearonIndex",GetHandleInteger(GetExpiredTimer(),"SearonIndex")+1)
if(GetHandleInteger(GetExpiredTimer(),"SearonIndex")==5)then
call SetHandleInteger(GetExpiredTimer(),"SearonIndex",1)
endif
endif
endfunction
function WeatherEffectSystem_Actions takes nothing returns nothing
local timer weather_t=CreateTimer()
call ExecuteFunc("InitWeatherEffectSystem")
call SetHandleInteger(weather_t,"SearonIndex",1)
//! TimerStart设定weather_t的周期时间为9.00秒,为了更好的进行测试
call TimerStart(weather_t,9.00,true,function ContorlWeatherWithTimer_Actions)
endfunction
//========================================================================
// 天气系统设定函数
// * 在InitWeatherEffectSystem函数中主要设定各类天气的表单
// * InitWeatherTable主要用于设置一个季节内的四个天气类型
// * InitWeatherMessage这个主要是设置天气的描述内容,可以自定
//========================================================================
function InitWeatherEffectSystem takes nothing returns nothing
call InitWeatherTable("春天天气",'FDwh','RAlr','LRaa','MEds')
call InitWeatherTable("夏天天气",'LRaa','WOcw','RAhr','FDrh')
call InitWeatherTable("秋天天气",'MEds','FDbh','WNcw','LRma')
call InitWeatherTable("冬天天气",'SNls','SNhs','SNbs','FDwh')
call InitWeatherMessage('Fdwh',"浓雾")
call InitWeatherMessage('RAlr',"小雨")
call InitWeatherMessage('LRaa',"睛天")
call InitWeatherMessage('MEds',"和风")
call InitWeatherMessage('WOcw',"大风")
call InitWeatherMessage('RAhr',"大雨")
call InitWeatherMessage('FDrh',"浓雾")
call InitWeatherMessage('FDbh',"蓝雾")
call InitWeatherMessage('WNcw',"细风")
call InitWeatherMessage('LRma',"月色")
call InitWeatherMessage('SNls',"小雪")
call InitWeatherMessage('SNhs',"大雪")
call InitWeatherMessage('SNbs',"暴风雪")
endfunction
//========================================================================
// 触发初始化设定
//========================================================================
function InitTrig_WeatherEffectSystem takes nothing returns nothing
set gg_trg_WeatherEffectSystem=CreateTrigger()
call TriggerRegisterTimerEventSingle(gg_trg_WeatherEffectSystem,8.00)
call TriggerAddAction(gg_trg_WeatherEffectSystem,function WeatherEffectSystem_Actions)
endfunction
[/codes]
回复

使用道具 举报

发表于 2007-11-10 11:59:23 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-11-12 10:49:05 | 显示全部楼层
我觉得不应该是讲解,而应该是经验交流,如果一个不懂Return Bug的人,看完这篇相信也无任何收获。因为全是天书,尽管里面有一些注释,但也是些填鸭式的概念。

而一个会使用Return Bug并且已经知道原理的人,看这文章也就是了解一下别人的使用经验罢了。

为什么这么说,如果我不是已经看过果子写的浅显的Return Bug教程。而是先看到这篇,绝对也根本不知道在写什么。

呵呵,LZ别生气,这篇文章的原作者将来某天看到了我这篇评论也别生气。作为一个正在学习接受新事物的人,知其然也需知其所以然的心愿是很迫切的。

PS:所以我才说果子真的很适合当讲师,那种掰开来分析原理,并配搭生动浅显例子的讲解的方式,对任何新手来说都是巨大的福音。囫圃吞枣式的硬塞概念很多人是消化不掉的~
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 03:14 , Processed in 0.183452 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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