⑴ 如何在游戲機制中使用AI/劇情腳本
首先要說的是,並不是說AI,劇情邏輯必須非腳本語言不可,用C++也可以寫,甚至更習慣一些。但是腳本語言有腳本語言的長處,動態類型以及相當人性化的數據構造方式,特別是LUA中的表類型,似乎比較擅長描述這種復雜的AI/劇情結構。當然,為了驗證自己的想法,我也寫了4K的LUA代碼,結果覺得該腳本語言相當不容易構造簡潔的內容。AI從高自低的分別是計劃,狀態機,模式。我不知道這種劃分是基於何種角度,但是我個人的理解是狀態機最高,模式作為某個狀態下的某個決策所預定義的動作序列,而計劃,是為了實現某個目標的一組步驟的組合。那麼硬編碼的游戲循環何時調用腳本?答案是,游戲循環執行到調度NPC的AI函數的時候,該AI函數就不再做任何硬編碼,而只是簡單的dostring("gameEntitys[npc](/"update/")")。就是這么簡單,將所有的AI/劇情放置到腳本中。那麼,LUA中gameEntitys[npc]("update")是什麼意思?簡單的說,gameEntitys是一個存儲所有NPC的注冊表,gameEntitys[npc]將取得該npc的FMS函數,然後給該函數發送update消息告知npc當前的狀態進行例行更新。FMS函數對於每一個對象是唯一的,那麼比如某一類對象有共同的AI/劇情,那麼該類的每一個對象同用同樣的FMS函數的話,成員變數如何維持?要知道在LUA中模擬類還是比較麻煩的。答案是upvalue,也就是所有的對象使用同樣的函數來生成自身的FMS,該函數就是FMS_Creator(all_state,init_state)。在C++編碼中,NPC對象完成構造之後,就調用LUA載入對應的狀態機/劇情腳本,然後調用FMS_Creator為自己創建FMS函數:dofile("npc_ai.lua")--引入all_state,init_stategameEntitys[npc]=FMS_Creator(all_state,init_state)當然,NPC析構之後,你也要釋放LUA為你分配的資源gameEntitys[npc]=nil已經大概說明了如何在C++中啟動NPC的LUA邏輯代碼了,那麼如何在LUA中編寫狀態機呢?答案是表。每個表代表一個狀態,該表下的key表示該狀態接受的消息,key對應的值表示該狀態接受到key所表示的消息後要執行的決策,包括相應的動作和可能的狀態變遷。看代碼吧,最直觀的表述:state={name="attack",--狀態名enter={--進入該狀態要執行,屬於狀態的消息--func是函數,param是參數,sucess,unsucess是func執行結果所對應的狀態轉移{func=print,param="openfire"},{func=IsEnemyDie,sucess="cure"},}update={}--同enter,不過用於狀態在每一幀的更新exit={}--同enter,不過用於狀態在每一幀的更新other_msg={}--同enter,用於表示該狀態所接受的其他消息,可以有多個}在LUA中就是可以如此直觀的表示每一個狀態,其響應的消息以及函數。然後構造該npc接受的狀態集合:all_state={}all_state[state.name]=stateinit_state=state這樣子,就能傳遞到FMS_Creator中創建出自己獨一無二的狀態機函數了。那麼劇情腳本呢?其實描述了狀態機,劇情腳本是否已經有點眉頭了呢?劇情,即為計劃,每一個計劃由一系列步驟所組成。類似的,對應每個計劃的執行會有一個plan()函數,且為了達到獨立效果,該函數將會由plan_creator(all_step,first_step)生成。看參數,顯然計劃的步驟step就是類似於狀態的表,不過key方面略有不同,看代碼就明白:step={name="findbill",cond={--執行該步驟的前提條件--func是判斷條件的函數,param是判斷參數{func=IsXXX,param="xxx"},{func=IsStepFinished,param=some_step},},finish={--條件判斷成功要執行的動作{func
⑵ 《魔獸世界》懷舊服也打開了安其拉之門
流沙節杖敲響甲蟲之鑼,其拉蟲人湧向希利蘇斯,聯盟與部落的勇士並肩作戰,上古之神的低語縈繞心頭。
8月4日,《魔獸世界》懷舊服多個伺服器順利開啟安其拉大門,幾乎所有玩家都聚集在希利蘇斯,一起體驗60級最著名的光輝事件——安其拉開門。這漫山遍野的玩家數量,讓人不禁想起一年前懷舊服剛開服的盛況。那時,懷舊之夢剛剛啟航,玩家們懷揣回憶重返最初的艾澤拉斯……
8月4日,懷舊服安其拉正式開門
2017年11月的暴雪嘉年華上,暴雪公布了要開《魔獸世界》官方懷舊服的消息。經過近兩年的籌備,懷舊服在2019年8月27日正式上線。
當時,《魔獸世界》的正式服正持續走著下坡路,由於《爭霸艾澤拉斯》這個資料片缺乏新玩法、劇情混亂且職業強度不平衡,所以從2018年以來,正式服的在線人數不斷下滑,新資料片差評如潮,就連暴雪的股價都在一直下跌。很多玩家都曾擔憂這個屹立了15年之久的經典網游會就此一蹶不振,但是懷舊服的上線,很大程度上扳回了劣勢局面。
開服第一天,因為玩家人數太多,幾個初始伺服器里就出現了嚴重的排隊現象,從中午開始排隊人數就超過了1000,晚高峰的時候,哈霍蘭、范克瑞斯等人氣較高的伺服器里排隊更是達到5000人。到了第二天,最高排隊人數甚至超過了1萬,人們需要等待十幾個小時才能進入 游戲 。過多的玩家數量導致伺服器紛紛宕機,不得不臨時開了幾個新服,並且後續不斷增加伺服器數量。截至近期安其拉開門,國服已開放94個伺服器。
這是去年8月初懷舊服測試時的情況,但正式開服後也好不到哪去
許多上班族玩家早上起來排隊,晚上下班回家還在排隊
據大腳插件統計,在開服一周後,《魔獸世界》懷舊服國服晚高峰在線人數超過60萬,還有30多萬人在 游戲 外排隊。由於一些未使用插件的玩家無法被統計進來,所以國服實際人口數量顯然比90萬更多。在斗魚、虎牙等直播平台,大量《魔獸世界》主播暫停正式服的直播,轉投懷舊服的懷抱,甚至不少爐石區、主機區的主播也過來蹭一蹭這炙手可熱的流量,無不說明懷舊服的火爆程度。
最初幾周,每個種族的出生地都是人山人海,很多人生平第一次體會到了什麼叫「人比怪多」。一些有素質的玩家還呼籲人們在任務怪刷新點前排隊,形成一道靚麗的風景線。對於渴望重溫青春的老玩家來說,懷舊服讓他們又回到了15年前,對於沒體驗過《魔獸世界》60級內容的玩家來說,懷舊服則約等於一個新 游戲 ,不少正式服的玩家都好奇地過來體驗。
這只是北郡修道院一個5級的任務,要求擊殺一個有名字的小怪
開服3周時,懷舊服的霜語伺服器還發生了著名的「毛人風」事件。「毛人風」事件簡單來說,就是一位會長因一己私利,強行把該給別人的裝備分給自己,最終導致隊友退團退會。又因為這位會長是斗魚的知名《魔獸世界》主播,這番操作瞬間點燃了觀眾的怒火,進而又被所有《魔獸世界》玩家鄙視。
那幾天絕對是懷舊服最熱鬧的日子,無數其它伺服器甚至是不玩懷舊服的玩家慕名而來,在霜語部落建立小號,趕到奧格瑞瑪圍觀。
狂人與風經此一役,從頂級《魔獸世界》主播淪為過街老鼠
懷舊服帶來的人氣大大超出暴雪預期,購買月卡的玩家明顯增多,連帶著公司股票也水漲船高,扭轉了此前的下降趨勢。動視暴雪股價在懷舊服上線一天內便暴漲近6%,這是自2018年11月以來的最高峰。
盡管如此,《魔獸世界》的總監Ion Hazzikostas卻看得非常透徹,他沒有因一時的火爆就把團隊重心放到懷舊服,而是加大力度開發正式服9.0版本的內容,並讓新資料片《暗影國度》借鑒了許多經典舊世的設定,比如等級壓縮到60級、大量被刪除的經典職業技能回歸,全新的「噬淵」地區難度很高,如同懷舊服練級期間那般硬核。Ion Hazzikostas還把懷舊服當做一個給正式服過渡和引流的平台。畢竟, 游戲 的發展要向前看,懷舊服暫時的成功只是正式服從前的幻影。
2018年暴雪嘉年華的手機事件對暴雪股價影響極大
60級時期的《魔獸世界》升級速度很慢,按照上班族玩家的升級速度,從出生到滿級最少也要1個月,更別說開服初期排隊和搶怪現象很嚴重。等到大部分玩家都滿級時,2019年的十一長假也已經過完了。玩家們的 游戲 內容也從做任務練級變成了組團打副本,黑石深淵、三大副本、黑龍門任務、熔火之心傳送任務,這是每個滿級玩家都要經歷一遍的流程,之後我們便可以進入熔火之心和奧妮克希婭的巢穴,體驗《魔獸世界》的核心內容——團隊副本。
大家很快就發現,15年前這些頗有難度的團本,放在今天其實是小兒科,因為15年來《魔獸世界》的插件在更新,玩家技術在進步, 游戲 攻略也比以前更加成熟,40個路人組團即可輕松推倒拉格納羅斯。事實上,懷舊服開服不到6天,就有歐洲團隊拿下了拉格納羅斯首殺,這個團隊中有三分之一的人甚至尚未滿級。
開服5天,歐服公會APES首殺懷舊服「大螺絲」,此時,大多玩家還在開荒死亡礦井
玩家大部隊剛剛滿級或即將滿級的這段時間是懷舊服的黃金時期,排隊有增無減, 游戲 熱度比剛開服時還高。每個高級副本都能瞬間組滿5人,每處刷怪聖地都要憑本事搶怪,聯盟和部落在世界各地展開小規模團戰,每天晚上幾乎都有大型屠城活動。
玩家們熱情鑽研 游戲 ,把許多15年前的老玩法發揚光大:42級法師單刷祖爾法拉克墓地升級;防戰不帶盾,變身仇恨拉滿的「狂暴T」;獨狼盜賊潛行不打怪,純靠偷竊賺大錢;史詩弓獵人利用仇恨分離技巧,單刷熔火之心精英怪……
當年開發單刷的人怎麼也沒想到,這個地方日後成了腳本的溫床
最讓玩家熱情高漲的地方在於,因為團本簡單、組隊容易,任何人都有機會獲取團本中的頂級裝備。當時最強力的幾把武器——放血者、碧空之歌和毀滅之刃人人皆可獲得,只要你積極參與團本活動。這一點是正式服和其它同類網游中望塵莫及的。相反,在正式服你想入手最頂級裝備,要在超高難度的史詩副本里滅得死去活來,付出無數時間和心血。
與此同時,便當化的團本還催生了金團的火熱。金團與傳統的公會DKP團不同,它以 游戲 貨幣代替出勤分數,只要玩家口袋裡有足夠的金幣,就能買任何看中的裝備。金團最大的缺點是團員們互不相識,所以大家沒有 情感 基礎,缺乏團隊攻堅能力,在高難度副本的壓力下極易散團,但懷舊服不存在這個問題,懷舊服壓根就沒有高難度副本。
2019年10月就能6人通黑龍巢穴,側面反映了副本難度
於是,當副本進度不再是傳統DKP團的優勢後,大部分玩家都傾向於選擇金團。因為金團更加自由,不受固定團隊約束,很適合工作繁忙還要顧家的中年玩家。而且金團打出的裝備是直接用 游戲 幣購買,只要你金幣夠多,裝備獲取速度會比大多數人更快。最重要的是,金團打完是可以分錢的,如果你有幸遇到一擲千金的土豪,那麼你分得的金幣或許比你消費的還要多。
當然,金團火爆並不意味著DKP團無人問津,後者固然有更多約束,但人員固定,歸屬感更強,更容易收獲 游戲 中的友誼。二者在懷舊服中分庭抗禮,讓每個玩家都能找到適合自己的團隊。
2019年10月到12月期間,懷舊服在線人數、直播流量、 游戲 熱度都達到頂峰,每個玩家都能在 游戲 中找到目標和樂趣。只不過伴隨著金團的崛起, 游戲 環境也即將發生變化。
金團中流傳著一句至理名言:金團金說話。只要你有錢,戰士也可以搶法師的套裝,牧師也能夠收藏盜賊的匕首。
這種事情在國服金團里可不少見。2019年11月6日,祈福伺服器的一位亡靈盜賊,因不爽團里另一位盜賊與他競拍夜幕胸甲,先怒花2萬金拍下胸甲(胸甲實際價值500金),後又出1萬金讓團長把那個競爭者踢出團隊。次日,布魯伺服器的一位獸人戰士玩家,先花7500金買了把毀滅之刃(對戰士幾乎無用的匕首),然後讓團里的盜賊Roll點比大小,誰點數最小就把毀滅之刃送給誰。他之所以這么做,只是因為覺得好玩而已。
提布市值約10萬金,是出血賊神器,然而圖里這位是個法師
這就是懷舊服的金團環境,有錢就是大爺,沒錢只會被人瞧不起。即便大家老老實實只買自己用的裝備,那些極品還是會被競拍者飆到天價。3000金的法師T2腿、8000金的碧空之歌、1萬金的毀滅之刃等等屢見不鮮,等以後開了黑翼之巢,還會有3萬金的奈薩里奧之淚和16萬的逐風者禁錮之顱。
那麼問題來了,這么多金幣究竟是從哪裡來的?60級時期的《魔獸世界》里沒有日常任務,金幣獲取途徑非常有限。大部分刷錢的方法都比較累,需要玩家長時間重復枯燥的操作,普通人既沒那個精力也沒那個時間,很多人滿級後連900金的高級坐騎都買不起。但是,沒有金幣,在金團里你就只能眼睜睜看別人拿裝備,可能很多個CD後,極品裝備依然離你遙遙無期,大家都渴望有一個快速獲得大量金幣的方法。
有需求自然就有市場,玩家們很快發現一些 游戲 交易平台上推出了懷舊服金幣交易服務,淘寶和微信上也陸續出現了大量金幣賣家,讓玩家可以用人民幣購買懷舊服金幣。這無疑就是最快的金幣獲取方式,不少人開始在這些平台上買金。去年9月的時候,滿級玩家還不多,金幣產出有限,1金幾乎就等於1元人民幣。10月底,滿級玩家漸漸多起來,比例就下降到1比0.35左右,此後便一直保持下跌趨勢。隨著金團日益盛行,買金的玩家也日益增多,金團里的土豪老闆出價也越來越高。
這是某些平台今年8月的金價比例,已經比高峰時便宜了20倍
「風臉」賣50萬金或許是工作室自導自演,但賣十幾萬在懷舊服里很常見
早在開服之初,就有很多人意識了懷舊服存在的巨大商機。舉例來說,一個60級法師在血色修道院帶4個小號升級,1個小時便可收獲帶刷費加小怪拾取金錢總計100金左右,刷10個小時就有大約1000金到賬。1000金幣在去年11月能賣400元。換句話說,只要你能忍受每天10小時枯燥的重復勞作,一個月就有1萬人民幣的收入。在現實生活中,有多少人敢保證自己每天工作10小時,就能穩定月入過萬呢?現在一款簡單的網游就能做到,真金白銀,無任何風險。
嘗到了甜頭,嗅到了利益,他們變本加厲地在 游戲 中刷錢賺金。事實上,有相當一部分人就是沖著這個目的才玩懷舊服的,這種為賺錢來玩《魔獸世界》的玩家就是金幣農夫。金農玩家一切向錢看,在金團里喜歡哄抬裝備價格、誘導土豪飆價,自己卻不會出一分錢。這類玩家在懷舊服中還不在少數,久而久之,金團的風氣就變得無比銅臭,極品價格一路飆升,出價低者遭人奚落,更有人直接在團里買賣金幣。
本來很好的團隊模式,被利慾熏心的人糟蹋
為了賺錢,部分金農甚至開始不擇手段。他們在拍賣行里故意擺放一口價超高而競標價正常的商品,讓粗心的人花上幾千金買一組治療葯水。他們利用 游戲 交易系統的漏洞,在與其他玩家面對面交易物品時,惡意撤回自己的商品,空手套白狼。他們中那些有指揮才能的人,會組織金團然後黑金,將拍賣裝備所得的金幣全部據為己有。
一次金團收入少說也有幾萬金,他們快速把這些金幣轉換為人民幣,然後重新買個滿級號繼續開金團——買號花的錢在巨大的黑金利益面前根本不值一提。
各種騙術爭奇斗艷
只有你想不到,沒有人做不出
金農的存在在一定程度上惡化了懷舊服的 游戲 環境,但他們作為個體玩家,終究難以動搖 游戲 的根基。真正讓懷舊服由盛轉衰的,是盤踞在艾澤拉斯深處的 游戲 工作室。
個體玩家尚且能抓住懷舊服的賺錢機會,作為專業團體的工作室又怎會對這塊大蛋糕無動於衷?工作室在開服之初就展開了自己的業務,首先是升級代練,然後是帶刷高級副本,等到大家都滿級了,就開始提供打裝備、刷材料等服務。他們會多開 游戲 賬號,占據高級地圖的野外資源,讓普通玩家難以獲取稀有材料。最早的金幣買賣服務也是工作室一手打造,為了激發大家的消費慾望,他們還在 游戲 論壇大肆宣揚金團、貶低DKP團,誘導玩家買金揮霍。
上面這些只不過是工作室投機取巧的小把戲,跟金農玩家的行為沒多大區別,他們真正的殺手鐧是數量龐大的AI腳本。這些AI腳本由統一的電腦程序控制,可以精準、有效率且不知疲倦地執行各種 游戲 操作,從打怪到採集,從交易到跑屍,這些由腳本操縱的 游戲 賬號幾乎無所不能。
全自動腳本航班,霸佔世界頻道,沒坐過懷舊服等於白玩
腳本號第一次大規模出現在玩家視野里是在去年11月中旬。有玩家在塔納利斯地圖發現,從加基森到祖爾法拉克副本門口這段路上,總是有大量裝備極差、騎著小馬的亡靈法師來回跑動。他們的行進路線完全一致,名字都是生僻字,而且打不還手罵不還口,明顯不是真人操控。
這些就是工作室的腳本號,通常一台電腦就可運行30個賬號,它們要去祖爾法拉克刷錢,所以職業都是刷怪能力最強的法師,背包裝滿後它們會自動返回加基森,把雜物賣掉再繼續刷錢,周而復始。
葬影村是瑪拉頓腳本法師必經之地,因為刷完副本要來這兒賣東西
在此之後,細心的玩家漸漸發現,野外所有黑蓮花(懷舊服最珍貴的草葯)刷新點都有潛行的小號蹲守。許多刷材料、刷圖紙的地圖,都有行動高度相似的獵人法師在機械性地打怪。各種五人副本外都出現了跟祖爾法拉克一樣的腳本隊伍,全天候24小時執行編輯好的命令。
不知不覺,工作室的腳本大軍已滲透到懷舊服各個角落,它們行為未必一致,目的卻完全相同,就是不停地刷錢,為工作室產出大量金幣。單個腳本號刷錢效率可能比不上正常玩家,但腳本不需要休息,普通人用8小時刷800金,腳本就用24小時刷1000金,而且一個工作室員工就可以控制上百個腳本。
每一個墓碑都是一個陣亡的腳本號,不少人來瑪拉頓門口刷榮譽
各種稀少值錢的 游戲 物品被腳本大面積產出,壓榨了普通玩家刷錢的利益,大量金幣流入市場,引發物價波動,擊潰了 游戲 的經濟。腳本號還可以充當PvP對手,專門用來給PvP玩家刷榮譽等級,讓不花錢的玩家再怎麼努力,也得不到高級軍銜,PvP和戰場從此淪為刷子 游戲 。
不僅如此,數量龐大的腳本大軍還占據了伺服器資源,讓很多人不得不排隊進 游戲 ,影響正常玩家 游戲 體驗。工作室們如附骨之疽,拚命汲取懷舊服的每一滴血。
練級打本PvP,工作室可為你解決一切,有時你不禁懷疑,到底是誰在玩你寶貴的賬號
當新冠疫情爆發,全國人民居家隔離時,工作室的腳本大軍變得更加猖獗。它們不再隱藏和掩飾自己的身份,大大方方從主城趕往各個刷錢地點,瑪拉頓副本門口擠滿了這些行屍走肉,人數比在線高峰的鐵爐堡還多。同時,在各大主城的郵箱旁,出現了許多1級小號,它們會自動交易每個來到郵箱旁的人,目的是欺騙粗心的玩家,劫持交易物品。這說明工作室為了斂財已近乎喪心病狂,腳本、黑金、詐騙甚至外掛,無所不用其極。
有的人可能會疑惑,腳本也好,外掛也罷,這么明顯的危害 游戲 的東西,運營者怎麼不管管呢?事實是,他們在對待工作室腳本的問題上幾乎沒有實質性作為。從開服到2020年5月,官方累計凍結過15萬個 游戲 賬號,這個數量相對懷舊服存在的腳本號而言是九牛一毛,而且大多都只凍結1個月,解封了又是一條刷錢好漢。暴雪針對腳本大軍做了兩次熱修,先增加了黑蓮花刷新地點,又對玩家設立了一個每日30次副本的限制,但收效甚微。
關鍵的是,腳本號跟普通玩家一樣,進 游戲 需要花錢充月卡,從 游戲 的改善舉動看,50萬個腳本跟50萬個真人玩家都能帶來收入,所以大多時候睜隻眼閉隻眼就算過去了。
對腳本的打擊力度依然遠遠不夠
到最後,工作室的存在已經讓 游戲 環境徹底惡化,動搖了懷舊服的根基——玩家的熱情。玩家不買金很難在金團里拿裝備,PvP軍銜也沒法同花錢買腳本的人競爭。野外每張地圖上都充斥著腳本大軍,玩家辛苦打到的材料變得一文不值。
就算是這樣,如果能積極嚴厲地打擊工作室,玩家的體驗也會好很多,可惜並不是如此。其實我們很早就可預見,《魔獸世界》懷舊服這種火爆又容易賺錢的網游,如果官方不採取有力的制裁手段,金農和工作室必然會把它污染成「腳本世界」,只是大家原本都期望這一次結局能有所不同。
金農遍地、腳本肆虐、 游戲 環境被污染、暴雪官方不作為,很多真心來體驗 游戲 的玩家感到心灰意冷,萌生退意。另外,60級的《魔獸世界》相對於後續資料片,可玩內容本就不多,沒有競技場、沒有坐騎幻化、沒有大秘境,只有每周一次的團本,很容易讓人厭倦。再加上疫情結束、全國復工,人們開始為工作忙碌,不少玩家終於選擇了AFK,一如他們當初離開正式服那樣。
今年6月的懷舊服里已能明顯感到玩家數量大幅減少,最直觀的例子就是晚上金團數量已大不如前,94個伺服器里沒有一個需要排隊,滿負載的屈指可數,各大公會在線人數也比去年少多了。不過,腳本們依然在瑪拉頓和厄運之槌等地忙碌,籌備各種物質,因為7月底懷舊服要迎來最後一波熱度——安其拉開門事件。到時可能會有不少人回歸,體驗這場當年錯過的史詩。
安其拉開門是《魔獸世界》里首個伺服器級的大規模世界事件,它本質上是個副本前置任務,但需要全服聯盟、部落玩家齊心協力完成。開門事件分為兩部分,一部分是針對整個伺服器的物資捐獻,另一部分則是精英玩家需要完成的一些列史詩任務。同時,物資捐獻進度的快慢直接影響伺服器開啟團本的速度,精英玩家們能否完成任務則關繫到自己能不能拿到傳奇坐騎——黑色其拉作戰坦克。
完成開門任務的玩家可獲得黑色其拉作戰坦克,《魔獸世界》里最珍貴的坐騎之一
對工作室來說,這當然是不容錯過的大蛋糕,工作室的腳本群里曾曝光過一些黑蟲子坐騎訂單,價格從10萬到30萬不等。同時,為了盡快幫「老闆」完成開門任務,工作室還專門僱人在希利蘇斯24小時輪班刷怪、打材料,很多伺服器即便到了凌晨,也依然能看到他們孜孜不倦的身影。
為了延緩開門時間,讓自己順利完成黑蟲子的訂單,他們還故意去中立拍賣行攔截捐獻物資,甚至對那些捐獻積極的玩家惡語相向,以「10萬元買你一隻手」相威脅。
工作室群里流傳的一份魔獸合同,16萬元成為開門英雄
席瓦萊恩服的某工作室宣言,可能只是氣話和玩笑,但也暴露了其嘴臉
可以預見,利用新一撥 游戲 熱度,工作室又可以賺得盆滿缽滿。金農也不會放過這個重要的賺錢機會,金團更是要用全新的極品裝備榨乾每一位團員的荷包。等開門熱度褪去,回歸體驗的玩家還是會失望離去,因為那個排隊殺怪、互惠互助的懷舊服,那個懵懵懂懂、單純天真的《魔獸世界》,已經再也回不去了。
懷舊服版本更新至此,再往後就只剩一個納克薩瑪斯了,60級的內容很快就將耗盡。其實,作為一個15年前的老 游戲 ,懷舊服存在的意義本就是讓我們重溫經典,而非再創輝煌。對於想靠它賺錢的人來說,熱度消退就是離場的時候,對於真正想懷舊的老玩家來說,懷舊夢或許才剛剛開始。
《燃燒的遠征》已經提上議程,阿爾薩斯的怒火還會遠嗎?
最後,在2020年3月28日,暴雪曾向《魔獸世界》玩家發出過一個問卷調查,內容是懷舊版《燃燒的遠征》應採用怎樣的升級機制,並提供了數個方案供玩家選擇。很顯然,這是在為《燃燒的遠征》懷舊服做准備,相信等納克薩瑪斯也被玩家攻克後,黑暗之門就會開啟了。當燃燒再遠征、巫妖王再怒之時,等待老玩家的是過去的美好回憶,還是賺金的牛鬼蛇神呢?
⑶ illustrator腳本怎麼用
文件菜單,腳本,打開就會有操作面板或者對話框。AI有不少好腳本,例如印前面板、pdf導入腳本等等吧
⑷ 如何在游戲機制中使用AI/劇情腳本
首先要說的是,並不是說AI,劇情邏輯必須非腳本語言不可,用C++也可以寫,甚至更習慣一些。但是腳本語言有腳本語言的長處,動態類型以及相當人性化的數據構造方式,特別是LUA中的表類型,似乎比較擅長描述這種復雜的AI/劇情結構。當然,為了驗證自己的想法,我也寫了4K的LUA代碼,結果覺得該腳本語言相當不容易構造簡潔的內容。
AI從高自低的分別是計劃,狀態機,模式。我不知道這種劃分是基於何種角度,但是我個人的理解是狀態機最高,模式作為某個狀態下的某個決策所預定義的動作序列,而計劃,是為了實現某個目標的一組步驟的組合。
那麼硬編碼的游戲循環何時調用腳本?答案是,游戲循環執行到調度NPC的AI函數的時候,該AI函數就不再做任何硬編碼,而只是簡單的dostring("gameEntitys[npc](/"update/")")。就是這么簡單,將所有的AI/劇情放置到腳本中。
那麼,LUA中 gameEntitys[npc]("update")是什麼意思?簡單的說,gameEntitys是一個存儲所有NPC的注冊表,gameEntitys[npc]將取得該npc的FMS函數,然後給該函數發送update消息告知npc當前的狀態進行例行更新。
FMS函數對於每一個對象是唯一的,那麼比如某一類對象有共同的AI/劇情,那麼該類的每一個對象同用同樣的FMS函數的話,成員變數如何維持?要知道在LUA中模擬類還是比較麻煩的。答案是upvalue,也就是所有的對象使用同樣的函數來生成自身的FMS,該函數就是FMS_Creator(all_state, init_state)。
在C++編碼中,NPC對象完成構造之後,就調用LUA載入對應的狀態機/劇情腳本,然後調用FMS_Creator為自己創建FMS函數:
dofile("npc_ai.lua") --引入all_state,init_state
gameEntitys[npc]=FMS_Creator(all_state, init_state)
當然,NPC析構之後,你也要釋放LUA為你分配的資源
gameEntitys[npc]=nil
已經大概說明了如何在C++中啟動NPC的LUA邏輯代碼了,那麼如何在LUA中編寫狀態機呢?答案是表。每個表代表一個狀態,該表下的key表示該狀態接受的消息,key對應的值表示該狀態接受到key所表示的消息後要執行的決策,包括相應的動作和可能的狀態變遷。看代碼吧,最直觀的表述:
state = {
name = "attack", --狀態名
enter = { --進入該狀態要執行,屬於狀態的消息
--func是函數,param是參數,sucess,unsucess是func執行結果所對應的狀態轉移
{func=print, param="open fire"},
{func=IsEnemyDie, sucess="cure"},
}
update={} --同enter,不過用於狀態在每一幀的更新
exit = {} --同enter,不過用於狀態在每一幀的更新
other_msg = {} --同enter,用於表示該狀態所接受的其他消息,可以有多個
}
在LUA中就是可以如此直觀的表示每一個狀態,其響應的消息以及函數。然後構造該npc接受的狀態集合:
all_state = {}
all_state[state.name]=state
init_state=state
這樣子,就能傳遞到FMS_Creator中創建出自己獨一無二的狀態機函數了。
那麼劇情腳本呢?其實描述了狀態機,劇情腳本是否已經有點眉頭了呢?劇情,即為計劃,每一個計劃由一系列步驟所組成。類似的,對應每個計劃的執行會有一個plan()函數,且為了達到獨立效果,該函數將會由plan_creator(all_step, first_step)生成。
看參數,顯然計劃的步驟step就是類似於狀態的表,不過key方面略有不同,看代碼就明白:
step = {
name="find bill",
cond = { --執行該步驟的前提條件
--func是判斷條件的函數,param是判斷參數
{func=IsXXX, param="xxx"},
{func=IsStepFinished, param=some_step},
},
finish = { --條件判斷成功要執行的動作
{func
⑸ 用世界編輯器WE把一部分技能改過後,為什麼電腦不會用改過的技能
這是由於你未設置AI(人工智慧),所以他對不是系統原來的技能就無法識別,當然也就無法使用啦,至於如何解決這一問題,其實我也一知半解,我所能做的就是為你找一篇關於如何設置AI(人工智慧)的文章,至今我也無法完全學會,太深奧了...剩下的就靠你努力啦,這篇文章將幫助你製作一個簡單但是十分酷的英雄對戰地圖的人工智慧。
這個你將學習的人工智慧系統不是非常完美。我們將創建的是一個可以攻擊其它英雄、可以自己揀物品、學習和使用技能的人工智慧系統,但是還是無法與人類玩家相比。
但是,當你學習了基礎的知識以後你應該可以自己改進它。
前提需要:
JASS基礎----這篇文章使用JASS來製作示例,所以你必須了解JASS。在理論上它也可以在T中做出來,但是我不推薦那樣做,因為用T來製作可能導致內存泄露、大量不必要的代碼以及在T中是無法使用JASS的返回值BUG和游戲緩存系統的。如果你不熟悉JASS,請預先補充一下你自己的JASS知識。你同樣必須知道什麼是代碼行,如果你不知道的話,請補充自己的知識。
基於游戲緩存以及返回值BUG的系統
注意事項:
-我們將要製作的AI系統達不到人類的水平,但是比什麼都沒有強。而且我認為當你理解了基礎以後可以自己改進它。
-你不用完全按照我說的做;我按做我的想法做,但是如果你的想法更好或者你覺得自己的做法更舒服,請按照你自己的想法做。我並不完美,這篇文章也不可能完美,但是我希望它可以對你有所幫助。
-你可以使用在我的演示地圖裡面的AI系統而不自己動手(如果你那樣做了,請告訴我一聲),但是我建議你自己動手寫,因為地圖可能很復雜而且你可以自己動手寫一個AI系統中學到更多的知識。
初始化部分:
首先在WE中創建一個觸發條件為"玩家1-玩家1(紅色)離開游戲"的觸發器,然後把它轉換為JASS。我們需要這個觸發器來監視玩家離開游戲,那樣我們才能為這個玩家開啟人工智慧。現在它只監視一號玩家離開游戲,所以我們在正式地圖中需要使用一個循環來監視從0-11號的玩家。
我們希望這個AI系統可以使用技能。聽起來似乎很難,其實很簡單。我們只需要使英雄學習技能,那麼他們就可以自己使用。
注意:電腦控制的英雄釋放自定義技能的情況總是和它釋放這個自定義技能的基礎技能的情況相同(這里翻譯的有點含糊不清,自定義技能的基礎技能的意思是....基礎技能是游戲本身帶有的技能,自定義技能都是以某個基礎技能為基礎的...這樣說做過圖的大大應該可以明白吧?).所以如果你的自定義技能是以沉默為基礎技能的,電腦控制的英雄就會在對戰地圖中應該使用沉默的情況使用這個技能。千萬不要將技能以"通魔(Channel)"為基礎,因為電腦從來不會使用它們,即使改變技能的OrderString也沒有什麼用。
為了知道每個英雄都擁有什麼技能,我們創建了一個游戲緩存(game cache)來保存它。
在演示地圖中我的觸發器在地圖的初始化部分創建了一個游戲緩存並將它保存在全局變數 udg_GameCache 中。需要注意的是緩存必須在我們使用它之前初始化,所以我在地圖的初始化時間中創建了它。
在我的地圖中我寫了一個函數SetupSkills.在這個AI觸發器的InitTrig函數中我使用了庫函數ExecuteFunc來開啟另外一個線程執行這個函數。這是為了防止地圖的初始化時間太長。
jass: Copy code
我的SetupSkills函數如下:
function SetupSkills takes nothing returns nothing
local string h // Create a local string variable
// Paladin // Here we』ll initialise the Paladin』s skills, repeat this for all other heroes
set h = UnitId2String('Hpal') // Store the returned value of UnitId2String(『Hpal』) in the local
call StoreInteger(udg_GameCache, h, "BaseSkill1", 'AHhb') // One of his base skills is Holy Light, store it as 「BaseSkill1」
call StoreInteger(udg_GameCache, h, "BaseSkill2", 'AHds') // Store Divine Shield as 「BaseSkill2」
call StoreInteger(udg_GameCache, h, "BaseSkill3", 'AHad') // Store Devotion Aura as 「BaseSkill3」
call StoreInteger(udg_GameCache, h, "UltimateSkill", 'AHre') // Store Resurrection as his 「UltimateSkill」
… // Repeat for each Hero.
endfunction
接著是我的AI觸發器的InitTrig部分:
function InitTrig_AI takes nothing returns nothing
local integer i = 0
set gg_trg_AI = CreateTrigger( )
loop
exitwhen i > 11
call ( gg_trg_AI, Player(i) )
set i = i + 1
endloop
call TriggerAddAction( gg_trg_AI, function PlayerLeaves )
call ExecuteFunc("SetupSkills")
endfunction
為英雄開啟AI系統
為了控制AI我們使用了一個定時器(timer).我寫了一個函數StartAI來獲取一個單位的類型:英雄(請在演示地圖中查看這個函數)。這個函數只是創建一個定時器,並且"綁定"在這個英雄身上,並且開啟這個定時器。
這是演示地圖中的空的AILoop函數和StartAI函數(這里給的只是一個框架,等下我們將展示一些動作函數,但是你起碼必須先把function和endfunction寫上去以保證WE不報錯) :
jass: Copy code
function AILoop takes nothing returns nothing
endfunction
function StartAI takes unit hero returns nothing
local timer m = CreateTimer()
call AttachObject(m, "hero", hero)
call TimerStart(m, 0, false, function AILoop)
set m = null
endfunction
注意,我的這個StartAI函數通過將periodic參數設置為false來達到使定時器只執行一次的目的(以後我們還會來討論它的).
現在,你就可以在你的英雄選擇系統中當由電腦控制的玩家選擇英雄時調用這個函數,並且在玩家離開游戲的時候執行這個函數。檢測玩家是否擁有一個英雄,如果它擁有,調用這個函數來開啟那個英雄的AI系統。例如:
jass: Copy code
function PlayerLeaves takes nothing returns nothing
local player p = GetTriggerPlayer()
call DisplayTextToForce(bj_FORCE_ALL_PLAYERS, GetPlayerName(p)+" has left the game.")
if udg_Hero[GetPlayerId(p)] != null then
call StartAI(udg_Hero[GetPlayerId(p)])
endif
set p = null
endfunction
注意:這個函數將使AI系統控制離開的玩家的英雄,但是這也不是必要的,你也可以做別的事情。
使這個AI做些什麼
當定時器終止的時候我們希望它做了這些事情:
●如果英雄死亡,等待他復活。
●如果英雄將要死亡,命令他移動到地圖中心的生命泉水。
●如果英雄狀態良好,檢測是否有敵人在附近。如果有,則命令英雄攻擊它。 否則就檢測是否有物品在附近,如果有的話,發送一個巧妙 的命令讓英雄揀起它。然後命令英雄巡邏到地圖的一個隨機坐標。
●如果英雄是活著的而且有未使用的技能點,學習一個技能。
我們由變數的聲明開始。注意在我函數裡面的實變數"e",它定義了在定時器再次啟動前所經過的時間,這樣我們就可以在英雄死亡的時候等待短一點的時間,而在他攻擊的時候等待長一點的時間。這個變數初始化值為5。
jass: Copy code
局部變數的聲明:
function AILoop takes nothing returns nothing
local string a = GetAttachmentTable(GetExpiredTimer())
local unit h = GetTableUnit(a, "hero")
local rect i
local location r
local real x = GetUnitX(h)
local real y = GetUnitY(h)
local group g
local boolexpr b
local boolexpr be
local unit f
local string o = OrderId2String(GetUnitCurrentOrder(h))
local real l = GetUnitState(h, UNIT_STATE_LIFE)
local real e = 5
…
我們由檢測英雄是否死亡開始,如果他死亡了,設置"e"為1.5(因為在復活以後等待5秒的時間太長了,我們並不想這樣).
當英雄的生命值"l"為0時,設置"e"為1.5來使定時器更加頻繁的檢測英雄是否復活.
…
if l <= 0 then
set e = 1.5
endif
…
接著我檢測英雄的生命是否低於最大生命值的20%.如果是的,命令英雄移動到生命泉並且設置"e"為3.
當英雄的生命值少於最大生命值的20%時,命令英雄移動到生命泉的位置。
…
if l < GetUnitState(h, UNIT_STATE_MAX_LIFE)/5 then
call IssuePointOrder(h, "move", GetUnitX(gg_unit_nfoh_0001), GetUnitY(gg_unit_nfoh_0001))
set e = 3
…
如果英雄的狀態良好,檢測他是否處在一個普通命令中(防止它打斷了通魔技能).如果是一個標准命令,我們再檢測在500的半徑內是否有敵人存在.如果存在敵人,簡單的發出一個攻擊命令(不要改變"e"的值,5秒對於這個情況剛剛好).
jass: Copy code
function AIFilterEnemyConditions takes nothing returns boolean
return GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0 and IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(GetAttachedUnit(GetExpiredTimer(), "hero")))
endfunction
…
else
if ((o == "smart") or (o == "attack") or (o == "patrol") or (o == "move") or (o == "stop") or (o == "hold") or (o == null)) then
set g = CreateGroup()
set b = Condition(function AIFilterEnemyConditions)
call GroupEnumUnitsInRange(g, x, y, 500, b)
set f = FirstOfGroup(g)
if f == null then
…
else
call IssueTargetOrder(h, "attack", f)
endif
call DestroyGroup(g)
call DestroyBoolExpr(b)
endif
…
如果沒有敵人存在,再檢測物品.如果發現物品,再檢測是否為一個提升狀態的物品.如果不是,檢測英雄物品欄是否有空欄,有的話就命令英雄將它揀起來.
jass: Copy code
function AISetItem takes nothing returns nothing
set bj_lastRemovedItem=GetEnumItem()
endfunction
function AIItemFilter takes nothing returns boolean
return IsItemVisible(GetFilterItem()) and GetWidgetLife(GetFilterItem()) > 0
endfunction
function AIHasEmptyInventorySlot takes unit u returns boolean
return UnitItemInSlot(u, 0) == null or UnitItemInSlot(u, 1) == null or UnitItemInSlot(u, 2) == null or UnitItemInSlot(u, 3) == null or UnitItemInSlot(u, 4) == null or UnitItemInSlot(u, 5) == null
endfunction
…
if f == null then
set i = Rect(x-800, y-800, x+800, y+800)
set be = Condition(function AIItemFilter)
set bj_lastRemovedItem=null
call EnumItemsInRect(i, be, function AISetItem)
if bj_lastRemovedItem != null and (GetItemType(bj_lastRemovedItem) == ITEM_TYPE_POWERUP or AIHasEmptyInventorySlot(h)) then
call IssueTargetOrder(h, "smart", bj_lastRemovedItem)
else
…
endif
call RemoveRect(i)
call DestroyBoolExpr(be)
…
如果物品欄沒有空位,或者沒有發現物品,則命令英雄到一個隨機地點尋找新的目標.
…
else
set r = GetRandomLocInRect(bj_mapInitialPlayableArea)
call IssuePointOrderLoc(h, "patrol", r)
call RemoveLocation(r)
…
⑹ HTML,CSS,JS,AI,DW,FLASH、Dreamweaver、html語言這些分別是干什麼用的
html是靜態頁(網頁),css是網頁樣式,js是JavaScript縮寫,是一種計算機腳本語言,AI是illustrator文件存儲格式,主要是繪制圖形的!DW是dreamweaver網頁編程的!flash是製作動畫的,Dreamweaver就是DW的縮寫!
⑺ 星際爭霸
先來介紹一下StarEdit,簡稱SE
是星際自帶的一個編輯器
功能比以往任何游戲的編輯器都全面
Blizzard就是用SE做自己的任務關的
有些人的SE用不了,請下載這個
裡面有2個dll文件,一個是光碟版的 storm.dll
一個是硬碟版的 storm.dll
做地圖時用光碟版的,在浩方玩時用硬碟版的就行
(用那個版就把那個改名為 storm.dll,放在星際目錄下)
1。08b的正版
SE可以支持8個玩家,每個玩家一個種族,需要一個開始地點才能保存(start location)
。。。。
這是基本常識,初學者都會,我就不說了
現在來介紹層(layer)
層裡面有好幾個選項
其他的大家都知道
重點的是地點層(location)
這是RPG地圖不可缺少的
選中地點層,你可以用滑鼠拖一個框,裡面就是地點了
你可以給這個地點改名
比如改成學校,家裡。。。
這對後面要講的觸發器是有很大聯系的
有的觸發必須依賴地點而存在
接著講Force,玩家組隊
你可以把8個玩家分成4隊
還可以給每個隊改名
結盟就是這組玩家是盟友
結盟勝利就是但一個玩家勝利,全組勝利
任意開始地點就是這組玩家的開始地點是隨機的
(其實是玩家隨機)
第3個要講的是 Player Setting(玩家設定)
它在player菜單下
在這里,你可以設定玩家由誰扮演
是人(human),還是電腦(computer),還是中立的,(nautral)
或是走近就可以變成自己的兵的(resuable)
在unit的頁面下,你可以設定那個玩家可以造什麼兵
不可以造什麼兵
在upgrade下,你可以設定玩家的初始升級資料
和允許/禁止玩家的某種升級
Speical Ablities就是魔法設定了
如果你理解了第一章的內容
已經有一定基礎了
可以開始進階內容了
現在講的是RPG地圖的核心內容--觸發器(trigger)
觸發器有人說很難
其實非常非常…………(此處省略N個非常)簡單
任何一個正常人都可以理解
觸發器分3個部分
執行人,條件,結果
執行人隨便寫,只有一個觸發和執行人有關(是結盟的觸發)
注意,如果你寫 force 4 (第4組)
而force 4你沒有放一個玩家
或有一個人類玩家,但他沒加入游戲
那麼執行人為 force 4 的觸發都不會執行
(就是要有人或電腦來執行)
條件有很多種
ACCUMULATE Player accumulates quantity resources.
該玩家積累多少資源時
ALWAYS Always.
總是
BRING Player brings quantity units to location.
該玩家帶多少單位到特定區域時
COMMAND Player commands quantity units.
該玩家控制多少單位時
COMMAND THE LEAST Current player commands the least units.
當前玩家最少控制多少單位時
COMMAND THE LEAST AT Current player commands the least units at location.
當前玩家在特定區域最少控制多少單位時
COMMAND THE MOST Current player commands the most units.
當前玩家最多控制多少單位時
COMMAND THE MOST AT Current player commands the most units at location.
當前玩家在特定區域最多控制多少單位時
COUNTDOWN TIMER Countdown timer is ration game seconds.
游戲時間倒數計時多少秒時
DEATHS Player has suffered quantity deaths of unit.
該玩家損失多少單位時
ELAPSED TIME Elapsed scenario time is ration game seconds.
游戲時間經過多少秒時(游戲時間)
HIGHEST SCORE Current player has highest score points.
當前玩家得分最高時
KILL Player kills quantity units.
該玩家殺死一定數量的單位時
LEAST KILLS Current player has least kills of unit.
當前玩家殺死單位最少時
LEAST RESOURCES Current player has least resources.
當前玩家積累資源最少時
LOWEST SCORE Current player has lowest score points.
當前玩家得分最低時
MOST KILLS Current player has most kills of unit.
當前玩家殺死單位最多時
MOST RESOURCES Current player has most resources.
當前玩家積累資源最多時
NEVER Never. 從不
OPPONENTS Player has quantity opponents remaining in the game.
該玩家在游戲擁有多少對手時
SCORE Player score type score is quantity.
該玩家得分是多少時
SWITCH Switch is set.
開關被設置或清除時
(慢慢看,3分鍾後再看下面)
結果也有很多種
CENTER VIEW Center view for current player at location.
將畫面轉至某特定區域
COMMENT Comment: comment.
對觸發器加以說明,使之便於閱讀
CREATE UNITS Create quantity unit at location for player
在特定區域為玩家創造一定數量的單位
CREATE UNITS WITH PROPERTIES Create quantity
unit at location for player. Apply properties
在特定區域為玩家創造一定數量的具有一定屬性(如隱形,鑽地等)的單位
DEFEAT End scenario in defeat for current player.
當前玩家任務失敗
DISPLAY TEXT MESSAGE Display for current player: text.
為當前玩家顯示一些交代文字
DRAW End the scenario in a draw for all players.
所有玩家平手
GIVE UNITS TO PLAYER Give quantity units owned by player at location to player.
將特定區域的一個玩家(前者)的一定數量的部隊給另一個玩家(後者)
KILL UNIT Kill all units for player.
殺死玩家的所有單位
KILL UNITS AT LOCATION Kill quantity units for player at location.
殺死玩家的在特定區域的一定數量的單位
LEADER BOARD (CONTROL ATLOCATION)
Show Leader Board for most control of units at location. Display label: label
顯示目前特定區域里的單位控制情況
LEADER BOARD (CONTROL)
Show Leader Board for most control of unit. Display label: label
顯示目前單位控制情況
LEADER BOARD (GREED)
Show Greed Leader Board for player closest to accumulation of number ore and gas.
顯示目前總的資源收集情況
LEADER BOARD (KILLS)
Show Leader Board for most kills of unit. Display label: label
顯示目前殺死單位的情況
LEADER BOARD (POINTS)
Show Leader Board for most points. Display label: label
顯示目前得分情況
LEADER BOARD (RESOURCES)
Show Leader Board for accumulation of most resource. Display label: label
顯示目前資源收集情況
LEADER BOARD GOAL(CONTROL AT LOCATION)
Show Leader Board for player closest to control of number of units at location. Display label: label
顯示還需在特定區域里控制多少單位可達目標
LEADER BOARD GOAL(CONTROL)
Show Leader Board for player closest to control of number of unit. Display label: label
顯示還需控制多少單位可達目標
LEADER BOARD GOAL (KILLS)
Show Leader Board for player closest to number kills of unit. Display label: label
顯示還需殺死多少單位可達目標
LEADER BOARD GOAL (POINTS)
Show Leader Board for player closest to number points. Display label: label
顯示距離目標得分還差多少
LEADER BOARD GOAL(RESOURCES)
Show Leader Board for player closest to accumulation of number resource. Display label: label
顯示還需收集資源可達目標
LEADER BOARD COMPUTER PLAYERS Set use of computer players in leaderboard calculations.
關閉或打開電腦的情況顯示
MINIMAP PING Show minimap ping for current player at location.
當前玩家的小地圖顯示警告框
MODIFY UNIT ENERGY Set energy points for quantity units owned by player at location to percent%.
修改特定區域里一定數量的玩家控制單位的能量
MODIFY UNIT HANGAR COUNT Add at most quantity to hangar for quantity units at location owned by player.
修改特定區域里一定數量的玩家控制單位的彈葯(如航母,金甲蟲)
MODIFY UNIT HIT POINTS Set hit points for quantity units owned by player at location to percent%.
修改特定區域里一定數量的玩家控制單位的生命值
MODIFY UNIT RESOURCE AMOUNT Set resource amount for quantity resource sources owned by player at location to quantity.
修改特定區域里一定數量的玩家控制單位的能量
MODIFY UNIT HANGAR COUNT Add at most quantity to hangar for quantity units at location owned by player.
修改特定區域里一定數量的玩家控制單位的彈葯(如航母,金甲蟲)
MODIFY UNIT HIT POINTS Set hit points for quantity units owned by player at location to percent%.
修改特定區域里一定數量的玩家控制單位的生命值
MODIFY UNIT RESOURCE AMOUNT Set resource amount for quantity resource sources owned by player at location to quantity.
修改特定區域里一定數量的玩家控制單位的能量
MODIFY UNIT SHIELD POINTS Set shield points for quantity units owned by player at location to percent%.
修改特定區域里一定數量的玩家控制單位的護盾
MOVE LOCATION Center location labeled location on units owned by player at location.
將一個特定區域移動到一個單位身上在一個特定區域內
MOVE UNITS Move quantity units for player at location to destination.
將玩家一定數量的單位由一個特定區域移動到另一個特定區域
MUTE UNIT SPEECH Mute all non-trigger unit sounds for current player.
關閉當前玩家所有非觸發單位的聲音
ORDER Issue order to all units owned by player at location: order to destination.
命令玩家的單位在從一個特定區域里移動.攻擊.巡邏到另一個特定區域
PAUSE GAME Pause the game.
暫停游戲
PAUSE TIMER Pause the countdown timer.
暫停倒計時
PLAY WAV Play WAV file
播放一段聲音
PRESERVE TRIGGER Preserve Trigger.
循環執行當前觸發
REMOVE UNIT Remove all units for player.
移除玩家所有單位
REMOVE UNITS AT LOCATION Remove quantity units for player at location.
移除玩家在特定區域里的一定數量的單位
RUN AI SCRIPT Execute AI script script.
運行一個人工智慧
RUN AI SCRIPT AT LOCATION Execute AI script script at location.
在特定區域運行一個人工智慧
SET ALLIANCE STATUS Set Player to Ally status.
設置當前玩家與另一個玩家同盟或敵對
SET COUNTDOWN TIMER Modify Countdown Timer: Set ration seconds.
設置倒計時時間
SET DEATHS Modify death counts for player: Set quantity for unit.
設置玩家的死亡單位計數
SET DOODAD STATE Set doodad state for units for player at location.
特定區域里小物件的設置
SET INVINCIBILITY Set invincibility for units owned by player at location
設置特定區域里的玩家單位無敵
SET MISSION OBJECTIVES Set Mission Objectives to: text.
設定本關任務
SET NEXT SCENARIO Load scenario after completion of current game.
設定當前任務結束後讀取的地圖
SET RESOURCES Modify resources for player: Set quantity resource.
為玩家設定一定數量的資源
SET SCORE Modify score for player: Set quantity points.
設定玩家得分
SET SWITCH Set switch.
開關設置
TALKING PORTRAIT Show unit talking to current player for ration milliseconds.
為當前玩家顯示單位肖像一段時間
TRANSMISSION Send transmission to current player from unit at location.Play WAV file.Modify transmission ration: Set number milliseconds.Display the following text: Text
設置一段對話。包括小地圖上單位的地點顯示,伴隨的聲音及文字
UNMUTE UNIT SPEECH Unmute all non-trigger unit sounds for current player.
解除當前玩家所有非觸發單位的聲音的關閉
UNPAUSE GAME Unpause the game.
解除游戲暫停
UNPAUSE TIMER Unpause the countdown timer.
解除倒計時暫停
VICTORY End scenario in victory for current player.
當前玩家任務勝利
WAIT Wait for ration milliseconds.
等待一段時間(千分之一秒)
(看5分鍾後再接著看)
條件滿足了就會執行結果
比如:
條件:我至少殺了一個人(player 1 kill at least one any unit)
結果:把我移動到監獄.
(Move all units for player 1 at anywhere to 監獄.)
星際RPG地圖製作(三)AI的使用
首先大家應該知道的是AI腳本有兩大類:
1.是無分位置(Location,以下內容不作解釋)的AI腳本
2.是在指定位置運行的AI腳本
先講第一種吧:它的Actions是Run AI Script,其中有三項
1.Send all unit on strategic suicide missions:是一種有計謀的殺戮行動!會把自己的兵力像是開扁似的全叫去打(只要去得到的地方),直至可能被殺到的敵人(包括以其敵對的電腦玩家!以下內容不作解釋)全死或自己部隊全死,否則就不停的殺殺殺!
2.Send all unit on random suicide missions:像是沒用使用任何AI時一樣,但警覺范圍明顯更大。
3.Switch computer player rescue passive:就是讓該Player進入被緩救狀態(就是你走前去就會加入的那種),簡單地說該Player的Control(Player/Setting.....)變了Rescuable。
第二種的AI有很多!但其實大致分以下幾類:
1.(種族省略)Custom level:星際舊版本(非血戰)的建造基地AI,幾乎沒有進攻性。
2.還有Zerg/Terran/Protoss Campaign Easy/Medium/Difficult/Insane
以下是各難度等級的介紹:
Easy:低級的發展和進攻AI,一般用來設計系列地圖的初始關。
Medium:中等級別的發展和進攻AI,比Easy更曉得發展,會造更多的兵種,在系列地圖中,頭幾關會用得著。
Difficult:一般與玩單人模式的AI差不了多少,大家心知,所以不作介紹。
Insane:有弱智和瘋狂的意思,只會瘋狂地造兵和發展,有頻密的進攻而且所用兵種一次比一次高級的!但一般是以量取勝,且不死掉原有的低級兵種就不會想到去發展高級的,所以弱智,但當魔法和高兵種出現時異常難對付!有時還發傻似的亂打,如果基地大而又少防守公事的話,呵呵...等受罪吧。
還有一個特別的難度(其實不是難度等級):
Area town:只採礦,幾乎不發展和造兵的AI!如果用於設置任務中電腦的分基地的AI的話就非常有用(這才是真正用途)。
註:加了Expansion字眼的AI是指以血戰為基礎的AI,若用沒有Expansion一詞的AI將不造血戰的新兵種(如醫生之類)和不升級新的科技(如大象的速度和皮+2的升級)!當然用來有Expansion字眼的AI文件會存為SCX文件。
設置聯盟狀態AI腳本:
Set player to(*狀態)
*Enemy:以Player為敵;
*Ally:以Player為盟。
註:這種AI與Actaion中的Set alliance status有異曲同工之效(但是並非完全一樣)!
value this Area higher:使電腦玩家在所用之處放兵力防守,一般是讓電腦看守重要地方或建築的AI。
Enter closest bunker:所用之處的Terran人自動進入最近的堡壘。
還有就是進出運輸工具(各族的)
(*動作)Transport:
*Enter:陸地兵種們會進入該位置的運輸工具;
*Exit:相反,這個AI會使運輸工具里的東東出來。
註:Enter closest bunker和Enter/Exit Transport,還有Set player to Enemy/ally是可用在人類(Human)玩家上的。
怎樣才能使電腦有好的作戰AI呢?
注意以下幾點:1.如果讓電腦白手起家的話只是將位置放在總部上即可以,
但是要記住Zerg要給1個Overlord!
2.如果開頭電腦玩家有相當范圍的基地就把位置幾乎覆蓋整個基地較好。
3.如果要一個Super電腦,可幫它設一個作弊板機,例如:
Conditions:
-Alway
Actions:
-Modify resources for Current Player:Set 5000 Ore and Gas
-Preserve trigger
這樣電腦就有用不盡的資源,呵呵.......
4.別讓電腦在Anywhere運行AI不然(發瘋的采礦)......而且在運行AI的板機後面不要加Preserve trigger-狂造總部!!!還不能讓一個電腦在二個有一定距離的地方用兩個AI腳本!不然,它的工兵會跑個不停。呵呵,但可在分基地處用Campaign Area Town
星際RPG地圖製作教程(四)開關的使用
這回給大家講講Switch的使用,到底什麼是Switch?很簡單,就是「開關」的意思,更可作「記號」來理解。現在先漸漸有關Switch板機中的幾個知識點:
首先是Switch Action里的幾個狀態:
1.Set:相當於我們把開關打開。
2.Clear:和Set相反,就是把開關關閉。
3.Toggle:Set與Clear間狀態的切換,就是說本來是Set的狀態,Toggle發生後就變成Clear了。反過來一樣。
4.Random:隨機,就是讓電腦選擇是Set還是Clear,但是Toggle就不知道了,可用來搞RPG的「踩地雷」。
總共有256個開關!! 不會不夠用了吧?呵呵,但用起來怎麼搞得清哪個打哪個?這就有了Rename功能,你可以用它來為你的Switch#改名,就不會搞錯啦!呵呵!
有了這些功能就可製作一些次序鮮明的地圖板機。
比如要做一個先是讓玩家挑難度,再讓玩家選種族的地圖,只用3個位置(Location),一個人族平民(Civilian),怎麼才能做到兩個步驟有先後分明之後呢?
這里舉一例:先作三個位置分別叫Easy-Zerg,Medium-Terran,Hard-Protoss(這是用來方便記憶,其實名稱隨便好記就行),再作一個叫Civilian的位置(在該位置創建Terran Civilian)。
如果根據上述條件,不用「開關」即「Switch」,挑難度與選種族的步驟就會重復,很麻煩!
若使用「Switch」問題就好解決了(假如Player1是Human玩家,Player2為Computer且為Zerg):
Player:-Player2
Conditions:-Player1 bring last 1 Terran Civilian to 「Easy-Zerg」
Actions:-Execute AI Script「Zerg Campaign Easy」At location「(你所選擇給Player2的位置)」
- Set 「Switch1」(用哪個都無所謂好記就行,也可用「Rename...」項改個好記的名字給它)
-Remove 1 Terran Civilian for playe1 at「Easy-Zerg」
-Create I Terran Civilian at 「Terran Civilian」
這樣就完成了第一步,下一步是挑種族了,再創建一個Civilian,再設:
Player:-player1
Conditions:-Player1 bring last 1 Terran Civilian to 「Easy-Zerg」
-「Switch1」(就是上一個板機中Actions里Set的那一個)is set
Actions:-Create 1 Zerg Hatchery at 「(你設哪就哪)」for Player1
在這里我是把「Switch1」作為「開關」,只要第一個板機發生了我就把「開關」打開,讓地圖搞清楚第一和第二個板機的先後。
這只是簡單的介紹,所以其他的就不一一細講。
再舉一例:我設一個狗狗賽跑比賽(來回走),如何證實某玩家已經到達轉彎點位置才回到終點呢?
看看吧:設起跑位置是Start,中轉點是Turn,Player1,Player2都為Human玩家。
先是:Player:-Player1
Conditions:-Current player bring last 1 (Zergling)to「Turn」
Actions:-Set 「Turned」(我把我選的Switch 用Rename項從命名為Turned了)
第二步:就設:
Player:-Player1
Conditions:-Current player bring last 1(你選擇的Unit)to 「Start」(來回一次了)
-「Turned」is set
Actions:-End Scenario in victory for current player(勝利板機Victory)
在這里我用「Switch」為賽跑者是否去過轉彎點(叫「Turn」的那個位置)作下了記號,只要玩家去過轉彎點,「Turned」就Set了,而這是勝利的板機(第二步設的那個板機)的發生條件之一。
如此每個玩家設一次,一個賽跑比賽就基本完工了!如果花點心思,可作一個越野賽地圖,如果你做到了,就以本小組的那個美洲豹組長聯絡(最好找我,他都很忙!呵呵……)
總之,Switch可將一個甚至多個事件的放生作下「記號」,然後就可作為有利的條件,協助你做出更好的地圖!
星際RPG的一些名詞解釋
==RPG==
原指 Use Map Setting 地圖中的角色扮演類地圖,後來詞義擴大為有UMS地圖了
經典地圖:king of survival ,星際自帶任務關, Diablo, Padoraths Return,Doom Quest 2.92,水龍傳說,DBZ系列(龍珠),光芒之劍
RPG地圖下載:http://www.wrgame.com/scrpg/down/list.asp?id=99
==UMS==
就是 Use Map Setting 模式,在建關的調速上面
==Blood==
UMS地圖中的一種,特徵是會不斷出現兵,看誰殺的多
經典地圖:zealot blood, zone control 系列,Pok閙on Bros NEW EVOLUTIONS!
Blood地圖下載:http://www.wrgame.com/scrpg/down/list.asp?id=86
==Bound==
UMS地圖的一種,又叫小狗地圖,特徵就是控制小狗,躲避危險,到達目的地
經典地圖:ICE Bound,eye bound,TV bound,Mirror bound...
Bound地圖下載:http://www.wrgame.com/scrpg/down/list.asp?id=87
==Defense==
UMS地圖的一種,就是防禦地圖,特徵就是阻止敵人跑到終點
經典地圖:Star Photon Defense ,Tower Defense 系列,Tankders80%,Turret Defense 系列,BUILD HIGH DEENCE,Ultimate Cannon Defense
Defense地圖下載:http://www.wrgame.com/scrpg/down/list.asp?id=85
==Micro==
UMS地圖的一種,就是微操地圖,特徵就是會給你和敵人一些兵
你要以弱勝強,是一種技巧性很強的地圖
經典地圖:很多,都很經典,自己看吧
Micro地圖下載:http://www.wrgame.com/scrpg/down/list.asp?id=94
==ETC==
指的是另類的UMS地圖,如SCV Football,排球,27bug(這是介紹1.08版的bug的地圖)
ETC地圖下載:http://www.wrgame.com/scrpg/down/list.asp?id=98
==地圖工具介紹==
SE:星際自帶的地圖編輯器 StarEdit
SCXE:德國出的超強編輯器 StarCraft X-tra Editor
SCMD:一個可以做一些特效的編輯器 SCMDraft
SF:一個超級變態的編輯器,但也不穩定 StarForge
ESE:比SE強一點的增強版,國內有很多網站有 Emerald StarEdit
零升級,零造兵時間的製作
其實如果你以前游戲改多了就會了解「上限」,這一點當年我改仙劍是就發現了。星際同樣,任何數據都有上限,要看它儲存在內存中所佔的16進制位元組數,單位元組儲存的數據上限為255,(由此可只星際中是以單位元組儲存角色等級數的,所以人物最多隻能升到255 級,想再高用什麼修改器也是回天乏數了。除非聯系「暴雪」請他們把游戲程序改寫。:P) 雙位元組是65535 ,(舉個例子,我的一張地圖中升第 129 級時需要消耗 65500 水晶,而升第 130 級時忽然降為 436 個水晶,我們把這叫做升翻版了,當時我設置的升級基礎是消耗 1000 水晶,每升一級多消耗 500 水晶,現在大家明白是什麼原因了吧。)而升級時間比較特殊,經過我的多次測試,它的上限居然是 4369 !
好了,現在我們了解了數據的上限,也知道一旦超過這個上限,數值會返回原點,那麼是不是說我們輸入的數據正好超過上限加1,數據就會返回 0 呢?相信很多朋友在讀到上段就想到了這點了吧,請相信你的推測,因為實際情況的確如此!
好了,如果你夠聰明,下面的話就不用看了,和你心中想的是一樣的。
為了避免在地圖編輯器中升級時間累積那一項輸入「0」後點確認時系統自動返回「1」,請輸入數據「4370」後點確認〉存檔。下一步就去測試一下你心愛的地圖吧~,要是你把升級基礎時間也調成了「0」的話…… 呵呵~「operation cwal」的感覺知道吧~~~~
添加背景音樂
您可能很喜歡星際爭霸的背景音樂,但是在編輯戰役的過程中您也可以加入自己喜歡的背景音樂。這一點是毫無疑問的,但是好多玩家在這個過程中遇到了好多麻煩。您不要灰心,只要您看完這篇文章就會輕而易舉的解決您的問題,剛入門的初學者也可以學會使用這項高級技巧。
要播放背景音樂,只要應用到「PLAY WAV「 ACTION即可。例如:
Owner:
- Human player
Condition:
- Always
Action:
- Play 』testbgm.wav』
- Wait for (你的背景音樂的長度) milliseconds.
- Preserve Trigger
爆炸與震動效果的實現
by kink 星際學園
好萊塢的大片給我們帶來的震撼效果少不了成噸的火葯的鋪墊。反觀我們自己編的地圖,怎麼看怎麼少了點火葯味,不夠刺激。
想讓自己的任務火暴一點,同樣少不了爆炸和震動的效果。怎麼做?原理很簡單: 產生一個Terran的機械單位並立刻殺死它。這樣就有了爆炸效果了。不停地Center View 2個錯開一點的區域(Location)就得到了震動效果。
1.爆炸效果
第一步 要定義一家電腦,並且和玩家屬於不同的聯盟。這樣該電腦的隱型單位我們就看不到了。我們假設該玩家為Player8。
第二步 定義幾個分
⑻ AI腳本後綴是什麼
後輟為AI的文件是illustrator製作的文件,是矢量圖,它的優點是如何放大圖像都不會產生馬塞克現象,也就是不會虛,是在廣告、印刷包裝包裝方面使用的軟體,能夠繪圖、設計等。
為打開.ai文件,可以使用與photoshop軟體同屬Adobe公司的illustrator軟體。在正常的情況下.ai文件也可以通過photoshop打開,但打開後的圖片就只是點陣圖而非矢量圖,並且背景層是透明的。至於打開後的精度,可以在打開時彈出的對話框上修改圖片的解析度。
ai文件也可以直接用Acrobat閱讀器打開,但僅限於查看。
⑼ 星際爭霸1的,編輯地圖的「執行AI腳本」和「在位置執行AI腳本」,那些腳本的中文意思是什麼
即使你在地圖配置了電腦單位,如果不替它們設定,它們都只會被動防守,不會作任何行動的.所以我們必須替它們設定行動.
要設定ai,便要在電腦玩家建立Trigger,Conditions須用always,及Action使用run at script.
現在說明各script的意思:
run ai script:
Send all Units on Strategic Suicide Missions:命令電腦所有部隊進行攻擊,進攻方法較醒目,直至所有人類玩家死去.
Send all Units on Random Suicide Missions:和上面一樣,但電腦進攻方法有點不同,只會狂攻.
Switch Computer pLayer to Rescuable:使電玩變成Rescuable.
run ai script at location:
[Expansion] Custom Level:電腦會在你指定的location建立基地,擴張及進攻.(這script是假設電腦在游戲開始時是沒有任何基地的)
[Expansion] Campaign Easy:電腦會在你指定的location內的基地建設最基本的建 和軍隊,也會有少形進攻.
[Expansion] Campaign Medium:電腦會在你指定的location內的基地建設大部份的建 和軍隊及進行研究,也會有中形進攻.
[Expansion] Campaign Difficult:電腦會在你指定的location內的基地建設所有的建 和軍隊及進行研究,也會有大形進攻.
Campaign Area Town:電腦會在你指定的location內的基地進行防守,但不會進攻.
[Expansion] Campaign Insane:這個我都不明白....
Value this Area Higher:電腦會視你所指定的location為重要地區,會派兵到該location防守.
Set pLayer To Enemy/Ally:沒有甚麽用途的script,因為Action的set alliance status可做到相同效果.
Enter Closest Bunker:命令location中的部隊進入碉堡,就像下圖那樣.
Enter Transport:命令location中的部隊進入運輸機.
Exit Transport:命令location中的部隊離開運輸機.
注意:上面Enter closest bunker和enter transport, exit transport叄個script是可以用在人類玩家上的.
配合以上的script,便可以開始製作會動的電腦了.