作者laechan (小太保)
看板mud_sanc
标题[闲聊] 明年的区域拓展计划
时间Tue Nov 15 10:39:32 2011
明年有一点是确定的,在现行区域里面会增加子区域。
比方说妖精老家,它可能增加的区域就是OX洞窟或是OX森林
这一类的,底下以OX洞窟说明其做法。
一、界定区域大小後,使用 makearea 指令产生地图
比方该洞窟我希望是 10x5 的(横轴10,纵轴5)
> makearea 10x5
1
0123456789012345678
0 x-x-x-x-x-x-x-x-x-x
1 | | | | | | | | | |
2 x-x-x-x-x-x-x-x-x-x
3 | | | | | | | | | |
4 x-x-x-x-x-x-x-x-x-x
5 | | | | | | | | | |
6 x-x-x-x-x-x-x-x-x-x
7 | | | | | | | | | |
8 x-x-x-x-x-x-x-x-x-x
makearea: 区域方阵产生完成, 请按 enter 键继续, 按 q 离开...
请输入指令(按 q 离开):
经过一番随机挖洞後得到底下的图...
1
0123456789012345678
0 x-x-x-x-x x-x-x
1 | | | | |
2 x-x-x x x-x-x x
3 | | | | | |
4 x-x-x x-x-x-x-x-x
5 | | | | | | |
6 x-x x-x x-x-x-x-x
7 | | | | | | |
8 x x-x-x-x-x-x-x
然後透过功能键将其转换为一般数字地图
请输入指令(按 q 离开): 5 to 001
001-002-003-004-005 006-007-008
| | | | |
009-010-011 012 013-014-015 016
| | | | | |
017-018-019 020-021-022-023-024-025
| | | | | | |
026-027 028-029 030-031-032-033-034
| | | | | | |
035 036-037-038-039-040-041-042
二、定义区域房间脚本档
#include "../xxx.h"
inherit OX_ROOM;
void create()
{
::create();
seteuid(getuid(this_object()));
set("long","@@query_long");
SET_EXITS;
SET_OBJECTS;
reset();
}
上述脚本档只有两个区域会被替换,就是 SET_EXITS; 跟
SET_OBJECTS。
三、使用 trans 指令搭配脚本档,依 makearea 产生的地图来建造房间
> trans /open/area1.pic to /open/tmp/laechan/makearea
资料读取完成,共读进了 42 个房间资料。
确定无误的话请按[enter]开始档案产生作业,否则请按[q+enter]後离开:
本次作业结束,共产生 42 个档案。
> ls /open/tmp/laechan/makearea
1 001.c 1 007.c 1 013.c 1 019.c 1 025.c 1 031.c 1 037.c
1 002.c 1 008.c 1 014.c 1 020.c 1 026.c 1 032.c 1 038.c
1 003.c 1 009.c 1 015.c 1 021.c 1 027.c 1 033.c 1 039.c
1 004.c 1 010.c 1 016.c 1 022.c 1 028.c 1 034.c 1 040.c
1 005.c 1 011.c 1 017.c 1 023.c 1 029.c 1 035.c 1 041.c
1 006.c 1 012.c 1 018.c 1 024.c 1 030.c 1 036.c 1 042.c
基本上我会要求在这个目录放上 area_map 档,将来就能拿图做直
接的修改以及区域的 re-build。
四、确认所产生的 42 个房间之房间出口设置
> runmap
地图产生完成,进行地图自动缩小中...... 对照区
口─口─口─口─口 口─口─口 | x-x-x-x-x x-x-x
│ │ │ │ │ | | | | | |
口─口─口 口 口─口─口 口 | x-x-x x x-x-x x
│ │ │ │ │ │ | | | | | | |
口─口─口 口─口─口─口─口─口 | x-x-x x-x-x-x-x-x
│ │ │ │ │ │ │ | | | | | | | |
口─口 口─口 口─口─口─口─口 | x-x x-x x-x-x-x-x
│ │ │ │ │ │ │ | | | | | | | |
口 口─口─口─口─口─口─口 | x x-x-x-x-x-x-x
各房间的 SET_EXITS 会被自动替换为如下的东西..
==002.c==
set("exits/south",GR"010"); 001-002-003
set("exits/west",GR"001"); |
set("exits/east",GR"003"); 010
=========
各房间的 SET_OBJECT 也会被替换为怪物的配置程式段。
五、进行 OX_ROOM 房间继承档的撰写。
因为 OX 洞窟的 short、light、exits_color 设定都是
确定的,所以它的格式就类似底下...
inherit ROOM;
void create()
{
::create();
set("short",HIW"OX洞窟"NOR);
set("light",1);
set("exits_color","1;37m");
}
六、进行相关怪物档撰写。
比方这个洞窟只会出现两种怪物,就把这两种怪物写好。
而实际上我不会去写,因为已经有现成的可以直接拿来用
了,就是旧新手村我所写的怪物(cp过来就好了)。
好了,这样一个区域就完成了,
这麽快!?
这个区域就是解谜用的,妖精老家预定会写至少两个这样的子
区域(另一个当然就是OX森林),比方说丝皮雅拜托小妖精去洞
窟帮忙清除什麽东西之类的啦,或是去森林帮忙采集什麽啦,
等等的。甚至运用水精灵魔法潜入瀑布底下...
> areadata short
deedlit1.c 高等妖精--蒂德莉特(Deedlit)
girl1.c 妖精族少女(elf girl)
master1.c 森之精灵守护者(GuardMaster of Forest)
master2.c 水之精灵守护者(GuardMaster of Water)
oldster1.c 妖精族长老-丝皮雅(Elf Oldster)
> findmob guardmaster of water
ok! 找寻路径为
起点->northwest->north->west->west->west->north->north->north->west->west->
south->south->west->west->north->north->north->north->east->east->east->
east->east->east
- 小木屋 -
一座小木屋, 在这附近就只有这麽一座, 里面住着的是掌管妖
精之森大小河流的妖精族老者, 据说他已经在这里住了超过上
千年的时间.
明显出口有: west.
(!)Lv200.水之精灵守护者(GuardMaster of Water)
而水之精灵的任务就由 quest 指令来读取相关的脚本。
各位应该可以轻易地发现,我总共使用了底下的指令..
makearea
依我的要求绘出区域地图
trans
依我的要求产生区域档案
runmap
依我的要求秀出区域地图
areadata
依我的要求显示目录资料
quest
依我的要求生成任务资料
findmob
依我的要求找出怪物位置
我这两三个月就是在忙这些东西,其实还有两个指令也会用到
,一个是 mirror 指令,一个是 moball 指令。
我已经跟norr说明这些指令的用法(希望他有空时就练习一下)
及用途,我只跟他提,自然是因为我判断往後可能只有我跟他
会实际投入圣殿的 coding 工作的缘故。
接下来,我会再撰写几支工具,然後再构思一个能够适当地将
这些工具整合起来的开发环境,当这些『工具』都完成後,我
们就不需要再倚靠招收新的 wiz、不需要再靠现有的区域 wiz
、更不需要再从玩家那里得到区域的相关点子(叙述、怪物等)
,就可以快速撰写任务、以及任务相关区域。
这是圣殿 2012 年的大致拓展计划。最坏的情况是可能只有我
有空(norr有他的事情要忙),这时工具的完善度就关系到能不
能「只靠我一个人」就能做我想做的事。
Laechan
--
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 编辑: laechan 来自: 122.117.7.33 (11/15 22:42)
1F:推 Yanten :老大 其实我还有个建议 可以搭配图片 变成 看图走路 11/17 01:05
2F:→ AresMars :我好像在某个mud看过用图走路的...时空幻境? 11/17 02:50
这个是确定有要做的,所以我才会要求 wiz 要保留 area_map
档在同一个目录。
string area_maps=explode(read_file(__DIR__+"area_map"),"\n");
for(i=0;i<sizeof(area_maps);i++)
{
tmp=area_maps[i];
s=strlen(tmp);
for(j=2;j<s;j=j+2)
{
if(tmp[j-2..j]=="020") 0XX
{ |
substr(tmp,"020","<o>"); 019-<o>-021
return ({area_maps,i,j-2}); |
} 0XX
}
}
这时就取得了 area_maps 及 i, j
ii=sizeof(area_maps);
if(ii<=13) // 上 3格 下 3格
{
a=0; b=ii; // 地图很小时就显示全部
}
else if(i<7)
{
a=0; b=i+6;
if(b>=ii-1) b=ii-1;
}
else
{
a=i-6; b=i+6;
if(b>=ii-1) b=ii-1;
}
jj=strlen(area_maps[0]);
if(jj<=17) // 左 4格 右 4格
{
c=0; d=jj;
.
.
如上做法
}
到这里就能产生秀图边界
msg="";
for(i=a;i<=b;i++)
{
tmp=area_maps[i];
msg+=tmp[c..d];
}
write(msg);
但是基本上不可能边走路边秀图(例如省略房间叙述直接给图),
也不可能像上面那样告诉你房间号码。不可能边走边秀图是因为
它不实用,较实用的做法是像 RO 那样..
一、给区域全图
二、再标示你位於区域的哪里
而我只会告诉你约略的位置,它的好处就是不管图有多大都能够
show 的出来,这才是我要做的。
※ 编辑: laechan 来自: 122.117.11.103 (11/17 07:24)