第25章韦诺之战讲述了一场古老的战争,发生在公元前三世纪的意大利半岛上。当时,意大利半岛上有两个强大的国家:罗马和萨拉诺斯。他们之间的冲突已经持续了几年,但是最后一次战斗却是最惨烈的一次。
这场战争发生在韦诺(Verona),当时萨拉诺斯军队由凯尔特人和加泰隆人组成,而罗马军队由帝国士兵和加泰隆人组成。萨拉诺斯军队由凯尔特人和加泰隆人组成,而罗马军队由帝国士兵和加泰隆人组成。这场战争中最重要的是凯尔特人将军庞德·奥斯特里奇·德·布雷西亚·德·布雷西亚·德·布雷西亚·德·布雷西亚。他是一位勇敢而又有能力的将军,他手下的士兵也都勇敢无畏。
然而,庞德将军也不是无敌的。他手下的士兵太少了(只有3000多人),而对方则有1.5万多士兵。此外,庞德将军也遭遇到来自天气、地形、装备不足、风水不利、心理上的不利因素。
尽管如此,庞德将军依然没有退却。他命令士兵们站在原地不动并保护好它们所拥有的一切——包括家园、宗教信仰、生命和尊严——直到死去为止。
在这场惨无人道的战斗中, 即使庞德将军手下士兵数量明显不及对方, 但是庞德将军依然没有退却, 他命令士兵站住原地, 保护好它们所拥有的一切, 甚至牺牲生命. 这样一来, 在这场惨无人道之战中, 即使失去生命, 也胜似失去尊严.
这样一来,庞德将军用血流成河般的勇气和必胜信念使这场惨无人道之战发生了巨大变化——即使失去生命也胜似失去尊严——并使凯尔特民族胜利耶!
作者:Richard Shimooka, David White
译者:谢路云
状态:完成
原文链接:http://www.aosabook.org/en/wesnoth.html
编程往往被简单地看作一种解决问题的行为,开发者根据需求编码得到一个解决方案。对代码优美程度的判断一般来自于技术实现上的优雅或者效率,而这本书(《开源软件架构》)中的项目就是它们之中的杰出例子。除了计算,代码还对公众的生活产生了深远的影响。它能够激励人们参与并创造新的事物。但不幸的是,大家在参与各种项目时仍然会遇到很高的门槛。
大多数编程语言都需要相当的技术专业知识才能使用,这对许多人来说遥不可及。此外,让所有人都能编程不仅从技术上是困难的,而且对于许多项目也没有必要。这样做并不一定能够得到简洁的代码或是聪明的解决方案。提高项目的参与程度需要开发者在项目和程序的设计时有远见,而这经常是和正常的编程习惯相违背的。再者,大多数项目的核心都是一组熟练的高水平专业程序员。他们并不需要外部资源的帮助。因此,项目的可参与性就变成了可有可无的东西,甚至从没有被考虑过。
我们的项目“韦诺之战”试图从源头上解决这个问题。它是一个基于GPL2许可证的在开源模式下开发的回合制奇幻战略游戏,它相当成功,截至这篇文章发表时已经被下载了超过四百万次。虽然这个数据很可观,但我们认为这个项目真正的出彩之处在于其开发模式凝聚了一大批能力水准各异的志愿者。
提高可参与性并不是我们开发者设立的一个模糊的目标,而是被视为这个项目成败的关键。开源意味着韦诺之战不可能立刻就吸引来大量高质量的开发者。吸引更多掌握不同技能的贡献者参与项目才能保证项目的长久活力。
我们的开发者从第一个迭代起就开始为扩大项目的参与程度而努力。这不可避免的会对项目架构的各个方面都产生一些影响。项目中的大部分决策在制定的过程中也都会考虑到这个目标。本章会深入地讲解我们的项目,尤其是我们在扩大项目参与度方面所进行的努力。
本章的第一部分概括了项目的代码,包括编程语言、依赖和架构。第二部分将集中介绍韦诺之战独特的数据存储语言,叫做“韦诺标记语言”(WML)。这部分将说明WML的功能,特别是对于游戏单位的影响。之后介绍的是多人游戏的实现以及一些外围项目。章节的最后会给出一些我们在架构和拓展项目参与度方面观察到的结论。
韦诺之战的核心引擎是用C++写的,现在总共约20万行代码。这只是游戏的核心引擎,不包含任何游戏内容,约占整个代码库的一半。我们的程序接受由一种叫做“韦诺标记预言”(WML)的独特的数据语言所定义的游戏内容。游戏在发布时还包含约25万行WML代码。这个比例在项目中还在不断升高。随着项目的成熟,硬编码在C++中的游戏内容已经越来越多地被重写为WML所定义的操作。图25.1给出了项目的大致结构。绿色的部分是韦诺之战的开发者们维护的,而白色的部分则是由外部的参与者们维护的。
jQuery outerWidth() 方法jQuery HTML/CSS 方法实例 返回 div 元素的外部宽度:$(button).click(function(){ alert($(div).outer...
jQuery position() 方法jQuery HTML/CSS Methods实例 返回 p 元素的 top 和 left 位置:$(button).click(function(){ x=$(p).pos...
jQuery 数据参考手册实例在元素上设置数据,然后查看 hasData 的结果:$(function(){var $p = jQuery(p), p = $p[0];$p.append(j...
jQuery event.preventDefault() 方法jQuery 事件方法实例 防止链接打开 URL:$(a).click(function(event){ event.preventDefault...
jQuery event.target 属性jQuery 事件方法实例 返回哪个 DOM 元素触发了事件:$(p, button, h1, h2).click(function(event){ $(d...