2008年6月29日 星期日

暗黑破壞神 III!

玻璃渣的「暗黑破壞神」又來了!這個讓我們在大四的時候每天廢寢忘食、打寶、PK 的遊戲(還有 hack XD;用石頭複製鳳凰弓之類...哈哈哈)。有不少網友也是因為這個遊戲而結交。

遊戲展示一開始就是下方熟悉的紅藍球(藍色好像變淺了一點...笑),然後...就是跟以前類似視角的全 3D 畫面。

這影片介紹的是蠻力至上的「野蠻人」,感覺比以前瘦小了點。熟悉的 skill 在一開始就秀給我們看了(當然包括了野蠻人必備的龍捲風)...還有有屬性武器的更換、補血的血瓶、可以破壞的環境(還有熟悉的掉寶聲音,聽了一定高喊:好親切)、寶箱。

似乎多了不少新角色,影片中展示了一個叫 Witch Doctor 的新巫醫角色。類似死靈法師的召喚,不過對於那些生物還可以催化,使他們能力上升,甚至變成神空特攻隊,臨死前給你自爆一下;或是讓敵人陷入 confuse 狀態,彼此自相纏殺。本身也可以利用疾病和火焰的能力來自保,感覺上是一個很有趣的角色,蠻多特殊的害死人不償命的 skill,在操作上是需要頭腦的角色 XD

影片最後是一場驚心動魄的大混戰,跟以前一樣大家一起打怪;四個人對付一隻超大隻的 monster。這 monster 還可以把角色從地上撈起來狠狠咬一口...

幾個比較有印象的新設定:

  • 破壞四周的環境也可以造成怪物的損傷,這到是蠻真實的設定
  • NPC 跟隨;跟以前雇用的傭兵不同的是,可能不只一個獲救 NPC 會跟著你。NPC 在跟隨的途中還會跟你對話
  • 3D 畫面可拉近拉遠。多了一些比較特殊的小動作,如上下樓梯的攀爬
另外,現在的 event script 已經改變成隨機的,所以同一個場景可能每次的事件都不同

2008年6月28日 星期六

27 PMOG Badges and their corresponding web sites

PMOG

注意用星號標註的項目
Please note the items start with asterisk
* Dorian's Darlings Badge
4 facebook.com urls a day four days out of every seven, four weeks in a row.
* Soul Catcher Badge
4 hits at Flickr.com a day, four days a week, four weeks in a row.
* Space is the Place Badge
3 myspace.com urls a day, four days out of every seven, four weeks in a row.
Bounce Bounce Badge
For players who read Boing Boing every day they're logged on, for 7 contiguous days
VC Badge
For players who read Tech Crunch every day they're logged on, for 7 contiguous days
Champion Badge
Visit http://change-congress.org 3 days a week for two weeks.
Web of Warcraft Badge
Visit http://worldofwarcraft.com, http://thottbot.com, or http://wowinsider.com 3 days a week for two weeks.
Badges. We has them Badge
Visit http://icanhascheezburger.com 5 days a week for two weeks.
Queen Bee Badge
Visit http://perezhilton.com 5 days a week for two weeks.
Thumb Buster Badge
Visit any of kotaku.com, joystiq.com, eurogamer.net or gamespot.com once a week for a month.
KillahOm Badge
Visit http://gigaom.com 5 days a week for two weeks.
Better Than Halo 3 Badge
Visit http://eurogamer.net 5 days a week for two weeks.
Crowd Control Badge
Visit http://massively.com 5 days a week for two weeks.
Dealers Badge
Visit http://digg.com 5 days a week for two weeks.
Great Beast Badge
Visit http://metafilter.com 5 days a week for two weeks.
Lotus Drinkers Badge
Visit http://valleywag.com 5 days a week for two weeks.
Stop Motion Badge
Visit http://reddit.com 5 days a week for two weeks.
Science, It Works Bitches Badge
For players who read xkcd.com once a week for 4 contiguous weeks.
Flying with Radar Badge
Visit dopplr.com once a week for a month.
Little Birdie Badge
Visit twitter.com once a week for a month.
Awrooo! Badge
Visit oreilly.com once a week for a month.
All About Mii Badge
For players who visit nintendo.com more than twice a week for 4 contiguous weeks
Visit jezebel.com on three days of the week for a month.
Achiever Badge
For players who visit xbox360achievements.org and / or live.xbox.com more than twice a week for 4 contiguous weeks
Take Me to Your Readers Badge
Visit io9.com three times a week for a month.
The Red Tent Badge
Visit jezebel.com on three days of the week for a month.
Fun Theory Badge
Visit http://raphkoster.com 2 days a week for two weeks.
* Mesmerized Badge
4 youtube.com urls a day, three days each week, four weeks in a row.

2008年6月20日 星期五

感謝各位鄉民的熱情贊助...恭喜 ryan 榮登今日我最囧

今天被「天下第一狗仔」 bow 和我一起抓包中午出去把妹的 ryan,經過同事、元智的學弟們熱心的參與,我們完成了這張圖 :) 以下為參與名單,萬分感謝!
  1. bow
  2. sinyuhgs
  3. 奶油麵
  4. 捲米
  5. hongjie
  6. Hun
  7. Yu-Chun
  8. 查李王
  9. IvErSoN
  10. onlytaco
  11. 邱總
活動緣起:
在堂堂中研院大門口,跟不明女性有人親暱互動的 ryan,被狗仔用手機偷拍,相片廣被在 MSN Messenger 中流傳散佈...

於是乎,大家發起了改暱稱的運動:
由 bow 的「好朋友說再見的時候 會互相摸來摸去嗎」一詞率先發難,接著 sinyu 立即響應,並由 hongjie 由台北總部接力傳續到桃園內壢地區。使用語言從中文、韓文,一直到日文皆有之...

2008年3月21日 星期五

在 eclipse 中撰寫 script,並利用 script 控制 eclipse platform

  1. 下載 eclipse
  2. Help→Software Updates→Available Software 中加入 Europa Discovery Site 的下載網址: http://download.eclipse.org/releases/europa/
  3. 如下圖,在 Other Tools 中選取安裝 Eclipse Monkey
  4. 安裝完後,重新啟動 eclipse,應該會在選單列中看到一個新的選單:Scripts

參考

2008年1月3日 星期四

JavaScript 的 Hashtable 實作

JavaScript 的 Hashtable 實作
/*******************************************************************************************
 * Object: Hashtable
 * Description: Implementation of hashtable
 * Author: Uzi Refaeli
 *******************************************************************************************/
//======================================= Properties ========================================
Hashtable.prototype.hash   = null;
Hashtable.prototype.keys  = null;
Hashtable.prototype.location = null;

/**
 * Hashtable - Constructor
 * Create a new Hashtable object.
 */
function Hashtable(){
 this.hash = new Array();
 this.keys = new Array();
 this.location = 0;
}

Hashtable.prototype.keySet = function(){
 return this.keys;
}

/**
 * put
 * Add new key
 * param: key - String, key name
 * param: value - Object, the object to insert
 */
Hashtable.prototype.put = function (key, value){
 if (value == null)
  return;

 if (this.hash[key] == null)
  this.keys[this.keys.length] = key;

 this.hash[key] = value;
}

/**
 * get
 * Return an element
 * param: key - String, key name
 * Return: object - The requested object
 */
Hashtable.prototype.get = function (key){
  return this.hash[key];
}

/**
 * remove
 * Remove an element
 * param: key - String, key name
 */
Hashtable.prototype.remove = function (key){
 for (var i = 0; i < this.keys.length; i++){
  //did we found our key?
  if (key == this.keys[i]){
   //remove it from the hash
   this.hash[this.keys[i]] = null;
   //and throw away the key...
   this.keys.splice(i ,1);
   return;
  }
 }
}

/**
 * size
 * Return: Number of elements in the hashtable
 */
Hashtable.prototype.size = function (){
    return this.keys.length;
}

/**
 * populateItems
 * Deprecated
 */
Hashtable.prototype.populateItems = function (){}

/**
 * next
 * Return: true if theres more items
 */
Hashtable.prototype.next = function (){
 if (++this.location < this.keys.length)
  return true;
 else
  return false;
}

/**
 * moveFirst
 * Move to the first item.
 */
Hashtable.prototype.moveFirst = function (){
 try {
  this.location = -1;
 } catch(e) {/*//do nothing here :-)*/}
}

/**
 * moveLast
 * Move to the last item.
 */
Hashtable.prototype.moveLast = function (){
 try {
  this.location = this.keys.length - 1;
 } catch(e) {/*//do nothing here :-)*/}
}

/**
 * getKey
 * Return: The value of item in the hash
 */
Hashtable.prototype.getKey = function (){
 try {
  return this.keys[this.location];
 } catch(e) {
  return null;
 }
}

/**
 * getValue
 * Return: The value of item in the hash
 */
Hashtable.prototype.getValue = function (){
 try {
  return this.hash[this.keys[this.location]];
 } catch(e) {
  return null;
 }
}

/**
 * getKey
 * Return: The first key contains the given value, or null if not found
 */
Hashtable.prototype.getKeyOfValue = function (value){
 for (var i = 0; i < this.keys.length; i++)
  if (this.hash[this.keys[i]] == value)
   return this.keys[i]
 return null;
}


/**
 * toString
 * Returns a string representation of this Hashtable object in the form of a set of entries,
 * enclosed in braces and separated by the ASCII characters ", " (comma and space).
 * Each entry is rendered as the key, an equals sign =, and the associated element,
 * where the toString method is used to convert the key and element to strings.
 * Return: a string representation of this hashtable.
 */
Hashtable.prototype.toString = function (){

 try {
  var s = new Array(this.keys.length);
  s[s.length] = "{";

  for (var i = 0; i < this.keys.length; i++){
   s[s.length] = this.keys[i];
   s[s.length] = "=";
   var v = this.hash[this.keys[i]];
   if (v)
    s[s.length] = v.toString();
   else
    s[s.length] = "null";

   if (i != this.keys.length-1)
    s[s.length] = ", ";
  }
 } catch(e) {
  //do nothing here :-)
 }finally{
  s[s.length] = "}";
 }

 return s.join("");
}

/**
 * add
 * Concatanates hashtable to another hashtable.
 */
Hashtable.prototype.add = function(ht){
 try {
  ht.moveFirst();
  while(ht.next()){
   var key = ht.getKey();
   //put the new value in both cases (exists or not).
   this.hash[key] = ht.getValue();
   //but if it is a new key also increase the key set
   if (this.get(key) != null){
    this.keys[this.keys.length] = key;
   }
  }
 } catch(e) {
  //do nothing here :-)
 } finally {
  return this;
 }
};