牧羊三国游戏网(策略单机游戏无毒无插件无广告免费下载)

 找回密码
 立即注册

微信扫码登录

使用验证码登录

查看: 7027|回复: 19

[分享] 国家的崛起脚本编辑教程

[复制链接]
发表于 2015-7-5 06:46 | 显示全部楼层 |阅读模式

马上注册,结交更多三国游戏迷,轻松玩转“牧羊”。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
            !!!!编译脚本首先要知道以下几个单词意思!!!!!!!!

   who:国家几?   剧情编辑器左上角对应 从上而下的国家排序
   type:类型  相对应脚本语句类型.要是兵种名字,要不就是资源名字.
   tribe:国家名字 例子:chinese japanese
   num:数量
   x:地图上X坐标  y:地图上y坐标
   id:剧情内置剧情数字  以后会提到.
!!!脚本格式和注意事项!!!
新建脚本,脚本显示的格式.
scenario{
labels {//声明便签或者所谓的变量
}
run_once{//只运行一次  一开始要触发或应用 脚本语句
}
//这里放置需要不断运行的东西
}
!!!run_once{}的说明!!!
例子:假如我要一开始为国家5增加300单位食物
那么就要把give_good(5,"food",300);语句放进
run_once{
//这里
}
注意的是,假如语句不放在run_once{}中就会不断触发.
例如:
scenario{
labels {
}
run_once{
}
give_good(5,"food",300);
}
这样国家5会不断增加300单位粮食.

!!!缺少的部分. give_good(5,"food",300)!!!!
   记住.你还需在后面加上";"符号.好,完成了.
   give_good(5,"food",300);
   必须的记住的一些小知识:除了在小括号内.
   任何脚本语句都需要在后面加上";"
   每一个"{"必须有对应"}" 不能少一个多一个.会出错,要让脚本生效,必须使用脚本编   辑器上面的"编   译"按钮.假如没错的话,他会告诉你编译成功.编译不成功的话,脚本编   辑器下面显示出 错误的地方.    双击可到达 错误语句 行段.进行修正.   
   注意的是,编译不成功脚本不会生效.

一.对话框代码
注:相同序号表明它们都与同一个类型文字有关
1)  popup_dialog("文字");//  输出文字A[明显效果]
2   bubble_text("文字",坐标x,坐标y);// 使地图某位置出现红字提示
2)  bubble_text_obj("文字",国家,ID);// 使某物体出现红字提示
3)  ubble_text_show   使红字提示可以出现
3)  print_game_msg("文字");//  输出文字C[明显效果]
4)  add_objective_text ("文字","这段文字的代号","播放声音");//输出文字D[明显效果]
4)此类型文字会在“左上(中)”位置出现,如果创建多个此类型文字会从上到下依次排列【不会随时间消失】
4) change_objective_text ("文字的代号","文字");//改变目的文本[明显效果]
6) set_instruction_msg("X");    提示对话框,出现在时代下方。

7.显示旗帜代码
1)add_flag(坐标x,坐标y);    //添加旗帜[明显效果]
2)clear_flags();   //清除旗帜[明显效果]

8.最终胜利、失败显示框显示信息代码
1) set_victory_message ("文字");//胜利后显示出的文字[明显效果]
2) set_defeat_message ("文字");//失败后显示出的文字[明显效果]

9.显示框中显示图标的代码:  
show_notice ("文字","这段文字的类型",国家);//输出文字E[明显效果]
以下为部分图标代码:
armageddon_notice //世纪末日(爆炸图标)
nuke_research_notice //核弹研究(还是爆炸图标)
capital_notice //死亡(骷髅头)
capital_moved //迁都
defeat_notice //死亡(骷髅头)
resign_notice //死亡
drop_notice //死亡
//奇迹类图标
wonder_notice //奇迹建筑图标
wonder_colossus_notice //巨人像
wonder_taj_notice //泰姬陵
wonder_kremlin_notice //克里姆林
wonder_terra_notice //秦俑
wonder_collosseum_notice //角斗场
wonder_liberty_notice //自由女神
wonder_eiffel_notice //法国铁塔
wonder_tikal_notice //玛雅神庙
wonder_porcelain_notice //南京瓦塔
wonder_supercollider_notice //对撞机
wonder_space_notice //太空发射站
wonder_angkor_notice //吴哥窟
wonder_versailles_notice //凡尔赛
wonder_pyramids_notice //金字塔
//城市类型
victory_notice //胜利图标
city_lost_notice //丢失城市
city_captured_notice //占据城市图标
city_under_attack_notice //攻击城市图标
capital_under_attack_notice //攻击首都图标
launch_notice //导弹发射图标
//全球科技 最终四项科技
final_military_notice //导弹防御网
final_science_notice //人工智能
final_commerce_notice //全球繁荣
final_civic_notice //世界政府
//图书馆时代图标
age_notice //古典时代图标 以此类推
age_notice1
age_notice2
age_notice3
age_notice4
age_notice5
age_notice6
age_notice7
其他图标代码
reinforcement_notice //援军
cannon_time_notice //加农炮图标
city_notice //村镇图标
metal_notice //钢铁图标
merchant_notice //商人

10.任务显示框代码
    任务为"X"
ctw_add_objective("X","Task","");(第一个任务为Task,第而个任务为Task2)
1) add_objective("任务名","任务代号","声音[可随意填]");//添加任务[明显效果]
2) ctw_add_objective_text("任务名","任务代号","声音[可随意填]");//添加胜利任务[明显效果]
3) objective_complete("任务代号");//让任务完成[明显效果]

二.修改国家名称的代码
1.set_nation_name
例如:set_nation_name("americans","美国");
国家的英文名称如下:方便修改查阅
1.波斯:persian           2.荷兰:dutch                            3.印度:indians
4.美国:americans      5.蒙古:mongols                        6.拉科塔:lakota
7.易落魁:iroquois      8.朝鲜:koreans                         9.日本:japanese
10.中国:chinese        11.俄罗斯:russians                   12.德国:germans  
13.英国:british           14.法国:french                         15.西班牙:spanish      
16.土耳其:turks        17.埃及:egyptians                     18.罗马:romans        
19.希腊:greeks          20.努比亚:nubians                    21.班图:bantu  
22.印加:inca              23.玛雅:maya                          24.阿兹特克:aztecs

三.修改国家领导人名字、重新命名单位代码。
1.set_leder_name
例如:set_leder_name(1,"刘忠仁");
2.rename type
例如:rename_type(“金帐汗国”,“鞑靼骑兵”);

四.外交代码
1、make_alliance(1,2); 玩家1与玩家2结盟
2、make_peace(1,2);  玩家1与玩家2和平
3、declare_war(1,2);  玩家1与玩家2战争
4、have_war(1,2);   玩家1与玩家2战争中
5、have_alliance(1,2);   玩家1与玩家2结盟中

五.产生单位代码、移动单位代码
1.create_unit(1,2,4,"X",3);   
  在坐标(2,4)产生一个玩家1的X单位3个
2.unit_move_order(1,create_unit(1,2,4,"X",3),5,6);
  在坐标(2,4)产生一个玩家1的X单位3个并移动到(5,6)
3.group_move_order(2,207,373);  //移动所有玩家2的军队到(207,373)
4.for(int i=1;i<30;i++){unit_move_order(2,create_unit(2,257,298,"Carrack",1),257,272);}
  所产生的单位全部移到,解决了第2个代码问题,只能移动1个单位的问题。
5.unit_move_create()
   unit_move_create(国家,产生位置x,产生位置y,单位名称,移动位置x,移动位置y,数量)

六.人口设置代码、占领城市增加人口弄法。不研究军事增加人口。
1.set_population_cap(1,20);    玩家1人口限制为20
2.占领城市增加人口弄法。不研究增加人口。时间触发。
trigger pop(timer_expired("pop")){
a=50+(num_type(1,"Small City")*10)+(num_type(1,"Large City")*20);
b=50+(num_type(2,"Small City")*10)+(num_type(2,"Large City")*20);
c=50+(num_type(3,"Small City")*10)+(num_type(3,"Large City")*20);
d=50+(num_type(4,"Small City")*10)+(num_type(4,"Large City")*20);
e=50+(num_type(5,"Small City")*10)+(num_type(5,"Large City")*20);
f=50+(num_type(6,"Small City")*10)+(num_type(6,"Large City")*20);
g=50+(num_type(7,"Small City")*10)+(num_type(7,"Large City")*20);
h=50+(num_type(8,"Small City")*10)+(num_type(8,"Large City")*20);
set_population_cap(1,a);
set_population_cap(2,b);
set_population_cap(3,c);
set_population_cap(4,d);
set_population_cap(5,e);
set_population_cap(6,f);
set_population_cap(7,g);
set_population_cap(8,h);
disable_trigger("pop");
set_timer("pop",1);
enable_trigger("pop");
}
3.函数触发
int pop = num_type(1,"small city")*15 + num_type(1,"large city")*30 ;
set_population_cap(1,pop);

七.播放声音代码
1.play_sound(“contact.wav”);文件名 格式   播放给全部玩家
2.play_sound_to  播放声音只给某个玩家
3.sound_finished()//声音结束[判断]
4.find_build(文件名.格式);//播放声音[明显效果]

八.显示、移动、控制视角代码
1.ui_hide(); 收起全部操作栏,干净窗口[明显效果]
2.ui_show(); 显示操作栏
3.mouse_selection_disable(); 禁止鼠标点击
4.mouse_selection_enable(); 允许鼠标点击
5.hotkey_selection_disable(); 禁止使用热键
6.hotkey_selection_enable(); 允许使用热键
7.scrolling_lock(); 不能移动当前画面
8.scrolling_unlock(); 可以移动当前画面
9.scrolling_lock_manual();不能移动视角,可以点击小地图转换画面
10.scrolling_unlock_manual();可以移动视角
11.zooming_lock(); 不能缩放画面
12.zooming_unlock(); 允许缩放画面
以上函数括号里边留空。
13.center_camera_on   (国家,ID);//视角移到单位[明显效果]
14. jump_camera   (坐标x,坐标y);//视角移到[明显效果]
15. move_camera    (坐标x ,坐标y );//视角滑动单位[明显效果]
16.zoom_in(,)  缩放地图位置XXX,XXX



九.说话代码
1.chat(1,2,"X"); 玩家1对玩家2说X
2.chat_all(1,"X"); 玩家1对所有玩家说X

十.随机数量代码
rand_int(,);
例如:rand_int(12,34);  12到34的随机数。
1.例如建立随机时间:
set_timer("good",123); //先把时间固定
set_timer("good",rand_int(120,150)); //这样就把就变成了随机时间
2.例如建立随机数量单位产生、随机数量+随机位置:
create_unit (7,392,392,"citizen",10); //固定的坐标产生单位
create_unit (7,392,392,"citizen",rand_int(8,12)); //随机产生单位数量
create_unit (7,rand_int(390,395),rand_int(390,395),"citizen",rand_int(8,12)); //随机数量+随机位置


十一.调节单位大小代码
static int tiejiajian = find_unit(1,"Ironclad");
先设定静态变量tiejiajian,把原来尺寸的值赋给它;
set_unit_scale(1,tiejiajian,2.5);铁甲舰的尺寸为原来的2.5倍。

十二.增加各种单位属性值代码
1) set_object_type_attack(国家,值);//改变单位攻击力[明显效果]
2) set_object_type_armor (国家,值);//改变单位装甲值[明显效果]
3) set_object_type_max_health(国家,值);//改变单位生命值[明显效果]
4) set_object_type_min_range(国家,值);//改变单位最小射程[明显效果]
5) set_object_type_max_range(国家,值);//改变单位最大射程[明显效果]

十三.增加各种生产率代码
1.set_base_rate(7, "Food", 100); 给玩家7食物100生产率
2.set_base_rate(7, "Timber", 100);给玩家7木材100生产率
3.set_base_rate(7, "Wealth", 100);给玩家7财富100生产率
4.set_base_rate(7, "Metal",100);给玩家7金属100生产率
5.set_base_rate(7, "Knowledge", 100);给玩家7知识100生产率
6.set_base_rate(7, "OIL", 100);给玩家7石油100生产率
十四.调查各种、建筑及单位等等数量代码
1) object_selected(国家,ID)   //选择单位[判断]
2) object_type_selected (国家,单位名)    //选择单位[任意数量][判断]
3) any_object_selected (国家)    //选择国家单位[任意数量,任意种类][判断]
4) find_selected_id (国家)    //调查选择单位的ID[具体值]
5) num_objects_selected (国家)   //调查选择单位的数量[具体值]
6.num_type(1,"X");     玩家1拥有X的数量
例如:num_type(1,"Arquebusiers")  势力1火枪手的数目
例如:if (num_type(1,"samurai")<5){   //假如国家1 武士单位少于5个
       create_unit(5,45,90,"Royal Scutari",10);//那么就为国家5创造10个西班牙战士单位在45,90的地方 }
7.num_cities(1);    玩家1城市数量
8.at_least_age();调查某个玩家的时代是否达到甚至超过了某个时代
9.at_least_buildings();调查某个玩家是否至少拥有某个数量的建筑数目
10.at_least_cities();调查某个玩家是否至少拥有某个数量的城市
11.at_least_civilian_buildings();调查某个玩家是否至少拥有某个数量的市政建筑
12.at_least_civilian_units();调查某个玩家是否至少拥有某个数量的市民单位
13.at_least_gather_rate();调查某个玩家的某种资源生产率是否达到某个数值之上
14.at_least_military_buildings();调查某个玩家是否至少拥有某个数量的军事建筑
15.at_least_military_units();调查某个玩家是否至少拥有某个数量的军事单位
16.at_least_points();调查某个玩家的得分是否达到或超过某个分数
17.at_least_pop();调查某个玩家的人口是否达到或者超过某个数量
18.at_least_type();调查某个玩家的某种物体是否达到或者超过某个数量


十五.建造时间代码
1) set_type_build_time(单位名称,时间);//修改建造时间[明显效果]
2) type_build_time(单位名称);//调查单位建造时间[具体值]


十六.禁止(失去)或获得(得到)某种权利代码。
1.disable_trigger("触发器名字");禁止触发器应用.
2.stop_timer("定时器名字");   停止计时器.
3.disable_take_attrition(1);   取消和平时期玩家1进入他国的损耗
4.give_good(1,"food",1000);   玩家1获得食物1000
5.take_good(1,"food",1000);   玩家1失去食物1000
5.disable_type_by_tribe("X","Y"); Y国家失去制X的权利
6.enable_type_by_tribe("X","B");  B国家得到制造X的权利
   enable_type_by_tribe("Brig","Spanish","Docks",0,1);
    允许西班牙的码头单位在坐标0.1格子里
7.trigger give(city_captured(1,"奥布松")){在此处填写触发后的结果} 攻打奥布松,触发某种结果
8.for(who=1;who<=8;who++){trigger give(city_captured(who,"奥布松"))
{give_good(who,"metal",1000);}}  (此代码和第7个代码含义一样,但不限定是那个玩家攻打)
9.disable_type("Small City");   禁止建造小城市
10.disable_all_unit_ai(i);    删除所有单位的AI
11.disable_tech(i, "Medieval");    删除技术"中世纪"
12.kill_unit_type_anim(8,"Citizen",1);    删除或自杀 势力8农民1个
13.gain_tech(数字,政体);  固定政体

十七.触发器代码格式:

例子:trigger The_Vic( num_type(2,"House20")<=0){
       take_good(5,"food",300);
       }
例如现在设置的条件 就是玩家2名为house20的建筑的数量等于0,就会减少国家5单位300的食物.

十九.计时器代码
set_timer("Attack",60);
数字单位是秒
例如:现在就是60秒后触发  attack是触发器名字  
记得把定时器放进run_once{}或者触发器内.否侧定时器会出错.陷入不断循环中.

二十.给玩家迁都代码
set_capital(5,"撒丁岛"); 把玩家5的首都迁至撒丁岛

二十一.杀死一个单位,并选择死亡方式动画代码
1, no animation(没有动画)
2, stabbed(刺死)
3, shot(枪击而死,或箭射死)
4, exploded(炸死)
kill_unit_anim(6, 10, 4);杀死玩家6的一个ID为10的单位,并选择它以炸死的方式死亡
kill_unit_type()杀死某玩家所有此类型单位
例如:how_many_killed = kill_unit_type(7, “Scholar”);
          杀死玩家7所有Scholar(学者),并将杀死的数量赋值给变量
kill_unit_type_anim()杀死某所有此类型单位,并选择死亡方式动画
例如:how_many_killed = kill_unit_type_anim(5, “Caravan”, 3);
           杀死玩家5所有Caravan(商队),选择它们被枪打死或箭射死,并将杀死的数量            赋值给变量

二十二.摧毁建筑、杀死单位代码
1.destroy_building()
例如:destroy_building(2, 2011);  
           摧毁玩家2的ID为2011的单位
2.destroy_building_type()
例如:how_many_destroyed = destroy_building_type(3, “Farm”);
           摧毁玩家3所有farm(农场),并将摧毁数量赋给变量
3.kill_unit()
例如:kill_unit(3, 25);
           杀死玩家3的一个ID为25的单位

高级脚本进发
第一讲
trigger 触发器名称 (触发的条件){ 触发的内容 }
其中触发器名称是可以自己定的,但是要用英文写,在有多个触发器的情况下,触发器名称不能重复!也可以不写触发器名称。里边的括号和大括号都是一对一对的,不要忘记写反括号,不然编译会出错。触发的条件和内容就可以利用各种各样的脚本函数和代码来表示,在第二讲的时候已经介绍了很多函数和代码了。
当我们制作剧情的时候,我们往往会设想,当什么什么怎样,就要发生什么怎样的情况,比如,我设想,当我有三座城市之后,我想在游戏中出现一段话“哈哈!我们拥有了三座城市!”
用触发器表述就是:
trigger dialog ( num_cities(1)==3 ) { popup_dialog(“哈哈!我们拥有了三座城市!”); }
为了写得整洁,我们一般要这样写:
trigger dialog ( num_cities(1)==3 ) {
popup_dialog(“哈哈!我们拥有了三座城市!”);
}
这样写的时候,一定要注意:
1.一定不要忘了每个括号或者大括号是相对应的,不能多也不能漏掉。
2.在写触发内容的时候,每写完一句代码,就要写上英文的分号作为一句代码的结束,一定不能漏掉,否则编译出错。



第二讲
下面讲一下触发器trigger的特性。
Trigger触发器的特性就是只运行一次!
在第一讲的时候我就说过,所有代码都是在scenario{ }的大括号中完成的,scenario{ }有个特性,就是只要游戏开始,就会一直运行里边的代码。
如果我们不用触发器,直接在scenario{ }大括号中空白的位置写一句
popup_dialog (“哈哈!我们拥有了三座城市!”);
那会怎么样呢?
对,这是一个无条件的代码,所以,游戏一运行,就会弹出这么一个对话框“哈哈!我们拥有了三座城市!”这无法达到我们所设想的效果。更要命的是:这个对话框是永远关不掉的!点确定后马上又会出现,因为这句代码直接写在了scenario{ }里边,没有任何约束就会一直运行,这句代码就会一直不断地被实现。
那么,现在我们用了trigger触发器,由于触发器是一次性的,我们把代码写在trigger里边后放在scenario{ }里,就不会被重复运行,当触发条件满足后,就运行触发的内容,之后,这个触发器就失效了。这样,就不会造成对话框无法关掉的现象。
scenario{
......//此处省略很多行
trigger dialog ( num_cities(1)==3 ) {
popup_dialog(“哈哈!我们拥有了三座城市!”);
}
}



第三讲 trigger的用法
1.时间触发器
时间触发器很简单,首先要设置一个计时器可以在一开始的run_once{ }中设定,也可以在之前的触发器中设定。
例如:
run_once{
set_timer("aa",60); //游戏一开始的时候设定一个名字叫aa的60秒计时器
}
trigger (timer_expired("aa")){ //设定一个触发器,条件是计时器aa时间用尽
popup_dialog("敌人向我们发起攻击!") ; //触发内容是弹出这一句话
}
2.自循环触发器
我们已经知道trigger只能触发一次,那么我们如果想重复使用一个触发器的时候该怎么办呢?要想重复使用一个trigger触发器,需要一个函数,这就是enable_trigger();这个函数的功能就是使某个触发器恢复触发!还是上面的那个例子,这次我们把enable_trigger();这个代码加进去:
trigger The_Vic (num_type(1,"Auto Plant")<=0){
popup_dialog("由于没有了车辆制造厂,我们无力扭转大局只能失败!");
enable_trigger("The_Vic");
}
这样就能够自己把自己再次触发了!但是,这还是有问题的,如果我们只是这样写,那么这就跟直接在scenario{ }中写popup_dialog() 是完全一样的效果,下面那句话会一直出现永远关不掉!因为条件一旦满足,该触发器就一直会不断自我恢复又启动执行,从而陷入死循环。这该怎么办呢?下面我便向大家介绍定时循环trigger脚本代码:
何为定时循环trigger脚本代码,顾名思义就是一个trigger触发器定时自动启动后又再定时循环再启动!这就需要楼主之前介绍的计时器了。
那么该怎么使用计时器才能实现定时循环启动一个触发器呢?很简单,如下所示:
run_once{
set_timer("t",10);
}
trigger soldier (timer_expired("t")){
popup_dialog("我们的援军出现了!");
create_unit(1,100,120,"infantry",30);
set_timer("t",6);
enable_trigger("soldier");
}
这些代码就是一个定时循环触发器代码!在run_once{ }中,设定了一个游戏一开始便计时的计时器t,时间为10秒,10秒后,由于触发器"soldier"的触发条件就是计时器t时间耗尽,所以就触发了下面的内容,在这个触发器中间又设定了一个一样的触发器t,设定时间为6秒,同时还有一个恢复触发的函数enable_trigger();恢复对象是它本身!计时器t被重新计时,触发器soldier也被重新激活等待条件符合,这两个相互嵌套的代码就使得soldier触发器变成了一个定时循环触发器!
3.多个触发器嵌套使用
其实与自循环触发器一样,都是利用enable_trigger()这个函数,只是嵌套使用的时候恢复使用的触发器不是本身,而是其他触发器。例如:
trigger show_tips (object_type_selected(2,"university"))
{
clear_msg();
print_msg("只有研究完本时代的四项图书馆项目 才能进入下个时代!");
enable_trigger("hide_tips");
}
trigger hide_tips (!object_type_selected(2,"university"))
{
clear_msg();
enable_trigger("show_tips");
}
这两个触发器是相互依存的嵌套触发器,第一个触发器即触发器“show_tips”的含义是当玩家2选择了大学的时候,在屏幕上方打出提示“只有研究完本时代的四项图书馆项目 才能进入下个时代! ”,然后使触发器“hide_tips”变为可用;第二个触发器即“hide_tips”的含义是当玩家2没有选择大学的时候,清除提示,同时使触发器“show_tips”变为可用,这样一来,两个触发器相互嵌套,就能实现每次点击大学都能显示提示,点击其他地方清除提示的效果。



第四讲 if的用法
if的写法与trigger类似,基本格式是:
if ( 条件 ) { 内容 }
比如,如果玩家1的购买食物的价格低于100的时候,让玩家1购买食物。
if ( find_buy_price(1,"food")<=100 ){
buy_good(1,"food");
}
if和trigger的不同之处在于:
1.if不带名称,trigger可以带名称
2.if是一直会运行的,trigger只运行一次
if是最常用的代码之一,很多trigger触发器的内容中可以利用if再次进行判断而选择触发内容。
if还有一些搭配的代码,else 、else if 用法入下:
int city = num_cities(1); //把玩家1的城市数目赋值给变量city
if (city<=3){ //如果玩家1的城市数目小于或等于3时
set_population_cap(1,60); //把玩家1的人口上限设定为60
}
else if (city>3 && city<=6){ //另外如果玩家1的城市数目大于3并且小于等于6的时候
set_population_cap(1,120); //设定玩家1的人口上限为120
}
else { //其余的情况
set_population(1,200); //设定玩家1的人口上限为200
}
重点注意:if和trigger的区别
关于if这个代码,有些人说它跟trigger的功能都一样,语法规则也一样,为什么不直接用if而是特意设定了一个trigger代码呢?
首先,我们还是要先真正弄懂脚本的运行规则,在脚本编辑器的整个区间A中,出来run_once只执行一次外,其他的空间都是即时执行的,即:有代码在,就会执行!如果我们在区间A中没有任何规制的直接写一个 popup_dialog("某某某"); 那么会出现什么问题,那就是这句话会在游戏中出现,但是你永远都关不掉它!点完确定又马上会出现对话框“某某某”,点完又出现,所以,这句话的出现必须有条件。有条件的话,那么为什么if不行呢?if也是条件代码呀?如我之前所说,脚本的运行规则是即时运行的,在if的条件未满足之前,条件不成了,“某某某”不会出现,一旦if后的条件满足了,那么“某某某”就会出现,而且是出现了就关不掉,这怎么办呢?这时候就需要trigger了,trigger也是条件触发,但是它跟if不同在于——trigger只触发一次!!一旦条件满足了,触发启动了,之后这个触发器就算是用完了。比如说楼主上面图中有个代码:
trigger The_Vic (num_type(1,"Auto Plant")<=0){
popup_dialog("由于没有了车辆制造厂,我们无力扭转大局只能失败!");
}
看看这个代码,条件是"Auto Plant"(车辆制造厂)数目小于或等于0的时候弹出下面的那句话,这个脚本如果用if的话,当玩家1车辆制造厂数目小于1后,下面那句话就会一直跳出来,关不掉,这里用了trigger,那么下面那句话就只会弹出一次!这样我们就能把游戏进行下去。
关于if代码,由于它的一直运行的特性,自然会有需要用的地方。


第五讲 设定变量
何为变量,变量就是相当于一个容器,然后把数据装到里边,用的时候直接拿过来用。
比如:
int a = 10;
就是设定一个整型变量a,然后把整数10赋给a,这样a就相当于10,以后就可以直接用a来进行运算,类似于数学中“设……等于……”。
变量的类型有很多种,在国家的崛起脚本中,只要两种基本就够用了,分别是:
int 整型
string 字符型
整型变量用来装整数,字符型变量用来装文字。string的例子如:
string cap = "我们胜利了!";
表示把“我们胜利了!”这些文字赋给变量cap,那么以后,就可以直接用cap来代替“我们胜利了!”这句话了。

初学者可能感觉这变量岂不是把简单的弄复杂了,直接写原数字或者原话不就行了吗?
其实变量是大有用处的,利用变量,我们可以编写更为复杂的剧情,下面来简单介绍一下变量的妙用。
先讲个简单的,设定人口上限随城市数量变化而变化:
scenario{
……
int a = num_cities(1)*30;//设定一个整型变量a,把玩家1城市数目乘以30后赋值给a,
set_population_cap(1,a);//把玩家1的人口上限设定为a。
}
这两句代码是直接写在scenario{ }里边的,首先看第一行,由于代码直接写在scenario{ }之中,所以会一直运行,这样,a也就不断被重新赋值,当玩家1有一座城的时候,脚本在运行,a被赋予的值就是30,那么第二行代码马上就会设定玩家1的值为30,当玩家的城市数目发生变化,a的值也会被重新赋值,这样,人口也会相应变化。这样一来,就省下我们写每种情况,不论一座城两座城还是三座城,变量a都会帮我们自行调整数值,如果没有变量,那我们就必须用触发器或者if写出当有一座城的时候,人口多少;当有两座城时人口多少;当有三座城时……那将会是无比繁琐的工作,所以变量的使用可以大大节省代码。
变量使用的例子:
利用侧边栏提示国土面积:
scenario{
run_once{
add_objective_text("国土面积:","Land_area","");//——A
}
int land = 13*get_territory(2);//——B
change_objective_text("Land_area","国土面积:"+land+"万平方公里");//——C
}
A:在游戏一开始添加一个侧边栏提示,内容是“国土面积:”,这个侧边栏的代号为land_area;
B:游戏运行后,设定一个整型变量land,用get_territory(2)求出玩家2的领土比例(求得的不是百分比,是百分比的分子,例如领土20%的话就是20),再乘以13后赋值给变量land;
C:改变代号为“land_area”的侧边栏的内容,改为“国土面积:xxx万平方公里”(有+的地方表示在文字中额外加上一些字符或者数字)。这样,随着领土比例的改变,领土面积提示也会随之改变。

静态变量 static
静态变量是一种特殊的变量,它的特性就是:只运行一次。
一般的变量放在scenario{ }之中就可以不断被赋值,但是加上static之后,就只能被赋值一次,之后不会自动再赋值。
拿之前的人口上限脚本来说,如果把变量弄成静态变量:
scenario{
……
static int a = num_cities(1)*30;
set_population_cap(1,a);
}
那么,城市数量发生变化之后,人口是不会变化的。因为静态整型变量a在第一次被赋值之后,就不会再此自动赋值,虽然它在scenario{ }之中,这对它没有影响,所以说,它是“静态”变量。
静态变量是很需要的,因为有时候我们不需要变量会随意变化,而是由编者自己根据情况设定,这时候就必须用static了



第六讲 可选项触发脚本

所谓可选项触发脚本,就是玩家可以从给出的选项中进行选择,选不同的选项就会触发不同的脚本效果。这是很实用的一个脚本,现在我就来教大家怎么写这种脚本。
首先我们要学会一个脚本函数
popup_chioce();
这个函数的格式是
格式一:popup_choice( string 要写的说明 , string 选项一 , string 选项二 );
格式二:popup_choice( string 要写的说明 , string 选项一 , string 选项二 ,string 选项三);
格式一的返回值是,选择了选项一则返回1,选择选项二返回0;
格式二的返回值是,选择了选项一返回0,选择选项二返回1,选项三返回2;
这个返回值是很重要的,就是利用返回值的不同来触发不同的效果,具体怎么做就举个例子吧,就拿产生上图效果的脚本来看,上图效果产生是以下脚本的效果:
int id = find_build_at_city(2,capital,"Senate",1);
trigger canyiyuan (object_selected(2,id)){
bool zhengti =popup_choice("您选择了参议院,请问您想做什么?","研究政体","对外关系");
if( zhengti ) {
enable_trigger("Not_selected");
}
else {
enable_trigger("diploma");
}
}
trigger Not_selected (!object_selected(2,id)){
enable_trigger("canyiyuan");
}
补充说明:bool是一个变量类型,表示判断,它的值只有两种:1和0.
1表示肯定,0表示否定。因为这里用的是popup_choice的格式一写法,返回值就是1和0,所以这里用bool变量是可以的。
由于贴吧的文字处理太渣,我写在文档中截图说明每一行代码运行的含义:

之所以设定变量capital和id,是为了让迁都之后,点击新参议院依然可以触发。至于为什么大家自己去想,在讲变量的时候已经说过。



第七讲 可选项触发脚本

先上图


所谓可选项触发脚本,就是玩家可以从给出的选项中进行选择,选不同的选项就会触发不同的脚本效果。这是很实用的一个脚本,现在我就来教大家怎么写这种脚本。

首先我们要学会一个脚本函数
popup_chioce();
这个函数的格式是

格式一:popup_choice( string 要写的说明 , string 选项一 , string 选项二 );
格式二:popup_choice( string 要写的说明 , string 选项一 , string 选项二 ,string 选项三);

格式一的返回值是,选择了选项一则返回1,选择选项二返回0;
格式二的返回值是,选择了选项一返回0,选择选项二返回1,选项三返回2;

这个返回值是很重要的,就是利用返回值的不同来触发不同的效果,具体怎么做就举个例子吧,就拿产生上图效果的脚本来看,上图效果产生是以下脚本的效果:

int id = find_build_at_city(2,capital,"Senate",1);
trigger canyiyuan (object_selected(2,id)){
bool zhengti =popup_choice("您选择了参议院,请问您想做什么?","研究政体","对外关系");
if( zhengti ) {
enable_trigger("Not_selected");
}
else {
enable_trigger("diploma");
}
}
trigger Not_selected (!object_selected(2,id)){
enable_trigger("canyiyuan");
}

补充说明:bool是一个变量类型,表示判断,它的值只有两种:1和0.
1表示肯定,0表示否定。因为这里用的是popup_choice的格式一写法,返回值就是1和0,所以这里用bool变量是可以的。

由于贴吧的文字处理太渣,我写在文档中截图说明每一行代码运行的含义:


之所以设定变量capital和id,是为了让迁都之后,点击新参议院依然可以触发。至于为什么大家自己去想,在讲变量的时候已经说过。


第八讲  自定义函数

在制作剧情脚本时,有时候会遇到这种情况,那就是一种效果要多个国家都能实现,或者这个效果需要运用多次,如果每次都把所有的代码写一遍就会很浪费时间和脚本空间,这时候,有一个办法,那就是自定义一个脚本函数,每次要实现那个效果的时候直接调用之前的函数就能搞定!这样脚本代码就能俭省很多。

下面我来举个例子:
比如我想给每个国家都赠送1000粮食,1000木材,1000金属,1000财富。一个国家就得写4行代码,八个国家就是32行代码,太费时费力,现在我们可以用自定义函数的办法,能节省很多。怎么做呢?很简单,在剧情编辑器代码编写栏最上面先定义函数,注意:是在主脚本代码之外,即在scenario{    }之上。

定义的语法格式如下:
int scenario give_goods (int who)
{
give_good(who,"food",1000);
give_good(who,"timber",1000);
give_good(who,"metal",1000);
give_good(who,"wealth",1000);
give_good(who,"knowledge",1000);
}
int表示该函数的返回值类型是整形数字,scenario是定义声明,give_gooods是你自己定的这个剧情脚本的名称,(int who)是形式参数,就是说调用该函数的时候输入的相应类型的数据,下面大括号里的就是该函数的效果,我这个函数的效果就是给某玩家赠送1000粮食,1000木材,1000金属,1000财富。
调用的时候怎么用呢?很简单,在主脚本代码区域内要调用该函数,直接打出
give_goods(1);
give_goods(2);
give_goods(3);
give_goods(4);
give_goods(5);
give_goods(6);
give_goods(7);
give_goods(8);
就便是给八个国家都提供了1000粮食,1000木材,1000金属,1000财富!如果下面还要用,就再输入give_goods();(参数自定)就就行了。这样一来代码重复利用就简单快捷得多了,也相当于多了一个剧情函数
第九讲  switch case语句的使用

switch case 是C语言中的语句,由于脚本编辑器是以C语言为基础的,所以可以使用C语言中的switch case语句,其实C语言中的很多语句都可以在脚本编辑器中使用,以后会进一步介绍,现在先讲一下switch case 的用法。

switch case语句需要用到变量,它的一般写法如下:

switch(变量名称)
{
case 数值1:  
内容
break;

case 数值2:  
内容
break;

case 数值3:
内容
break;
... ...
case 数值n:  
内容
break;
default: 数值n+1;
}


其语义是:计算变量的值。 并逐个与其后的case的数值相比较,当变量的值与某个case的数值相等时, 即执行其后的语句,然后结束switch,如果没有break,则继续执行后面所有case后的语句。如变量的值与所有case后的数值均不相同时,则执行default后的语句。

在使用switch语句时还应注意以下几点:
1.在case后的各常量表达式的值不能相同,否则会出现错误。
2.在case后,允许有多个语句,可以不用{}括起来。
3.各case和default子句的先后顺序可以变动,而不会影响程序执行结果。
4.default子句可以省略不用。

下面举个例子,是自动播放音乐的脚本(图):


补充说明:
1.使用play_sound();这个函数的时候,音频文件必须与脚本文件在同一个文件夹,音频文件格式必须是wav格式。
2.play_sound();并非真的是控制背景音乐的函数,只是播放音效,用此函数播放的音乐会与真正的背景音乐相混,所以用此代码播放音乐必须把国家的崛起背景音乐关掉。另外,由于这只是音效,当游戏暂停时,音乐也会暂停,取消暂停后就会自动播放下一首。
3.以上只是列出了5首歌曲的循环播放,如想添加更多歌曲,自行添加case的情况。

第九讲  while语句的使用

while语句也是C语言的语句,while是个循环语句,其格式为:

while ( 循环条件 ){
循环内容
}

当条件符合时,执行下面的内容,执行之后再次判断是否符合条件,进入下次循环;当条件不符合时,跳出循环,while语句结束。

while循环在制作自定义函数时很有用,通常需要设定变量,利用变量值作为判断的条件。下面举个例子:

某国商人进入和平国家免耗损脚本:
int scenario trade (int who ,int whom){
int id_merchant =0 ;
int m = num_type(who,"merchant");
int c = 0 ;
while ( c<m ){
int merchant_x = object_position_x(who,id_merchant);
int merchant_y = object_position_y(who,id_merchant);
int owner = territory_owner( merchant_x , merchant_y );
if(object_type(who,id_merchant)=="Merchant"){
if( have_peace(who , whom)&&whom==owner){
set_object_health(who,id_merchant,100) ;
}
c++;
}
id_merchant++;
}
}

这个脚本的难点在于要找到所有商人的id已经他们的位置,并判断其所处位置是否是和平国家的领土,利用while循环就能轻易解决这些问题,不必自己去找每个商人,while语句根据条件自行寻找。

代码逐句解释如下(图):

c是在找到商人之后才会增加。这里边的两个变量:c和id_merchant,我做一下说明。
id_merchant是从0开始一直增加,当其数值刚好等于一个商人的编号时,c就会增加,表示找到一个商人if就会执行,这时就是判断这个找到的商人是不是在和平国家境内,是的话就执行第二个if的内容,即加满血。
while依旧运行,id_merchant数值继续增加,直到找出所有商人的编号,c也会增加到所有商人的数目的值,到了这个时候,c就不再小于m,而是等于m,因为m=num_type(2,"merchant");,这样一个完整的while循环就结束了,再利用scenario{  },无限次运行while,就能使所有商人不是只被加一次血,而是只要进入和平国家就能被加血。


            第十一讲  for循环语句的使用

for循环语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。它的写法如下:

for(表达式 1;表达式 2;表达式 3){
内容
}


它的执行过程如下:
(1)先求表达式 1.
(2)求表达式2,若其值为真(值为非0),则执行下面的内容,然后执行下面的(3),做若为
假(值为0),则结束循环,转到(5).
(3)求解表达式3
(4)转回上面第(2)步骤继续执行;
(5)结束循环,执行for语句下面的一个语句;

一般在for中,表达式都以变量为参考。

for(循环变量赋初值;循环条件;循环变量增值){  内容  }

例子:

for(i=1;i<3;i++){
sum=sum+i;
}

它的执行步骤是:
第一步:1赋值给变量i;
第二步:判断i是否小于3,此时i=1,所以i<3成立,接下来执行下面的内容;
第三步:变量sum的值加上变量i的值得到的结果赋给变量sum(没有说明的情况下,sum的初始值默认为0,于是相当于0+1得到1,把1赋值给sum);
第四步:i++,即i自增1后赋给i,即i=i+1=2;
第五步:判断i是否小于3,此时i=2,所以i<3成立,接下来执行sum=sum+1;
第六步:执行sum=sum+i;sum=1+2=3;
第七步:i++,i=2+1=3;
第八步:判断i是否小于3,此时i=3,所以i<3不成立,循环结束,sum的值为3。


这个for循环也可以用while语句来表达,相当于
i=1;
while(i<=100){
sum=sum+i;
i++;
}
显然,用for语句更简单、方便。


在脚本中使用for循环的例子:
for(int i=1;i<30;i++){
unit_move_order(2,create_unit(2,257,298,"Carrack",1),257,272);
}
在地图中257,298的位置添加30艘玩家2的大帆船,并命令他们都移动到坐标257,272位置去。







上一篇:新剧情体验
下一篇:今天刚加入论坛.不知道这游戏好玩吗
发表于 2015-7-7 18:04 | 显示全部楼层
我觉得可以多讲点例子,比如加一个国旗,一个新单位,具体步骤是什么等等,上面的太理论了。
 楼主| 发表于 2015-7-7 21:31 | 显示全部楼层
夏天下 发表于 2015-7-7 18:04
我觉得可以多讲点例子,比如加一个国旗,一个新单位,具体步骤是什么等等,上面的太理论了。

好,等周末我补充下。有C#基础会很好学,这个游戏的脚本是一套C#函数
 楼主| 发表于 2015-7-7 21:31 | 显示全部楼层
夏天下 发表于 2015-7-7 18:04
我觉得可以多讲点例子,比如加一个国旗,一个新单位,具体步骤是什么等等,上面的太理论了。

好,等周末我补充下。有C#基础会很好学,这个游戏的脚本是一套C#函数
发表于 2015-7-10 20:16 | 显示全部楼层
该图片只限百度用户内部交流使用

致力改善农村孩子的伙食健康
发表于 2015-7-10 20:17 | 显示全部楼层
另外再说一句这是什么语言

点评

这是微软根据C#精简的一套函数脚本。没有语言  发表于 2015-7-10 21:54
发表于 2015-7-21 08:21 | 显示全部楼层
什么语言不重要,都是分支,条件,循环,顺序罢了,重要的是流程,我们都是非专业人员,学这些语法用处不大(当然还是有用的),但玩家重要的是能快速的自己改自己想要的。还是建议多有例子,让玩家照猫画虎的学。
发表于 2015-9-9 22:42 | 显示全部楼层
顶顶顶顶  支持 支持
发表于 2015-11-5 07:04 | 显示全部楼层
不错!再看一下!!!
发表于 2015-12-14 21:25 | 显示全部楼层
多些分享111
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

牧羊头条上一条 /1 下一条

QQ|Archiver|手机版|小黑屋|牧羊三国游戏网

GMT+8, 2024-12-22 12:03 , Processed in 2.246767 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表