|
楼主 |
发表于 2008-1-11 17:18:23
|
显示全部楼层
三 、Game Cache
序
不知不觉进入到最关键的环节了,谢谢大家支持。
为什么这部教程没有关于JASS语法的介绍呢,因为其它教程已经讲解得足够详细,没必要赘述。本教程只是启发性,所以最好结合其他教程学习。
J的大部分功能,用T都可实现;即便用T遇到瓶颈,也只需要加几句自定义代码进去就能解决。但是,J真正的精华所在,是T难以望其项背的。Game Cache、Return Bug和Timer可谓是JASS三剑客,只有当你能熟练地运用它们,你才能跨入JASS高手行列,才能享受JASS真正的高效快捷;那时你写的J,与由T转化而来的J,会有本质的区别。如果你想真正学会JASS,那么本章的内容不容错过。
首先分别讲述下Game Cache、Return Bug和Timer的原理和使用方法,照例我们先YD把,把Game Cache想象成一位美丽却有些滥交的美女,把Return Bug想象成一位略带点邪气的帅哥,把Timer想象成一位正派却又怀才不遇的英俊小生——他们三人的恩恩怨怨,情感瓜葛(琼瑶大婶的拿手好戏),将在后面详细阐述。
本想把Game Cache、Return Bug和Timer放在一章里讲的,因为他们三个实在是谁也离不开谁,是个有机的整体;不过今天发现,Game Cache这块的内容比想象的多,待到把Return Bug和Timer也讲了,那这章未免也太长了;因此,把Game Cache单独列出来重点讲。
1.什么是Game Cache
有人把Game Cache比作存放东西的仓库,有一些贴切;但我喜欢把它比作一个笔记本,比如木子美的性爱日记~
之所这么比喻的原因,是因为Game Cache的作用像帐本或者日记本,是将一些参数记录后保存。
既然Game Cache也是保存数据,那么,它与变量的不同在哪里;我们看下面的例子:
1>全局变量
我们把它想象成小黑板,在上面写东西,大家都能看到(比如你在黑板上写道“猪肉怎么涨价了”);但小黑板容量有限,一次只能写一句话——当你想在上面写新的内容,那么,必须先把原来的内容擦掉(比如第二天你发现黑板上的话变成了“因为楼猪是母猪中的战斗猪”)。不过呢,小黑板最大的好处是可反复使用;因此如果条件允许的话,每个人都配个小黑板,那感情挺好,大家各写各的,互不影响。
全局变量的好处自然是各个函数体都能调用,但缺点是一旦用来保存新的东东,之前保存的数据就会丢失;在使用数组后,这种情况有所缓解,却仍解决不了根本问题。(每个人都有自己的小黑板后,的确不用担心别人会擦掉你写的东西;但缺点是,你仍旧一次只能在黑板上写一句话。)
2>局部变量
我们把它想象成便条本,大家需要时就撕下一张,各写各的,互不干涉;而且,你还可以一次撕下几张,在每张上面写上不同的话——这是小黑板做不到的。但是,谁都不知道别人写的什么,而且便条纸难以保存,一般用完就丢了。
当几个函数体调用同一个函数,或,一个函数体连续调用同一个函数时,我们丝毫不担心会发生群P或双飞,也不担心会传播花柳——因为我们使用的是局部变量。但遗憾的是,局部变量也没有全局变量的优点,正如便条纸即不利于保存又不方便交流一样。
(王道,是什么……在第一章讲变量时,我说阉割全局变量是王道,那不过是忽悠不愿深入学习Jass的人罢了,真正精通J的人才不会那样干呢;铺垫就做到这,接下来该介绍我们的主角了。)
(既要像小黑板一样,能让大家都看到,又要像便条纸一样,满足多人使用;能做到这点的,我们很自然就想到了——签名簿、日记本、帐本、笔记本……等等。我们还是拿日记本来举例吧)
3>Game Cache
我们把它想象成公用的日记本,大家都可使用——不同人在不同页面上写下自己的东西,在每页不同的行写下不同的话,写完后内容也不会丢失;而且,你可以查看或删改别人的内容,譬如把他们yy的“林志玲”改成“芙蓉姐姐”~
Game Cache同时具备了全局变量与局部变量的优点,但访问速度比起变量来要慢得多(用日记本记东西明显不如用小黑板或便条纸方便),使用不当还会生成数量很大的string对象(参看Red_Wolf的GameCache应用教程,也有人提出用别的方法来替代Game Cache),但总的说来, Game Cache是很强大的,尤其跟她两个炮友Return Bug和Timer苟合后,简直是无敌的,甚至可以发挥出1+1+1>10的功能来。
Game Cache又跟变量不同,它能储存的数据类型只有五种:unit(单位)、integer(整数)、real(实数)、string(字符窜)、boolean(真值或布尔);功能很拙,是吧,因为BLZ最初设计时就没想过让它来替代变量,而仅仅是让它在战役过面时在两张地图之间传递数据:因为变量只能本图定义本图使用,不可能被别的图调用;但只要此刻游戏运行时缓存里有XX.w3v这个东东,你就可以调用XX.w3v里的数据——因此你在上张图里创建游戏缓存,把数据写入,那么在下一张图就可从这缓存里读出数据。SaveGameCache(存储游戏缓存)和ReloadGameCachesFromDisk(从硬盘读取所有存储数据)这两个函数只用于战役,这里就不讲了。
Game Cache记录integer(整数)、real(实数)、string(字符窜)、boolean(真值或布尔)四种类型的数据比较好理解,跟用变量保存数据大同小异;但记录unit(单位)则就不一样,这点将在后面结合例子讲解。
2.记录
记录数据的形式是Store_Type,函数如下:
[codes=jass]
native StoreString takes gamecache cache, string missionKey, string key, string value returns boolean //存储字符窜
native StoreUnit takes gamecache cache, string missionKey, string key, unit whichUnit returns boolean //存储单位
native StoreReal takes gamecache cache, string missionKey, string key, real value returns nothing //存储实数
native StoreInteger takes gamecache cache, string missionKey, string key, integer value returns nothing //存储整数
native StoreBoolean takes gamecache cache, string missionKey, string key, boolean value returns nothing //存储真值(布尔)
[/codes]
那么,如何记录呢,我们来看下面的例子。由于剧情需要,我们这章的主角就不再是韦春花,而是木子美。
“多谢YD男大人,我老婆子活了大半辈子,还是第一次当主角,大恩大德老身没齿难忘;下次大人来丽春院,给你打八折……”
“……滚!!!”
(开始YD了~)
木子美是个前卫的女人,这年头,女人越贱越容易出名;跟芙蓉姐姐和张钰不同,木子美没资本,既没曲线(她是两条平行线),又没脸蛋(遭遇不了潜规则);但是,她文笔很好,所以最终还是出名了——她把姘头一些资料记录到日记本上,写了本性爱日记。
让我们一起来看看木子美如何写性爱日记吧!
首先,木子美要写日记,得先有日记本吧——所以我们得先创建个游戏缓存,用个全局变量GC来保存。
[trigger]SexNote
事件
地图初始化
环境
动作
游戏缓存 - 创建游戏缓存 SexNote.w3v
设置 GC = (最后创建的游戏缓存) [/trigger]
好了,现在我们就有个名为“SexNote”的缓存,哦不,日记本了。
现在美美要开始记录了。第一个被记录的,是李亚鹏 ——年龄34(乱编的),身高1米78,未婚,等等。
记录如下:
[codes=jass]
call StoreUnit(udg_GC,"LiYaPeng", "DNA",gg_unit_LiYaPeng_0001)
call StoreString(udg_GC,"LiYaPeng", "profession", “player”)
call StoreInteger(udg_GC,"LiYaPeng", "age",34)
call StoreReal(udg_GC,"LiYaPeng", "stature",1.78)
call StoreBoolean(udg_GC,"LiYaPeng", "marriage", false)[/codes]
其中udg_GC便是日记本了,准确说是名为“SexNote”的日记本,因为木子美的日记本不止一个(她也许也写了一些比较纯洁的日记),所以你必须说清楚我们鸭棚格格到底在哪个日记本上(要说明是在性爱日记上)。木子美翻开第一页,在页眉上写下LiYaPeng,然后在下面写:
DNA LiYaPeng //夹在日记本里,头发或指甲,含有人体DNA的东西
Profession player //职业 演员
age 34 //年龄 34
stature 1.78 //身高 1米78
marriage false //婚姻 否
如此以来,鸭棚格格的资料就保存下来了;记录,就这么简单。
需要特别指出的是,StoreUnit与用单位变量保存单位完全不同;当游戏缓存记录单位时,其实记录的是单位类型、携带的物品(有物品栏的单位)和英雄等级和经验值(英雄单位),单位的HP和MP则没有记录;比如我们把跟春三十娘做了几次后快要精尽人亡又染上了花柳的西门庆call StoreUnit,那么,RestoreUnit后的西门庆,又是条生龙活虎的汉子。因此,我们可把游戏缓存看作一个人体克隆机,StoreUnit其实是储存单位的DNA,然后RestoreUnit是根据该DNA克隆出来的克隆人;至于本体在StoreUnit时肾亏了,或是染上了花柳,RestoreUnit出来的克隆人却很健康——因为肾亏或花柳不会影响DNA结构。
所以这里记录的“DNA LiYaPeng”,其实是鸭棚格格的DNA;当以后木子美想念鸭棚格格了,就可以拿他DNA克隆出鸭棚格格2号来。听起来很玄,但科技发达了,克隆技术问世是迟早的事——这也是我至今保存有以前喜欢的女孩的头发的原因:)
3.查看与使用
木子美写日记,可不仅仅是自娱自乐,她是要拿给我们看的。如何查看与使用呢,我们先看HaveStored_Type系列函数(好吧,我承认讲HaveStored_Type系列函数是在凑字数^-^ 这类函数根本用不着)。
1>HaveStored_Type系列函数
函数如下
[codes=jass]HaveStoredInteger(native HaveStoredInteger takes gamecache cache, string missionKey, string key returns boolean)
HaveStoredReal(native HaveStoredReal takes gamecache cache, string missionKey, string key returns boolean)
HaveStoredBoolean(native HaveStoredBoolean takes gamecache cache, string missionKey, string key returns boolean)
HaveStoredString(native HaveStoredString takes gamecache cache, string missionKey, string key returns boolean)
HaveStoredUnit(native HaveStoredUnit takes gamecache cache, string missionKey, string key returns boolean)
HaveStoredValue(function HaveStoredValue takes string key, integer valueType, string missionKey, gamecache cache returns boolean)[/codes]
不用我依次讲解了吧~ HaveStored_Type用来判断是否有存有Type类数据的记录,比如我们用HaveStoredBoolean(udg_GC,"LiYaPeng","AIDS")来判断性爱日记上是否有鸭棚格格有无爱滋病的记录,会返回一个false,因为之前木子美没有记录过。
那么我们讲下HaveStoredValue(继续凑字)吧,它定义如下
[codes=jass]function HaveStoredValue takes string key, integer valueType, string missionKey, gamecache cache returns boolean
if (valueType == bj_GAMECACHE_BOOLEAN) then
return HaveStoredBoolean(cache, missionKey, key)
elseif (valueType == bj_GAMECACHE_INTEGER) then
return HaveStoredInteger(cache, missionKey, key)
elseif (valueType == bj_GAMECACHE_REAL) then
return HaveStoredReal(cache, missionKey, key)
elseif (valueType == bj_GAMECACHE_UNIT) then
return HaveStoredUnit(cache, missionKey, key)
elseif (valueType == bj_GAMECACHE_STRING) then
return HaveStoredString(cache, missionKey, key)
else
// Unrecognized value type - ignore the request.
return false
endif
endfunction[/codes]
其中几个bj_变量的值分别是
[codes=jass] constant integer bj_GAMECACHE_BOOLEAN = 0
constant integer bj_GAMECACHE_INTEGER = 1
constant integer bj_GAMECACHE_REAL = 2
constant integer bj_GAMECACHE_UNIT = 3
constant integer bj_GAMECACHE_STRING = 4[/codes]
因此我们把HaveStoredBoolean(udg_GC,"LiYaPeng","AIDS")换成HaveStoredValue表示就是HaveStoredValue("AIDS",0,"LiYaPeng", udg_GC)
好了,凑字结束;为虾米说讲解HaveStored_Type是在凑字呢,因为我们在使用时根本用不着HaveStored_Type:当我们读取GameCache里数据时,如果没有这项记录,那我们将得到默认值(0或null);只有在很特殊的情况下,才需要用到这函数。因此像这样的冷门函数,我们完全可以无视。
2>使用
终于,讲到如何使用GameCache了;一般说来,我们是先定义个变量,用它来保存从GameCache读出的数据。除unit外,integer、real等类型数据都是使用GetStored_Type类函数从GameCache中读取数据。
以下是几个GetStored_Type类函数:
[codes=jass]GetStoredBoolean(native GetStoredBoolean takes gamecache cache, string missionKey, string key returns boolean)
GetStoredInteger(native GetStoredInteger takes gamecache cache, string missionKey, string key returns integer)
GetStoredReal(native GetStoredReal takes gamecache cache, string missionKey, string key returns real)
GetStoredString(native GetStoredString takes gamecache cache, string missionKey, string key returns string)
RestoreUnit(native RestoreUnit takes gamecache cache, string missionKey, string key, player forWhichPlayer, real x, real y, real facing returns unit) [/codes]
我们可以这样
[codes=jass] local boolean a = GetStoredBoolean(udg_GC,"LiYaPeng", "marriage")
local integer b = GetStoredInteger(udg_GC,"LiYaPeng", "age")
local real c = GetStoredReal(udg_GC,"LiYaPeng", "stature")
local string d = GetStoredString(udg_GC,"LiYaPeng", "profession")
local unit e = RestoreUnit(udg_GC,"LiYaPeng", "DNA",Player(0),0,0,0) [/codes]
喏,现在我们就从GameCache里读出了数据,仅仅需要注意变量的类型要与GetStored_Type的类型相同即可;在这里又要再强调次读取unit类记录,其实RestoreUnit(恢复单位)是生成一个单位,跟CreatUnit差不多;区别在于CreatUnit是根据指定的单位类型生成单位,而RestoreUnit是根据之前存储的单位信息生成单位——可以这样比喻,CreatUnit类似女娲造人,RestoreUnit则像受孕怀胎。好吧,我承认这样比喻很猥琐,仅仅是为了增加教程的YD含量;其实RestoreUnit就是个克隆机,输入之前保存的DNA,克隆出相应的个体。
正如CreatUnit有CreateNUnitsAtLoc(生成单位面向角度)和CreateNUnitsAtLocFacingLocBJ (生成单位面向点)两个派生函数,RestoreUnit也有RestoreUnitLocFacingAngleBJ(恢复单位面向角度)和RestoreUnitLocFacingPointBJ(恢复单位面向点)。
好吧,我承认讲解unit类数据的存储和读取也是为了凑字,因为后面我们几乎用不到。不过呢,面对一个绝色佳丽,我们不应该一来就推倒她发泄兽欲;倘若先跟她聊聊天,培养下感情,岂不更好。所以呢,本教程跟其它教程不同,没有一来就讲GameCache的使用,而是讲了相关一些东西,让大家对GameCache这薄命红颜了解得更多。
4.修改
如果我们想修改缓存里的数据,该怎么做呢?
比如,鸭棚格格和王菲姐姐结婚了,也就是要把在“婚姻”那栏里把“未婚”改成“已婚”;那么,我们可以这样
[codes=jass] call StoreBoolean(udg_GC,"LiYaPeng", "marriage", ture) [/codes]
也就是说,在原来的位置,重新输入数据,把原来的数据覆盖即可。
5.清除
如何清除缓存呢,当清除GmaeCache中某个类的某项,也就是日记本中某页上某一行的数据,我们可以使用FlushStored_Type,如下: [codes=jass]
FlushStoredInteger(native FlushStoredBoolean takes gamecache cache, string missionKey, string key returns nothing)
FlushStoredBoolean(native FlushStoredInteger takes gamecache cache, string missionKey, string key returns nothing)
FlushStoredReal(native FlushStoredInteger takes gamecache cache, string missionKey, string key returns nothing)
FlushStoredString(native FlushStoredInteger takes gamecache cache, string missionKey, string key returns nothing)
FlushStoredUnit(native FlushStoredInteger takes gamecache cache, string missionKey, string key returns nothing) [/codes]
具体怎么使用呢,继续YD~
鸭棚格格打电话来了,说阿美啊你怎么可以记下我年龄呢,这是秘密啊让我女粉丝知道会伤心的……
于是木子美就用橡皮擦将年龄那行擦掉
[codes=jass] call FlushStoredInteger(udg_GC,"LiYaPeng", "age" ) [/codes]
~0~啊噢,我们不知道鸭棚格格的年龄了 ~0~
如果我们要清除GmaeCache中某类的所有数据,也就是日记本中某页的的数据,我们可用FlushStoredMission(native FlushStoredMission takes gamecache cache, string missionKey returns nothing),例子如下:
才刚放下电话不久,这时,鸭棚格格的弟弟鸭肠又打来电话,说我哥都结婚的人了大姐你就行行好不要写他了行不……
于是木子美只好把这页撕了
[codes=jass] call FlushStoredMission(udg_GC, "LiYaPeng") [/codes]
如此一来,关于鸭棚格格的资料就全米了~0~
那么要清空并删除整个GameCache呢,我们用FlushGameCache(native FlushGameCache takes gamecache cache returns nothing) ,好吧,最后一个例子了……
木子美年纪不小了,她决心从良,找个人嫁掉,于是,她烧了这本性爱日记……
[codes=jasss] call FlushGameCache(udg_GC) [/codes]
那么,再见了,性爱日记,谢谢你教会我们使用GameCache ^-^!
6.其它
最后我想再补充一点内容,这些内容你可看作是我凑字的无聊举动,也可以忽略掉。
当我们在GameCache中某类某项保存好一个类型的数据了,为什么在读取时,必须严格地按类型读取?
GetStoredInteger是什么意思——它是“读取XX缓存XX类XX项中的整数型数据”,我之所以强调是“整数型数据”,因为完全可以从该项目中读出其它类型数据。我们看下面例子:
木子美在日记上写下:
age —— 34 2.00 “啦啦啦” false // "age" 是那行的名字 而非记录的内容
或许你已经坐不住了,“还能这样写啊!”我先不解释为什么,往下看: [codes=jass]
local boolean a = GetStoredBoolean(udg_GC,"LiYaPeng", "age")
local integer b = GetStoredInteger(udg_GC,"LiYaPeng", "age")
local real c = GetStoredReal(udg_GC,"LiYaPeng", "age")
local string d = GetStoredString(udg_GC,"LiYaPeng", "age") [/codes]
这时,我要问了,abcd四个变量里保存的数据是什么?没错,它们就是
a=false b=34 c=2.00 d=”啦啦啦”
我们可没有规定,在日记本上某行,只能写数字或文字,类似,我们也没规定GameCache中某类某项只能存储某种类型数据,因此,下面的写法是完全合理的[codes=jass]
call StoreInteger(udg_GC,"LiYaPeng", "age",34)
call StoreReal(udg_GC,"LiYaPeng", “age”,1.78)
call StoreString(udg_GC,"LiYaPeng", "age", "啦啦啦" )
call StoreBoolean(udg_GC,"LiYaPeng", "age", false) [/codes]
这样一来,日记本上age那一栏会出现
age —— 34 2.00 “啦啦啦” false
但需要提醒的是,如果在那行添上添上个数字,如
age —— 34 2.00 “啦啦啦” false 25
这时,GetStoredInteger(udg_GC,"LiYaPeng", "age")的值,就不是34而是25了;在同一个类同一项中,同类型的数据只能保持一个,后面输入的数据,会将前面同类型的数据覆盖。
大家别会错意,我介绍这种写法,并非倡导大家“节约纸张“把日记本上每一行写满,相反我不提倡这么写,一来容易混淆,二来清除缓存数据时很不方便(FlushStored_Type函数是清除整个项而不是只清除项中某类型数据,如果你只想清楚该项中某个数据,结果会把整个项都清理掉)。
7.部分应用
之前流传一种说法,可用GameCache来检测游戏主机;究竟传说是否属实呢,我们来看最后要讲的一个函数——SyncStored_Type函数。
“听都没听过,这又是冷门函数吧,YD男你又在凑字?”
“汗,这的确是冷门函数,但讲它却不是为凑字——相信我吧,撒谎这种事,我经常做的,但偶尔也会良心发现。”
函数形式如下: [codes=jass]
SyncStoredBoolean(native SyncStoredBoolean takes gamecache cache, string missionKey, string key returns nothing)
SyncStoredInteger(native SyncStoredInteger takes gamecache cache, string missionKey, string key returns nothing)
SyncStoredReal(native SyncStoredReal takes gamecache cache, string missionKey, string key returns nothing)
SyncStoredString(native SyncStoredString takes gamecache cache, string missionKey, string key returns nothing)
SyncStoredUnit(native SyncStoredUnit takes gamecache cache, string missionKey, string key returns nothing) [/codes]
这函数作用是同步缓存中的数据,来看例子:
假设有有四个人用ABCD四台电脑联网打魔兽,他们分别是玩家一二三四;我们知道,联网的话,同步是个问题,各台电脑缓存中的数据也可能不同步;让我们看看Red_wolf举的缓存数据不同步的例子: [codes=jass]
local string s1="a"
local string s2="b"
if GetLocalPlayer()==Player(0)then
call StoreString(udg_GC,"X","Y",s1)
else
call StoreString(udg_GC,"X","Y",s2)
endif [/codes]
这段代码是让玩家一的缓存里X类Y项里存储的值是a,其它玩家的则是b。
在电脑A上,执行这段代码时候,“本地玩家是不是玩家一”,当然是了,于是电脑A的缓存里X类Y项里存储的值是a;在其它电脑上执行时,由于不满足条件,最后存储的值是b。
那么让我们把目光回到同步数据上来,何谓同步数据?同步数据便是以主机的数据为准,根据这个原理,有人居然YD地用它写出了检测主机的代码。
好了,让我们来看下,这传说中能检测主机的代码 [codes=jass]
function GetHost takes nothing returns nothing
local gamecache g = InitGameCache("map.w3v")
call StoreInteger ( g, "Map", "Host", GetPlayerId(GetLocalPlayer ())+1)
call TriggerSyncStart ()
call SyncStoredInteger ( g, "Map", "Host" )
call TriggerSyncReady ()
set udg_Host = Player( GetStoredInteger ( g, "Map", "Host" )-1)
call FlushGameCache( g )
set g = null
endfunction[/codes]
相信既然大家都看到这来了,应该有一定基础能看懂些代码了吧——让我们一起来分析。
gamecache g = InitGameCache("map.w3v") 先定义一个游戏缓存类型的局部变量g,用它来保存生成的名为“map.w3v”的游戏缓存
call StoreInteger ( g, "Map", "Host", GetPlayerId(GetLocalPlayer ())+1) 这里的GetPlayerId(GetLocalPlayer ())+1,是获得玩家索引,譬如电脑A,由于是Player(0),执行完GetPlayerId(GetLocalPlayer ())+1后,值是1(执行过程:GetPlayerId(GetLocalPlayer ())+1——GetPlayerId(Player(0))+1——0+1——1)。其它BCD三台电脑缓存g中Map类Host项中的数据分别是2、3和4
call TriggerSyncStart () 开始同步
call SyncStoredInteger ( g, "Map", "Host" ) 同步缓存g中Map类Host项中的数据,如此一来,所有电脑上该项中的数据都是1了
call TriggerSyncReady () 同步结束
set udg_Host = Player( GetStoredInteger ( g, "Map", "Host" )-1) 用个玩家型全局变量保存主机,由于之前说过,JASS中是以0为最小单位,所以这里要减1;由于1-1=0,所以最后udg_Host里保存的是Player(0)
call FlushGameCache( g ) 清空并删除缓存
set g = null 清空变量
好了,现在真相已经浮出水面,主机就是……不要看别人,就是,电脑A(模仿金田一推理)。
厉害吧,用缓存能解决检测主机这么经典的难题~
不过最后要说的是……这段代码我没实验过,老狼也不知道它是否奏效,因此……大家揍我吧,别打脸~~ (这方法在实际运用中存在误差,为了比较准确判断出谁是主机,最好多判断几次,取出现频率最大的数。)
缓存的使用,差不多全部讲完了,看,就这么简单~
综述
终于把这章讲完了,但关于GameCache的故事却还没完,这章相当于仅仅介绍GameCache这位美女的身世,关于她更多的传奇,是要留到后面跟她两位炮友,啊不,蓝颜知己一并讲述的。
GameCache的身世的确可怜。之前我讲unit类数据的存储和读取还有另一个原因,最初大家觉得GameCache除了战役传递数据外,唯一的用途GameCache来刷怪(生成和之前一模一样的单位);我为什么要把RestoreUnit比喻作受孕怀胎呢,无非是像GameCache这样的绝色美女,居然被仅仅当作传宗接代的工具,唯一的用途就是生小孩,跟母猪似的——是不是暴殄天物?
卿本佳人,奈何薄命如斯。
虽然GameCache她秀外慧中,却被那些婊子变量(韦春花,春三十娘等)抢走了男人的宠爱。直到她遇到了穷困潦倒的帅哥Return Bug,她的人生才有了翻天覆地的改观。(类似《Titanic》里Luce遇到Jack。)而在后来遇到怀才不遇的Timer后,他们三人联手干出番轰轰烈烈的千秋大业,史称“风尘三侠”。(可以把GameCache想象成红拂,Return Bug是虬髯公,Timer是李靖。)
好了,我们终于要请另一位传奇人物——Return Bug登场了(闪光灯,尖叫声在哪里~);之前说过,Return Bug改变了GameCache作为受孕工具的地位,究竟他做了什么呢,且听下回分解~~
“YD男,这就完了啊,真没意思!到底Return Bug把GameCach怎么了?”
“啊恩!下回说。”
“因为Return Bug是个变态,是个SM爱好者,他把茄子黄瓜什么东西都往GameCach身上放,使GameCach实现了存储任意类型数据的功能……”
“啊,美美姐,不要说啊~”
|
|