Mrtuan
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Hệ thống Module

Go down

Hệ thống Module Empty Hệ thống Module

Bài gửi by Admin Wed 01 Nov 2017, 14:57

Phần 1: Bắt đầu.

1.1 Hệ thống Module là gì? 
Hệ thống mô-đun Mount & Blade là tập hợp các tập lệnh python cho phép bạn tạo và / hoặc sửa đổi nội dung cho Mount & Blade. Đây thực sự là hệ thống chúng tôi đang sử dụng để làm việc với nội dung của phiên bản chính thức. Sử dụng hệ thống mô-đun, bạn có thể làm những việc như thêm quân chủng mới, nhân vật mới, nhiệm vụ mới, hộp thoại mới, v.v. hoặc bạn có thể chỉnh sửa nội dung hiện có. 

Điều quan trọng cần lưu ý là Mount & Blade không sử dụng Python và không đọc kịch bản Python của Hệ thống Mô-đun trực tiếp. Thay vào đó, các tập lệnh python được thực hiện để tạo các tập tin văn bản mà Mount & Blade đọc.

Mount & Blade thực sự đọc nội dung của nó từ các tập tin văn bản trong thư mục Mount & Blade / Modules. Vì vậy, về lý thuyết bạn có thể thực hiện tất cả những sửa đổi bạn muốn thực hiện bằng cách chỉnh sửa các tập tin văn bản này. (Thật vậy, một số mods đã làm việc ra làm thế nào để sử dụng các tập tin này và đã có thể tạo mods tuyệt vời của mình.) Tuy nhiên các tập tin văn bản không thực sự con người có thể đọc được và rất không thực tế để làm việc với. Hiện tại có hai lựa chọn để viết mô đun mới. Đầu tiên là hệ thống mô-đun chính thức được mô tả trong tài liệu này. Khác là trình soạn thảo không chính thức của Effidian hiện đang bị ngưng và không sử dụng được cho phiên bản hiện tại - v.1.011, nhưng hoạt động cho các phiên bản cũ của M & B, chẳng hạn như v.7.51. 

1.2 Các yêu cầu đối với việc sử dụng Hệ thống Module

Hệ thống mô đun bao gồm các tập lệnh Python, và như vậy, bạn cần phải cài đặt Python trên hệ thống để có thể làm việc với chúng. Bạn có thể tải về Python từ trang tải về của Python.org: 
http://www.python.org/download/
Có hơn một vài lần tải xuống trên trang đó. Tuy nhiên bạn sẽ chỉ cần phiên bản 2.6 hoặc 2.4 cho Windows. 

Sau khi bạn tải về và cài đặt Python, bạn cũng cần phải thêm Python vào biến môi trường đường dẫn của bạn. Điều này rất quan trọng, vì vậy hãy cố gắng chính xác khi bạn thực hiện những thay đổi này. 

Đối với hệ thống Windows 9x, bạn có thể chỉnh sửa tệp tin autoexec.bat và thêm thư mục python của bạn vào Đường dẫn. Ví dụ nếu Python được cài đặt dưới C: \ Python24, hãy thêm dòng sau: 
set PATH = C: \ Python24;% PATH%

Nếu bạn có hệ điều hành Windows XP hoặc Windows Vista, thao tác này hơi khác: Nhấp chuột phải vào My Computer (Máy tính trong trình đơn bắt đầu cho người dùng Vista), chọn 'Properties', nhấp vào tab 'Advanced' và nhấp vào 'Variablesment Variables': 

Hệ thống Module Modulesystemjl4

1. Di chuyển xuống 'System variables' cho đến khi bạn tìm thấy biến 'Path'. 

2. Nhấp vào nút 'Chỉnh sửa ...', một cửa sổ mới sẽ bật lên: 

Hệ thống Module Modulesystem2ua4

Cuộn đến cuối của 'Variable value' và thêm "; C: \ Python26". 

Nhấp OK vào ô này, sau đó nhấp vào ô tiếp theo. 

1.3 Lấy Hệ thống Mô đun
Phiên bản mới nhất của Hệ thống Mô-đun có thể được tải xuống từ các liên kết được liệt kê ở đây: 

http://forums.taleworlds.com/index.php/topic,111706.0.html

Bạn sẽ cần phải tải xuống tệp zip cho hệ thống mô-đun và trích xuất nó (yêu cầu một chương trình như WinRAR hoặc 7-zip). Giải nén hệ thống mô đun ở bất cứ nơi nào dễ dàng xác định vị trí, ví dụ như Máy tính để bàn hoặc Tài liệu của tôi. 

1.4 Module Sytem Files

Bây giờ, chúng ta hãy nhìn vào các file trong hệ thống mô-đun. Khi chúng ta nhìn vào các tệp Python thực tế (các tệp kết thúc bằng .py), chúng ta thấy rằng có bốn loại tệp: 

    * các tệp bắt đầu bằng tệp header_ 
    * bắt đầu bằng 
    tệp process_ * bắt đầu với tệp ID_ 
    * bắt đầu bằng module_

Hai loại tệp đầu tiên là cần thiết để chạy hệ thống mô-đun. Bạn không nên sửa đổi những điều này ở tất cả. Loại thứ ba của tệp tin (ID_) là tệp tạm thời được tạo ra trong khi xây dựng mô-đun. Bạn có thể xóa chúng nếu muốn và hệ thống mô-đun sẽ tạo ra chúng một lần nữa. Loại cuối cùng của tệp tin (module_) thực sự là các tệp có chứa dữ liệu nội dung. Đây là những tệp bạn sẽ sửa đổi. 


1.5 Tạo ra một mô-đun mới


Trước khi đi tiếp, hãy tạo thư mục cho mô đun mới của bạn. Đối với điều này, chúng ta cần phải vào thư mục Mount & Blade / Modules (mặc định là "c: / Program Files / Mount & Blade / Modules") Bây giờ, trong thư mục Modules, phải có thư mục Native. Đây là, do đó, để nói chuyện, các mô-đun chính thức. Đối với mô-đun của riêng bạn, bạn phải tạo một thư mục mới ở đây, và sao chép các tệp tin từ Bản gốc sang thư mục mới. Thư mục mới này sẽ là thư mục mô-đun riêng của bạn để đặt tên nó như bạn muốn. Để đơn giản, tôi giả sử nó được đặt tên MyNewModule

Bạn có thể kiểm tra nếu bạn đã làm điều này ngay bằng cách khởi chạy Mount & Blade. Bây giờ, cửa sổ khởi chạy của Mount & Blade sẽ hiển thị hộp combo, cho phép bạn chọn mô-đun bạn muốn chơi. Bây giờ, hãy thử chọn module mới và bắt đầu một trò chơi mới. Vì chúng tôi đã sao chép nội dung của thư mục gốc cho mô-đun mới của chúng tôi, trò chơi mà chúng tôi chơi bây giờ sẽ giống với trò chơi gốc. 

Tiếp theo, chúng ta phải làm cho Hệ thống Mô-đun sử dụng thư mục mới làm mục tiêu của nó. Để làm điều đó, mở tệp module_info.py để chỉnh sửa (Nhấp chuột phải vào tệp và chọn "Chỉnh sửa bằng IDLE" hoặc mở tệp bằng Notepad hoặc trình chỉnh sửa văn bản ưa thích) và thay đổi export_dir để trỏ đến thư mục mới của bạn. Ví dụ, nếu thư mục cho module của bạn là: c: / Program Files / Mount & Blade / Modules / MyNewModule Bạn nên thay đổi dòng này như sau:

export_dir = "C: / Program Files / Mount & Blade / Modules / MyNewModule /" 

Bây giờ thiết lập hệ thống module của chúng tôi sẽ sẵn sàng. Để thử nó ra, loại bỏ các tập tin conversation.txt bên trong thư mục mô-đun mới của chúng tôi, và sau đó nhấp đúp vào build_module.bat. Bạn sẽ thấy dấu nhắc lệnh với một số kết quả như sau:


Initializing...
Compiling all global variables...
Exporting strings...
Exporting skills...
Exporting tracks...
Exporting animations...
Exporting meshes...
Exporting sounds...
Exporting skins...
Exporting map icons...
Creating new tag_uses.txt file...
Creating new quick_strings.txt file...
Exporting faction data...
Exporting item data...
Exporting scene data...
Exporting troops data
Exporting particle data...
Exporting scene props...
Exporting tableau materials data...
Exporting presentations...
Exporting party_template data...
Exporting parties
Exporting quest data...
Exporting scripts...
Exporting mission_template data...
Exporting game menus data...
exporting simple triggers...
exporting triggers...
exporting dialogs...
Checking global variable usages...

______________________________

Script processing has ended.
Press any key to exit. . .




Nếu bạn gặp lỗi, đảm bảo bạn đã thực hiện đúng tất cả các bước của hướng dẫn này, và nếu bạn nghĩ rằng bạn có, hãy sử dụng chức năng Tìm kiếm trên diễn đàn; rất có thể là ai đó đã chạy vào cùng một vấn đề và một giải pháp dễ dàng đã được đăng. 

Admin
Admin

Tổng số bài gửi : 1214
Join date : 19/04/2012
Age : 31

https://mrtuan.forumvi.com

Về Đầu Trang Go down

Hệ thống Module Empty Re: Hệ thống Module

Bài gửi by Admin Wed 01 Nov 2017, 15:09

Part 2: Editing Module System Files
[size=10]« on: May 03, 2006, 02:51:03 PM »

As mentioned in the previous chapter, you work with the Module system as follows:
1 ) Edit one or more of the module files (those starting with module_ and ending with .py) and make any changes you like. (Usually you need to right click and select 'Edit with Idle' to do that)
2 ) After that, double click on the file build_module.bat . This action will attempt to build your module (and report errors if there are any)
3 ) If there are no errors, you may launch Mount&Blade and test the changes you have made. Sometimes you may need to start a new game for the changes to take effect.

2.1 -- Editing the Module Files

The module system uses Python lists to represent collections of game objects. ( A python lists starts with a '[', includes a list of objects seperated by commas, and ends with a  ']'  ) If you open and view any of the module files you'll see that it contains such a list. For example module_map_icons.py contains:

map_icons = [
  ("player",0,"player", 0.2, snd_footstep_grass),
  ("player_horseman",0,"player_horseman", 0.2, snd_gallop),
  ("gray_knight",0,"knight_a", 0.2, snd_gallop),
  ("vaegir_knight",0,"knight_b", 0.2, snd_gallop),
  ("peasant",0,"peasant_a", 0.2,snd_footstep_grass),
  ("khergit",0,"khergit_horseman", 0.2,snd_gallop),
  ("axeman",0,"bandit_a", 0.2,snd_footstep_grass),
  ("woman",0,"woman_a", 0.2,snd_footstep_grass),
  ("town",mcn_no_shadow,"City", 0.9,snd_footstep_grass),
]

Here map_icons is declared as a Python list and every element in the list is the declaration for a specific map icon object. In this example, ("player",0,"player", 0.2, snd_footstep_grass) is such an object. We call such objects tuples. Tuples, like lists, contain elements seperated by commas (but they start and end with parentheses). The structure of each tuple object is documented at the beginning of the module file. For map icons, each tuple object contains: 

1 ) name of the icon,
2 ) icon flags,
3 ) Mesh name,
4 ) Mesh scale,
5 ) sound id.

So, for the first tuple ("player",0,"player", 0.2, snd_footstep_grass)
1 ) name of the icon = "player"
2 ) icon flags = 0
3 ) Mesh name = "player"
4 ) Mesh scale = 0.2
5 ) sound id = snd_footstep_grass

You can work out the structure of game objects for each module system file in this way, by reading the documentation at the beginning and matching that with the contents of the list.


2.2 -- Adding New Game Objects

Knowing the structure of the map icon tuples, we can now begin to add our own map icons. Let us take another look at the list.

map_icons = [
  ("player",0,"player", 0.2, snd_footstep_grass),
  ("player_horseman",0,"player_horseman", 0.2, snd_gallop),
  ("gray_knight",0,"knight_a", 0.2, snd_gallop),
  ("vaegir_knight",0,"knight_b", 0.2, snd_gallop),
  ("peasant",0,"peasant_a", 0.2,snd_footstep_grass),
  ("khergit",0,"khergit_horseman", 0.2,snd_gallop),
  ("axeman",0,"bandit_a", 0.2,snd_footstep_grass),
  ("woman",0,"woman_a", 0.2,snd_footstep_grass),
  ("town",mcn_no_shadow,"City", 0.9,snd_footstep_grass),
]

New game objects in any module file must be added inside the list. You can see, the list for module_map_icons ends just below ("town",mcn_no_shadow,"City", 0.9,snd_footstep_grass). In order to make room for our new game object, we have to move the bracket down by one line.

Having done that, we can now begin to add a new object. The easiest way to do this is to copy and paste a pre-existing object and then editing its contents. For example:


map_icons = [
  ("player",0,"player", 0.2, snd_footstep_grass),
  ("player_horseman",0,"player_horseman", 0.2, snd_gallop),
  ("gray_knight",0,"knight_a", 0.2, snd_gallop),
  ("vaegir_knight",0,"knight_b", 0.2, snd_gallop),
  ("peasant",0,"peasant_a", 0.2,snd_footstep_grass),
  ("khergit",0,"khergit_horseman", 0.2,snd_gallop),
  ("axeman",0,"bandit_a", 0.2,snd_footstep_grass),
  ("woman",0,"woman_a", 0.2,snd_footstep_grass),
  ("town",mcn_no_shadow,"City", 0.9,snd_footstep_grass),
  ("new_icon",mcn_no_shadow,"City", 0.9,snd_footstep_grass),
]


In this example, we have copied ("town",mcn_no_shadow,"City", 0.9,snd_footstep_grass) and given it a new icon name; "new_icon". This new icon has a flag on it. Flags are settings that can be turned on and off by including or removing them in the appropriate field. For example, the flag mcn_no_shadow on our new icon will set this icon to cast no shadow on the ground.

We will now remove mcn_no_shadow from our new icon. To do this, we replace mcn_no_shadow with 0, telling the module system there are no flags for this icon.


map_icons = [
  ("player",0,"player", 0.2, snd_footstep_grass),
  ("player_horseman",0,"player_horseman", 0.2, snd_gallop),
  ("gray_knight",0,"knight_a", 0.2, snd_gallop),
  ("vaegir_knight",0,"knight_b", 0.2, snd_gallop),
  ("peasant",0,"peasant_a", 0.2,snd_footstep_grass),
  ("khergit",0,"khergit_horseman", 0.2,snd_gallop),
  ("axeman",0,"bandit_a", 0.2,snd_footstep_grass),
  ("woman",0,"woman_a", 0.2,snd_footstep_grass),
  ("town",mcn_no_shadow,"City", 0.9,snd_footstep_grass),
  ("new_icon",0,"City", 0.9,snd_footstep_grass),
]


Both "town" and "new_icon" use the Mesh "City", which means they will both use the 3d model named "City" in the game's resource files. By changing this field, the icon can be set to use any 3d model from the resource files.

Because both icons use the same Mesh, if we were to put "new_icon" into the game at this point, it would look exactly the same as "town".

Now let us give "new_icon" a bit of a different look.

map_icons = [
  ("player",0,"player", 0.2, snd_footstep_grass),
  ("player_horseman",0,"player_horseman", 0.2, snd_gallop),
  ("gray_knight",0,"knight_a", 0.2, snd_gallop),
  ("vaegir_knight",0,"knight_b", 0.2, snd_gallop),
  ("peasant",0,"peasant_a", 0.2,snd_footstep_grass),
  ("khergit",0,"khergit_horseman", 0.2,snd_gallop),
  ("axeman",0,"bandit_a", 0.2,snd_footstep_grass),
  ("woman",0,"woman_a", 0.2,snd_footstep_grass),
  ("town",mcn_no_shadow,"City", 0.9,snd_footstep_grass),
  ("new_icon",0,"City", 5.0,snd_footstep_grass),
]


In this example, we have changed the icon's scale from 0.9 to 5.0. This means the icon will be displayed five times as large as normal. That should help us tell it apart from "town" when we put it into the game.

Next we will create a new party in module_parties.py that uses our new icon. To do this, we will need to referencethe icon from module_parties.py.


2.3 -- Referencing Game Objects

Open module_parties.py in your module system folder. You will see another Python list, parties = [.

As you can see, the structure of tuples in module_parties.py is slightly different from module_icons. This holds true for many -- if not all -- of the module files. We'll take this opportunity to closely examine the parties structure.

An example of a party: 

("zendar","Zendar",icon_town|pf_is_static|pf_always_visible|pf_hide_defenders, "zendar", pt_none, fac_neutral,0,ai_bhvr_hold,0,(2,46),[(trp_swadian_knight,6,0)]),

This tuple places the town of Zendar on the map. Zendar's various qualities are set in the appropriate fields -- quite similar to the fields we've seen in module_icons.py.

Breakdown of the tuple fields:

1 ) Party-id. This is used for referencing the party in other files.
2 ) Party name. This is the party's name as it will appear in-game. Can be as different from the party-id as you like.
3 ) Party flags. The first flag of every party object must be the icon that this party will use.
4 ) Menu. This field is deprecated, which means that it's outdated and no longer used. As of M&B version 0.730, this field has no effect whatsoever in the game.
5 ) Party-template. ID of the party template this party belongs to. Use pt_none as the default value.
6 ) Party faction. This can be any entry from module_factions.py.
7 ) Party personality. See header_parties.py for an explanation of personality flags.
8 ) AI-behaviour. How the AI party will act on the overland map.
9 ) AI-target party. The AI-behaviour's target.
10 ) Initial coordinates. The party's starting coordinates on the overland map; X, Y.
11 ) List of troop stacks. Each stack record is a triple that contains the following fields:
 11.1 ) Troop-id. This can be any regular or hero troop from module_troops.py.
 11.2 ) Number of troops in this stack; does not vary. The number you input here is the number of troops the town will have.
 11.3 ) Member flags. Optional. Use pmf_is_prisoner to note that a party member is a prisoner.


Zendar tuple examination:

("zendar","Zendar",icon_town|pf_is_static|pf_always_visible|pf_hide_defenders, "zendar", pt_none, fac_neutral,0,ai_bhvr_hold,0,(2,46),[(trp_swadian_knight,6,0)]),

1 ) Party-id = "zendar"
2 ) Party name = "Zendar"
3 ) Party flags = icon_town|pf_is_static|pf_always_visible|pf_hide_defenders
4 ) Menu = "zendar"
5 ) Party-template = pt_none
6 ) Party faction = fac_neutral
7 ) Party personality = 0
8 ) AI-behaviour = ai_bhvr_hold
9 ) AI-target party = 0
10 ) Initial coordinates = (2,46)
11 ) List of troop stacks:
 11.1 ) Troop-id = trp_swadian_knight
 11.2 ) Number of troops in this stack = 6
 11.3 ) Member flags = 0

By looking at field 3, we can see that Zendar references the icon "town" from module_icons.py, by adding the prefix icon_ to it. This prefix is what points the system to the right module file. In order to reference module_icons, we use icon_; in order to reference module_factions, we use fac_; in order to reference module_parties, we use p_; and so on. There is an appropriate prefix for every module file -- you will find them all listed at the bottom of this segment.


Now that we know how parties are structured, we can begin adding our own. But before you do so, take note: In the case of module_parties.py and certain other module files, you should not add your new towns at the bottom of the list. There will be comments in these files warning you about doing this, as it can break operations in the native code. In module_parties.py, it is recommended that you add any new entries between "training_ground" and "castle_1".

Now, copy the entry "town_14" and paste it in between "training_ground" and "castle_1".

  ("training_ground","Training Ground",  icon_town|pf_town|pf_disabled, "training_ground", pt_none, fac_vaegirs,0,ai_bhvr_hold,0,(-2,-3),[(trp_vaegir_knight,6,0)]),

  ("new_town","Mod_Town",  icon_town|pf_town, "town", pt_none, fac_vaegirs,0,ai_bhvr_hold,0,(-4,-37),[(trp_vaegir_knight,6,0)]),

  ("castle_1","Culmarr_Castle",icon_town|pf_is_static|pf_always_visible, "castle", pt_none, fac_outlaws,0,ai_bhvr_hold,0,(-47,-51),[(trp_swadian_knight,5,0),(trp_swadian_crossbowman,25,0)]),


In this example, we have changed the new party's identifier from "town_14" to "new_town", and the party name from "Halmar" to "Mod_Town".

We can now establish several things from looking at the tuple.

1 ) To reference this party from another file, we must use the identifier "new_town" with the prefix "p_", resulting in "p_new_town".
2 ) In the game, we will only see the name "Mod Town" to describe this party, never the identifier.
3 ) This party uses icon_town and the flag pf_town -- a flag that assigns common town settings. The flags field will be where our next few changes take place.
4 ) "Mod Town" is currently of the Vaegir faction.
5 ) If we were to put our new town into the game at this point, it would appear at exactly the same map coordinates as Halmar. This, too, we will change next.


  ("training_ground","Training Ground",  icon_town|pf_town|pf_disabled, "training_ground", pt_none, fac_vaegirs,0,ai_bhvr_hold,0,(-2,-3),[(trp_vaegir_knight,6,0)]),

  ("new_town","Mod_Town",  icon_new_icon|pf_town, "town", pt_none, fac_neutral,0,ai_bhvr_hold,0,(-1,-1),[(trp_vaegir_knight,6,0)]),

  ("castle_1","Culmarr_Castle",icon_town|pf_is_static|pf_always_visible, "castle", pt_none, fac_outlaws,0,ai_bhvr_hold,0,(-47,-51),[(trp_swadian_knight,5,0),(trp_swadian_crossbowman,25,0)]),


Here we have changed our new town's icon to icon_new_icon and its map coordinates to (-1,-1). In addition, we've switched the town's faction to fac_neutral.

The town is now set up to use our new icon and has its own unique map coordinates, allowing it to show up without problems.

Save your progress, then click on build_module.bat. If everything went well, you should now be able to start up your mod and see the new town and icon near the centre of the map. Try it.

If everything did not go well, check carefully for spelling and syntax. Make very sure that all commas and brackets are in the right place. Bad syntax is the most common source of compiler errors in the official module system.

In-game, travelling to the town now will trigger a combat encounter, because the town currently has no game menu assigned to it. Assigning a menu is a slightly complicated task, so we will leave our new town for the moment and return to it in a later chapter of this documentation.

As you can see, the interrelation of the various module files can be extensive. Every part must be covered for your module to work properly. Fortunately, most changes only require the editing of one or two files at most.

Now that you have a thorough grasp of the modding basics, we can take an in-depth look into the various module files. Please go to Chapter 3 of the documentation now.


List of module file prefixes:

fac_   -- module_factions.py
icon_   -- module_map_icons.py
itm_   -- module_items.py
mnu_   -- module_game_menus.py
mno_   -- module_game_menus.py -- References an individual menu option in module_game_menus.
mt_   -- module_mission_templates.py
psys_   -- module_particle_systems.py
p_      -- module_parties.py
pt_   -- module_party_templates.py
qst_   -- module_quests.py
script_   -- module_scripts.py
scn_   -- module_scenes.py
spr_   -- module_scene_props.py
str_   -- module_strings.py
trp_   -- module_troops.py

module_dialogs.py is never directly referenced, so it has no prefix.
[/size]

Admin
Admin

Tổng số bài gửi : 1214
Join date : 19/04/2012
Age : 31

https://mrtuan.forumvi.com

Về Đầu Trang Go down

Hệ thống Module Empty Re: Hệ thống Module

Bài gửi by Admin Wed 01 Nov 2017, 15:10

Phần 3: Module_Troops
« Vào lúc: Tháng Năm 13, 2006, 11:13:52 PM»

Trong chương này của tài liệu, chúng tôi sẽ giới thiệu module_troops.py và các chức năng của nó. Module_troops là nơi mà tất cả các binh lính thường xuyên, Heroes, ngực và NPC của thành phố được xác định, hoàn chỉnh với khuôn mặt, điểm số năng lực và khoảng không quảng cáo. Bất cứ khi nào bạn muốn thực hiện một nhân vật mới hoặc loại lính, đây là tập tin bạn sẽ được modding. 

3.1 - Phân tích Module_Troops

Tập tin bắt đầu bằng một khối mã nhỏ để tính toán các thông tin về vũ khí và một số mã không thể điều khiển được. Vì toàn bộ khối này nằm ngoài danh sách Python và chúng tôi sẽ không chỉnh sửa nó, nó không cần phải quan tâm đến chúng tôi. Bỏ qua danh sách các quân đội = [ .

Ở đây chúng ta tìm thấy bộ đôi cho người bạn của chúng tôi, người chơi, và một số quân khác quan trọng cho trò chơi. Dưới đây là những máy bay chiến đấu khác nhau mà chúng ta gặp phải trong huấn luyện viên Zendar. Chúng ta sẽ nghiên cứu một vài trong số này, vì chúng là những ví dụ tuyệt vời cho sự tiến triển cấp quân bình thường. 

Quan sát: 

  ["novice_fighter", "novice_fighter", "novice_fighters", tf_guarantee_boots | tf_guarantee_armor, no_scene, reserved, fac_commoners, 
   [itm_sword, itm_hide_boots], 
   str_6 | agi_6 | cấp (5), wp (60), knows_common, swadian_face1, swadian_face2 ],

Đây là một đội quân tiêu chuẩn láng giềng được gọi là "chiến binh mới làm quen". "người chiến binh mới làm quen" là cấp thấp, không chiến đấu rất tốt, có điểm số về khả năng thấp, và nếu không thì không đáng kể. 


Phân tích các lĩnh vực tuple:

1) Troop id. Được sử dụng để tham khảo quân đội trong các tệp khác. 
2) Toop tên. 
3) tên lính nhiều. 
4) Troop flag. tf_guarantee_ * cờ phải được thiết lập nếu bạn muốn chắc chắn rằng quân đội luôn được trang bị một loại danh mục kiểm kê. Nếu không, quân đội có thể xuất hiện mà không có áo giáp thuộc loại đó. Chỉ có vũ khí cận chiến được đảm bảo trang bị, nếu có trong hàng tồn kho của quân đội. 
5) Cảnh. Điều này chỉ áp dụng cho Heroes; nó điều chỉnh tại nơi cảnh và điểm nhập cảnh Hero sẽ xuất hiện. Ví dụ, scn_reyvadin_castle | entry (1) đưa quân đội vào điểm nhập cảnh 1 tại lâu đài Reyvadin. 
6) Dành riêng. Không sử dụng; phải được giữ lại hoặc 0 .
7) Phe phái. Phe của quân đội, được sử dụng với tiền tố fac_ . 
Cool Hàng tồn kho. Một danh sách các mục trong hàng tồn kho của quân đội. Quân thường xuyên sẽ chọn thiết bị từ danh sách này một cách ngẫu nhiên. 
9) Các thuộc tính. Điểm số thuộc tính của quân đội và cấp độ nhân vật. Các công việc này chính xác như chúng làm cho người chơi. 
10) Năng lực vũ khí. Điểm thành thạo vũ khí của đội quân này. Chức năng wp (x) sẽ tạo ra sự ngẫu hứng vũ khí ngẫu nhiên gần với giá trị x, nhưng bạn cũng có thể thêm các định nghĩa bổ sung để chỉ định cụ thể điểm đánh giá nhất định. Ví dụ: để tạo chuyên gia bắn cung với các thông số vũ khí khác gần 60, bạn có thể sử dụng: 
           wp_archery (160) | wp (60)
11) Kỹ năng. Đây cũng giống như kỹ năng của người chơi. Lưu ý rằng, ngoài các thuộc tính và kỹ năng bạn đã xác định, quân đội cũng được 1 điểm thuộc tính ngẫu nhiên và 1 điểm kỹ năng ngẫu nhiên trên mỗi nhân vật. 
12) Mã khuôn mặt. Trò chơi sẽ tạo khuôn mặt theo mã này. Bạn có thể xuất mã khuôn mặt mới từ trò chơi bằng cách nhấn CTRL + E trong màn hình soạn thảo mặt trong khi Chế độ Chỉnh sửa đang hoạt động. 
13) Mã mặt 2. Chỉ áp dụng cho quân đội thường xuyên, có thể được bỏ qua cho Heroes. Trò chơi sẽ tạo khuôn mặt ngẫu nhiên giữa khuôn mặt 1 và mặt mã số 2 cho mỗi cá thể loại quân này. 

Novice_fighter tuple exam: 

1) Troop id = "novice_fighter" 
2) Toop name = "novice_fighter" 
3) danh từ số nhiều = "novice_fighters"
4) Troop flag = tf_guarantee_boots | tf_guarantee_armor 
5) Cảnh = no_scene 
6) Dành riêng = Dành riêng 
7) Faction = fac_commoners 
Cool Inventory = [itm_sword, itm_hide_boots] 
9) Thuộc tính = str_6 | agi_6 | cấp (5) 
10) Vũ khí proficiencies = wp (60) 
11) Kỹ năng = know_common 
12) Mặt mã = ​​swadian_face1 
13) Mặt mã 2 = swadian_face2 

Có ba điều cần lưu ý về bộ này. 

"Máy bay chiến đấu mới làm của chúng tôi" có tf_guarantee_armor , nhưng không có áo giáp của riêng mình. Tuy nhiên, điều này không làm tf_guarantee_armor dư thừa; quân đội sẽ mặc áo giáp nhận được trong suốt trận đấu.

Để bắt đầu với (ví dụ ở cấp 1), "novice_fighter" có STR của 6 và AGI là 6. Khi bắt đầu trò chơi, anh ta bị va chạm đến Cấp 5, với tất cả các tăng stat thông thường có ý nghĩa. 

Anh ta có kỹ năng know_common . knows_common là một tập hợp các kỹ năng đã được định nghĩa ở đầu module_troops; cuộn lên và quan sát bộ sưu tập này bây giờ. 

knows_common = know_riding_1 | knows_trade_2 | knows_inventory_management_2 | knows_prisoner_management_1 | knows_leadership_1

Một nhóm có hiểu biết thông thường sẽ có mọi kỹ năng được liệt kê ở đây; một kỹ năng Thương mại của 2, kỹ năng Quản lý Hàng tồn kho của 2, kỹ năng Quản lý Nhà tù 1, và kỹ năng lãnh đạo của 1. know_common là những gì được biết đến như là mộtliên tục ; một cụm từ đại diện cho cái gì đó khác, có thể là một số, một định danh, một hằng số khác hoặc bất kỳ đối tượng hợp lệ nào khác. Hằng số có thể biểu diễn bất kỳ số đối tượng nào, miễn là các đối tượng đó nằm trong đúng thứ tự cho nơi mà bạn dự định sử dụng hằng số này. 

Trong trường hợp này, knows_common được định nghĩa là knows_riding_1 | knows_trade_2 | knows_inventory_management_2 | knows_prisoner_management_1 | knows_leadership_1 . Vì vậy, trong thực tế, bằng cách đặt knows_common trong trường Kỹ năng, hệ thống mô-đun sẽ hoạt động giống như khi bạn đã đánh máy lên know_riding_1 | know_trade_2 | knows_inventory_management_2 | knows_prisoner_management_1 | knows_leadership_1 trong trường Kỹ năng.

Bây giờ chúng ta hãy nhìn vào mục kế tiếp trong danh sách. 


  ["regular_fighter", "regular_fighter", "regular_fighters", tf_guarantee_boots | tf_guarantee_armor, no_scene, dành riêng, fac_commoners, 
   [itm_sword, itm_hide_boots], 
   str_8 | agi_8 | cấp (11), wp (90), know_common | biết_ironflesh_1 | knows_power_strike_1 | knows_athletics_1 | know_riding_1 | knows_shield_2, swadian_face1, swadian_face2],


Trong ví dụ này, bạn có thể thấy một "máy bay chiến đấu thông thường" mạnh hơn một chút; chương trình này có khả năng điểm số cao hơn, là mức 11, và biết một số kỹ năng vượt knows_common . Trong trò chơi, nếu một số "chiến binh không chuyên" trong bữa tiệc của chúng tôi đã đạt đủ kinh nghiệm để đạt đến cấp 11, chúng tôi có thể nâng cấp chúng thành "những người thường xuyên chiến đấu". 


3.2 - Nâng cấp quân đội

Danh sách trong đó quân đội có thể được nâng cấp thành những gì có ở cuối module_troops. Xin hãy cuộn xuống dưới cùng bây giờ. 

Như bạn thấy, mỗi lựa chọn nâng cấp của quân đội phải được xác định ở đây thông qua nâng cấp hoạt động (quân đội) . Chuỗi đầu tiên là ID của quân đội được nâng cấp, chuỗi thứ hai là ID của quân đội kết quả. Ví dụ: nâng cấp (quân đội, nông dân, người canh gác) sẽ cho phép "nông dân" nâng cấp thành "người canh gác", khi nông dân có đủ kinh nghiệm. 

Có hai loại hoạt động nâng cấp. 

nâng cấp (quân đội, "source_troop" , "target_troop_1" ) chỉ cung cấp một lựa chọn nâng cấp; ""target_troop_1" . 

Nâng cấp2 (quân đội, "source_troop" , "target_troop_1" , "target_troop_2" ) , tuy nhiên, cung cấp cho người chơi một lựa chọn để nâng cấp "source_troop" thành "target_troop_1" hoặc "target_troop_2" . 2 hiện là số lượng tối đa các lựa chọn nâng cấp có thể. 

Hiện tại không có mục nhập cho "novice_fighter" trong khối này, vì vậy, hãy tạo một tài khoản. Sao chép nâng cấp (quân đội, nông dân, watchman)
và dán nó vào cuối khối. Sau đó thay đổi "nông dân" thành "novice_fighter" và "watchman" thành "regular_fighter". Bất kì "

Tiếp theo, chúng ta sẽ mất thêm một chút. Thực hiện một mục khác ở cuối danh sách, với nguồn quân "new_troop" và nhóm mục tiêu "regular_fighter". Sau đó cuộn đến cụm từ: # Thêm Quest NPCs dưới điểm này. Ở đây bạn sẽ thấy ] , khung đóng của danh sách Troops Python. Quân mới nên được thêm vào trước khung, đó là những gì chúng ta sẽ làm bây giờ. 


3.3 - Thêm quân mới

Di chuyển khung xuống hai dòng, sau đó sao chép / dán mã sau vào không gian trống: 

  ["new_troop", "new_troop", "new_troops", tf_guarantee_boots | tf_guarantee_armor, no_scene, reserved, fac_commoners, 
   [itm_sword , itm_hide_boots], 
   str_6 | agi_6 | cấp (5), wp (60), knows_common, swadian_face1,

Đây là mục nhập mà chúng tôi sẽ chơi cùng để làm cho đội quân mới của chúng tôi. 

Đầu tiên, hãy cho anh ấy một số áo giáp và một chiếc mũ bảo hiểm. 


  [new_troop "," new_troop "," new_troop ", tf_guarantee_boots | tf_guarantee_armor, no_scene, dành riêng, fac_commoners, 
   [itm_sword, itm_hide_boots, itm_leather_jerkin, itm_skullcap ], 
   str_6 | agi_6 | cấp (5), wp (60), knows_common, swadian_face1 , swadian_face2],


Từ bây giờ, mỗi quân của loại "new_troop" sẽ được mặc itm_leather_jerkin . Tuy nhiên, chỉ một số trong số họ sẽ có itm_skullcap , vì các mục trong trường Cờ; đội quân này chỉ có được đảm bảo áo giáp và giầy ủng. Để đảm bảo quân đội mới của chúng ta sẽ có mũ bảo hiểm, chúng ta phải thêm tf_guarantee_helmet vào trường Flags. 


  "new_troop", "new_troop", "new_troops", tf_guarantee_boots | tf_guarantee_armor | tf_guarantee_helmet , no_scene, reserved, fac_commoners, 
   [itm_sword, itm_hide_boots, itm_leather_jerkin, itm_skullcap], 
   str_6 | agi_6 | cấp (5), wp (60), know_common , swadian_face1, swadian_face2],


Để chỉnh sửa tiếp theo của chúng tôi, chúng tôi sẽ thực hiện một số thay đổi số liệu thống kê của quân đội. Đặt STR đến 9, và AGI đến 9. Sau khi đã xong, thay đổi Level thành 4 và mức độ thành thạo vũ khí lên 80.   "Đội

quân mới" của chúng ta bây giờ sẽ như thế này: 

["new_troop", "new_troop", "new_troops", "
   [itm_sword, itm_hide_boots, itm_leather_jerkin, itm_skullcap], 
   str_9 | agi_9 | cấp (4), wp (80), knows_common, swadian_face1, swadian_face2],

bây giờ đã sẵn sàng để được đặt vào trò chơi, như một thử nghiệm. 


3.4 - Người phục vụ

Lưu tiến trình của bạn, sau đó mở module_parties.py . Cuộn xuống cho đến khi bạn thấy bên "zendar_mercs". 

  ("zendar_mercs", "zendar_mercs", pf_disabled, no_menu, pt_none, fac_commoners, 0, ai_bhvr_hold, 0, (0,0), [(trp_farmer, 15,0)]),

Đây là một bên lính đánh thuê ; một bữa tiệc không được đặt trên bản đồ, nhưng có quân đội có thể được thuê làm lính đánh thuê từ người giữ cửa của thị trấn. Bên này đặc biệt được liên kết với người giữ cửa trong Zendar.

"zendar_mercs" hiện có 15 nông dân. Nếu bạn bắt đầu trò chơi ngay bây giờ, đó là những gì bạn sẽ có thể thuê. Tuy nhiên, nếu chúng ta thay đổi "trp_farmer" thành "trp_new_troop", chúng ta sẽ có thể thuê 15 "lính mới" thay thế. Thực hiện thay đổi này ngay bây giờ. 

Lưu tiến trình của bạn, đóng module_parties, và double-click vào build_module.bat . Nếu việc xây dựng hoàn thành mà không có vấn đề, bạn sẽ tìm thấy quân đội mới của bạn có sẵn để thuê với người phục vụ tiệc rượu Zendar. (Bạn sẽ cần phải bắt đầu một trò chơi mới để quân đội mới xuất hiện. Bạn cần phải bắt đầu một trò chơi mới để thay đổi các bên có hiệu lực.)

Bắt đầu trò chơi và thuê một số "quân đội mới". Sau đó đi ra khỏi thị trấn, chiến đấu với một số cuộc chiến, và chú ý làm thế nào bạn có thể nâng cấp quân đội mới để "


Xin chúc mừng! Bây giờ bạn đã biết làm thế nào để thực hiện và vận dụng quân đội thường xuyên. Chúng tôi sẽ giới thiệu Heroes, Merchants và NPCs khác trong phân khúc tiếp theo. 


3.5 - NPC

Các thương gia và NPC khác nhau mà bạn nhìn thấy trong trò chơi rất giống với quân đội thường xuyên. Yếu tố quan trọng nhất thiết lập chúng ra là lá cờ tf_hero ; lá cờ này là nguyên nhân gây ra Marnid và Borcha để đạt được vị thế đặc biệt của họ. Mỗi NPC duy nhất mà bạn gặp trong game đều là Hero, thậm chí cả các thương gia. Sự khác biệt chính giữa Anh hùng và quân đội thường xuyên là: 

1) Anh hùng là không thể huỷ được. Sức khoẻ của họ được thể hiện bằng một phần trăm giá trị, và bạn chỉ có thể có một trong mỗi Hero trừ khi chúng được nhân bản bởi lỗi hoặc theo thiết kế. Ngay cả khi thiết kế, nhân bản anh hùng là một ý tưởng tồi.
2) Anh hùng mỗi người nắm lấy một nhóm đầy đủ. 
3) Anh hùng xuất hiện đúng trong một cảnh khi họ được giao cho một trong bộ quân của họ. 
4) Anh hùng ở lại với người chơi khi anh ta bị đánh bại bởi một kẻ thù - Anh hùng không bị bắt bởi kẻ thù - nhưng người chơi có thể bắt Heroes của đối phương như bình thường. 

Bởi vì chỉ có một mẫu vật của mỗi anh hùng, họ không có tên quân đội số nhiều. Trường 3 của bộ đôi anh hùng giống như Trường 2. 

Ví dụ về một tập hợp Anh hùng: 

  ["Marnid", "Marnid", "Marnid", tf_hero, scn_the_happy_boar | entry (4), reserved, fac_commoners, [itm_linen_tunic, itm_hide_boots, itm_club], def_attrib | cấp (6), wp (60), knows_trade_3 | knows_inventory_management_2 | knows_riding_2,0x00000000000c600301c2510211a5b292],

Ở đây chúng tôi có bạn Marnid của chúng tôi, một người bạn đồng hành trung thành trong quá trình trò chơi. Ông được đánh dấu là một anh hùng bởi tf_hero trong lĩnh vực cờ của mình. Chúng ta có thể tìm thấy anh ta ở điểm nhập cảnh 4 trong quán trọ Happy Boar. Anh ta có một chút cảm hứng trong chiến đấu, nhưng kĩ năng Trade của anh ta khá có ích trong những cuộc phiêu lưu ban đầu của chúng ta, và như một anh hùng anh ta sẽ không bao giờ chết nếu không bị loại bỏ bởi một số sự kiện kịch bản. Bạn cũng sẽ lưu ý rằng Marnid có mã số mặt riêng của riêng mình. Có thể thiết kế khuôn mặt bằng cách sử dụng trình biên tập mặt trong trò chơi và lấy mã khuôn mặt của họ để sử dụng trong mô đun của bạn; điều này được đề cập đến trong Phần 10 của tài liệu, Sử dụng Chế độ Hiệu chỉnh trong Trò chơi . 

Một điều quan trọng cần lưu ý là ngay cả khi nhận dạng quân đội của Marnid trong tập tin này - "Marnid" - sử dụng một chữ hoachữ M, chúng ta phải luôn luôn tham chiếu định danh với chữ thường . Hệ thống mô-đun sẽ ném một lỗi nếu bạn cố gắng sử dụng một chữ cái hoa khi tham chiếu một số nhận diện từ một tệp khác. Vì vậy, để tham khảo "Marnid", chúng ta phải sử dụng định danh "trp_marnid". 

Điểm quan tâm cuối cùng của chúng tôi là mục mà bạn có thể nhận thấy trong trường Thuộc tính của Marnid; def_attrib . def_attrib là một hằng số giống như knows_common , nhưng được định nghĩa trong header_troops.py. Chức năng của nó cũng tương tự như know_common - nó đặt thuộc tính mặc định cho quân đội mà nó được sử dụng trên. Được trích từ header_troops: 

def_attrib = str_5 | agi_5 | int_4 | cha_4

Điều này cho chúng ta biết rằng bất cứ quândef_attrib sẽ có STR 5, AGI 5, INT 4 và CHA 4 để bắt đầu. Bất kỳ thuộc tính được thiết lập sau khi def_attrib sẽ ghi đè lên các thiết lập thuộc tính có liên quan từ def_attrib . 


Bây giờ chúng ta có thể bắt đầu biến anh hùng của chúng ta. Sao chép bản sao của Marnid và dán nó ngay bên dưới bộ "new_troop" mà chúng ta đã tạo ra trước đó. 

  [ "Geoffrey", "Geoffrey", "Geoffrey" , tf_hero, scn_the_happy_boar | mục nhập (4), dành riêng, fac_commoners, [itm_linen_tunic, itm_hide_boots, itm_club], def_attrib | cấp (6), wp (60), knows_trade_3 | know_inventory_management_2 | knows_riding_2,0x00000000000c600301c2510211a5b292],

Trong ví dụ này, chúng tôi đã thay đổi tên và tên của anh hùng mới thành "Geoffrey" .

Tại thời điểm này, nếu chúng ta click vào build_module.bat , hệ thống mô-đun sẽ biên dịch mà không có vấn đề. Bộ mới của chúng tôi không xung đột với bất cứ điều gì mà hệ thống mô-đun có thể nhìn thấy. Tuy nhiên, nếu có, chúng tôi sẽ có một vấn đề lớn - cả Geoffrey và Marnid hiện đang sử dụng cùng một điểm nhập cảnh trong cùng một cảnh. Marnid sẽ được đặt bởi vì tuple của ông là tiếp tục lên các tập tin, và Geoffrey sẽ không xuất hiện ở tất cả vì điểm nhập cảnh đã được thực hiện. 

Để giải quyết vấn đề này, chúng ta sẽ chỉ định Geoffrey tới điểm nhập cảnh 6. Đây là ngay phía sau của quán trọ, nơi anh ta sẽ không ở trong bất cứ ai. 

Bộ của bạn bây giờ sẽ như thế này: 

  ["Geoffrey", "Geoffrey", "Geoffrey", tf_hero, scn_the_happy_boar | mục nhập (6), được dành riêng, fac_commoners, [itm_linen_tunic, itm_hide_boots, itm_club], def_attrib | cấp (6), wp (60), know_trade_3 | know_review_management_2 | know_riding_2,0x00000000000c600301c2510211a5b292], Bạn có

thể chỉ định cho anh một số thiết bị mới hoặc số liệu thống kê, như chúng tôi đã làm với " new_troop ". Sau đó nhấp vào build_module.bat , mở trò chơi, và đi đến nhà trọ Zendar. Nếu tất cả đã tốt, bây giờ bạn sẽ thấy Geoffrey đang đứng chống lại bức tường xa của quán trọ. 

Cố gắng đối thoại với Geoffrey sẽ khiến anh ta trả lời cổ phiếu, vì anh ta hiện không có cuộc đối thoại nào với anh ta. Đây là một ví dụ khác về tương quan . 

Bây giờ chúng ta sẽ rời Geoffrey và quay trở lại với anh ta sau khi chúng ta khám phá module_quests và module_dialogs. 


3,6 - Thương gia

Thương gia là một loại Hero đặc biệt. Ngoài tf_hero , họ cũng có cờ tf_is_merchant . Cờ này khiến họ không trang bị cho bất kỳ mục nào trong kho của họ, ngoại trừ những gì họ được chỉ định ban đầu trong bộ quân của họ. Nói cách khác, các thương gia này có thể nhận được tất cả các loại vật phẩm trong suốt quá trình của trò chơi, nhưng họ sẽ không mặc hoặc sử dụng các mặt hàng, và các mặt hàng sẽ được hiển thị đúng để bán. 

Ví dụ về thương gia: 

  ["zendar_weaponsmith", "Dunga", "Dunga", tf_hero | tf_is_merchant, scn_zendar_center | entry (3), 0, fac_commoners, [itm_linen_tunic, itm_nomad_boots], def_attrib | cấp (2), wp (20) , knows_inventory_management_10, 0x00000000000021c401f545a49b6eb2bc],

Đây là thương gia buôn vũ khí ở Zendar, tên là Dunga. Anh ta gần giống với các thương gia khác trong M & B bản địa. Nếu bạn nhìn kỹ, sự khác biệt duy nhất là số nhận dạng, tên, vị trí và khuôn mặt của họ. 

Tuy nhiên, để thêm người bán, có thể hơi phức tạp. Họ được tập hợp thành các nhóm vì một lý do. Có nhiều kịch bản trong M & B để cập nhật hàng tồn kho của thương gia hàng ngày cho từng loại thương gia - để thực hiện việc này, các tập lệnh này sử dụng một dải , một số bộ tuples kế tiếp giữa điểm xuất phát của sự lựa chọn (giới hạn dưới) và điểm dừng dừng (giới hạn trên). Ví dụ, phạm vi của thương nhân áo giáp bao gồm mọi thứ từ "zendar_armorer" (giới hạn dưới) đến - nhưng không bao gồm- "zendar_weaponsmith" (giới hạn trên). Giới hạn trên của một dải không nằm trong phạm vi, do đó giới hạn trên cần được đặt một mục tiếp theo xuống (để "zendar_weaponsmith") nếu chúng ta muốn "town_14_armorer" được bao gồm trong phạm vi thương mại giáp. 

Vì lý do này, người bán áo giáp mới phải được thêm trước "zendar_weaponsmith". Người bán vũ khí mới phải được thêm trước "zendar_tavernkeeper". Các thương gia hàng hoá mới phải được thêm trước khi "người bán". 


3.7 -

Ngực Phòng ngực là những đội quân đặc biệt phục vụ cho việc kiểm kê những ngực trong trò chơi mà người chơi có thể tương tác. Những lính ngực này khôngcác bộ ngực mình, chỉ có hàng tồn kho của họ. Ngực khi bạn nhìn thấy chúng trong trò chơi là một phần cảnh chống đỡ, thông tin cảnh một phần, một phần quân và một phần hardcoded. Ngực mới là hơi phức tạp để tạo ra và vượt qua các tập tin mô-đun khác nhau; ở đây chúng tôi sẽ chỉ bao gồm các thông tin liên quan đến module_troops. 

Ví dụ về ngực: 

  ["zendar_chest", "zendar_chest", "zendar_chest", tf_hero | tf_inactive, 0, dành riêng, fac_vaegirs, [], def_attrib | cấp (18), wp (60), knows_common, 0],

Tất cả các bộ ngực phải tuân theo ví dụ này. Những điều duy nhất mà bạn nên xem xét thay đổi một lính ngực mới là tên của quân đội và số nhận dạng, (có thể) mức quân đội và kỹ năng quân đội, và kiểm kê. Như đã đề cập, lính ngực phục vụ như là hàng tồn kho cho các ngực trong trò chơi; do đó, bất kỳ vật dụng nào bạn thêm vào hàng tồn kho của lồng ngực sẽ được bên trong ngực vào đầu trò chơi. 

Ngực đòi hỏi một lính ngực phải hoạt động. Tuy nhiên, chúng cũng yêu cầu một số sửa đổi khác cho các tệp tin mô đun khác nhau mà chúng tôi sẽ đề cập trong tài liệu tương ứng của tệp.


Đã học được điều này, bây giờ bạn đã biết tất cả những điều cần biết về module_troops. Có một danh sách các cờ có sẵn trong header_troops.py mà bạn có thể sử dụng để tạo thêm quân. Hãy thử nghiệm, và khi bạn đã sẵn sàng, hãy chuyển sang phần tiếp theo của tài liệu này. 

Admin
Admin

Tổng số bài gửi : 1214
Join date : 19/04/2012
Age : 31

https://mrtuan.forumvi.com

Về Đầu Trang Go down

Hệ thống Module Empty Re: Hệ thống Module

Bài gửi by Admin Wed 01 Nov 2017, 15:11

Phần 4: Module_Party_Templates
« Vào lúc: Tháng Năm 21, 2006, 06:30:52 AM»

Trong Phần 2 của tài liệu này, chúng tôi đã học cách làm cho các bên mới ; vị trí độc đáo trên bản đồ. Họ không phải là nhầm lẫn với các mẫu của bên , mà chúng tôi sẽ được giải quyết ở đây. 

Trong các thuật ngữ đơn giản, các mẫu của bên là một tập hợp các nguyên tắc từ đó các bên trên bản đồ được sinh ra. Điều này đánh dấu sự khác biệt đáng chú ý nhất giữa các bên và các mẫu của bên - các bên là những thực thể duy nhất trên bản đồ, trong khi các mẫu không tồn tại trong thế giới trò chơi. Chúng chỉ phục vụ như một danh sách các nguyên tắc để từ đó sinh ra các bên. Do đó, các hoạt động nhất định sử dụng một party_id cho đầu vào sẽ không hoạt động khi chúng được cho ăn một party_template_id.

Các bên được sinh ra từ một mẫu không phải là duy nhất. Có thể có nhiều bên có cùng mẫu; mỗi người sẽ có một số ngẫu nhiên của quân đội tùy thuộc vào cấp độ của người chơi và giới hạn quân đội tối thiểu / tối đa được xác định trong mẫu. 


4.1 - Phân tích Module_Party_Templates

Tập tin bắt đầu với danh sách Python thông thường: party_templates = [ theo sau bởi một số mẫu được đưa vào trong trò chơi và không nên được chỉnh sửa. 

Bạn sẽ nhận thấy rằng các bộ trong module_party_templates rất giống với các module_parties, nhưng cả hai không thể hoán đổi cho nhau. 

Ví dụ mẫu bên: 

  ("nông dân", "nông dân", icon_peasant | pf_auto_start_dialog, 0, fac_innocents, merchant_personality, [(trp_farmer, 11,22), (trp_peasant_woman, 16,

Đây là mẫu mà chúng tôi đã gặp phải trong trò chơi. Các bên của mẫu này sẽ được gọi là "nông dân", họ sẽ tự động bắt đầu đối thoại khi bạn gặp một người, họ sẽ cư xử hèn nhát trong trò chơi và họ có hai ngăn xếp gồm nông dân và phụ nữ nông dân. 


Phân tích các lĩnh vực tuple: 

1) id mẫu bên. Được sử dụng để tham khảo các mẫu bên trong các tệp khác. 
2) Tên mẫu bên thứ ba. Tên mà các bên của mẫu này sẽ sử dụng. 
3) Đảng cờ. Bạn sẽ nhận thấy rằng tất cả các mẫu trong module_party_templates đều có bộ pf_auto_start_dialogue . Cờ này sẽ tự động bắt đầu một cuộc đối thoại trên bản đồ khi người chơi chạm trán một bên của mẫu này. 
4) Menu. Không được chấp nhận như trong module_parties. Sử dụng giá trị 0 tại đây. 
5) Phe phái.
6) Tính cách. Trường này chứa các cờ xác định hành vi của bên trên bản đồ. 
7) Danh sách các ngăn xếp. Mỗi bản ghi ngăn xếp là một bộ gồm có các trường sau: 
    7.1) Troop-id. 
    7.2) Số quân tối thiểu trong stack. 
    7.3) Số quân tối đa trong stack. 
    7.4) Thành viên lá cờ (tùy chọn). Bạn sẽ phải thêm một trường bổ sung để thiết lập cờ thành viên. Ví dụ: (trp_swadian_crossbowman, 5,14, pmf_is_prisoner)

Có thể có nhiều nhất là 6 ngăn xếp trong mẫu bên. 


Nông dân tuple kiểm tra: 

1) Đảng mẫu id = "nông dân" 
2) tên Đảng-template = "nông dân" 
3) cờ Đảng = icon_peasant | pf_auto_start_dialog 
4) Menu = 0 
5) Faction = fac_innocents
6) Personality = merchant_personality 
7) Danh sách các stacks: 
    7.1) Troop-id = trp_farmer, trp_peasant_woman 
    7.2) Số quân tối thiểu trong stack = 11, 16 
    7.3) Số quân tối đa trong stack = 22, 44 
    7.4) (tùy chọn) = Không có thiết lập. 


Nếu bạn đã theo dõi tài liệu kể từ Phần 1, bạn sẽ khá giỏi trong việc đọc các bộ điều khiển cho đến thời điểm này và bạn sẽ nhận thấy một trường trong bộ này không giống với bất kỳ trường nào khác mà chúng ta gặp phải trước đó: Trường số 6, Trường cờ cá nhân. Chúng tôi sẽ bao gồm lĩnh vực này và các chức năng của nó trong phân khúc tiếp theo. 


4.2 - Tính cách

Như đã đề cập trong sự cố tuple, trường Personality xác định hành vi của bên trên bản đồ. Ở đây bạn có thể gán các điểm tùy chỉnh cho lòng dũng cảm và hung hăng, hoặc sử dụng một trong những tính cách đã được đặt trước như thương gia_tật . Các giá trị đặt trước này là các hằng số, mỗi điểm có một Điểm Courage và Aggressiveness. Các giá trị đặt trước đều được định nghĩa trong header_parties.py , do đó mở tệp đó ngay bây giờ và cuộn xuống cuối để xem các định nghĩa liên tục cho chính bạn. Ở đó bạn cũng sẽ thấy danh sách các cài đặt Courage and Aggressiveness. 

Tính năng merchant_personality liên tục được sử dụng trong nhiều mẫu trong tệp. Các bên có tính cách này sẽ thân thiện, họ sẽ không ra ngoài để tấn công kẻ thù hoặc tấn công các nhóm yếu hơn. Đó là vìmerchant_personality đặt tính hung hăng của đảng lên aggresiveness_0 . Một đảng với aggresiveness_0 sẽ không bao giờ tấn công một bên khác, trong khi các bên bình thường chiến đấu với các soldier_personality mặcđịnh sẽ có aggresiveness_8 . Điều này sẽ cho phép họ tấn công các bên khác nếu phe của kẻ tấn công là xấu với các phe phái của phe bảo vệ, và nếu những kẻ tấn công sẽ là không quá nặng. 

Sự dũng cảm là số điểm quyết định khi nào đảng sẽ chạy trốn khỏi một đảng lớn hơn. Sự can đảm cao hơn có nghĩa là họ sẽ nhanh chóng quay lưng lại khi những con số không hoàn toàn thuận lợi. các bên thương gia cá nhâncó một Courage of 8, nơi mà binh lính_tính năngcó Courage of 11. 

Các thiết lập này có thang từ 0 đến 15, cho phép bạn thiết lập chính xác hành vi mong muốn cho các mẫu của bên. Tuy nhiên, các modter mới được khuyến cáo nên sử dụng các cài đặt trước. Họ bao gồm đầy đủ các nhân vật bạn cần cho mod đầu tiên của bạn. 

Cuối cùng, đối với các mẫu cướp biển, có banditness band . Điều này khiến bên cướp liên tục xem xét các bên gần đó khác như con mồi, và nếu con mồi mang theo một lượng lớn vàng và / hoặc hàng hóa thương mại, bên cướp sẽ tấn công. Tốt nhất, một nhóm cướp có độ tấn công thấp hoặc số quân thấp để không tấn công các bên lính. 


4.3 - Tạo các mẫu mới

Sao chép bộ "nông dân" và dán nó vào cuối tệp, trước khung đóng. 


  ( trp_farmer, 11,22), (trp_peasant_woman, 16,44)]),

Trong ví dụ này chúng ta đã thay đổi từ "nông dân " thành "new_template" , "new_template" , icon_peasant | pf_auto_start_dialog, 0, fac_innocents, merchant_personality, [ "vào " new_template " , và chúng tôi đã làm tương tự cho tên. Sau khi chúng tôi đã thực hiện việc này, chúng tôi có thể bắt đầu chỉnh sửa các chi tiết cụ thể của mẫu này. 

Đối với tinh chỉnh đầu tiên của chúng tôi, chúng ta hãy thay đổi phe của mẫu để fac_neutral , và merchant_personality để soldier_personality . 


  ("new_template", "fac_neutral , soldier_personality , [(trp_farmer, 11,22), (trp_peasant_woman, 16,44)]),

Từ giờ trở đi, các bên của mẫu này sẽ là của phe trung lập, và họ sẽ tấn công một bên kẻ thù nếu họ thấy một. 

Tiếp theo, chúng ta hãy chơi với các thành phần quân đội. 


  ( trp_geoffrey, 1,1 ), ( trp_new_troop , 16,44)]),

Ví dụ này có một số thay đổi đáng chú ý - quan trọng nhất, bạn có thể sử dụng một trong hai cách sau: nó hiện đang được dẫn dắt bởi trp_geoffrey , quân đội Anh hùng chúng tôi đã tạo ra trong Phần 3 của tài liệu này. Vì không thể có nhiều hơn một trong Geoffrey, chúng tôi '

Là những người theo ông, chúng tôi đã chỉ định một đội ngũ trp_new_troop , các đội chính thức của chúng tôi cũng được tạo ra trong Phần 3. Sẽ không bao giờ có ít hơn 16 "quân đội mới" trong bữa tiệc này, nhưng khi người chơi đạt được cấp độ, kích thước sẽ là từng bước điều chỉnh. Cuối cùng, "new_template" này có thể sinh ra với 44 quân mới - nhưng không bao giờ quá 44. 


Lưu tệp và nhấp vào build_module.bat . Nếu mọi việc diễn ra tốt đẹp, bây giờ bạn sẽ có thể sử dụng mẫu mới trong mã module của bạn, nhưng các bên trong mẫu của bên phải được sinh ra - chúng không chỉ hiển thị theo ý thích của riêng họ. Nếu chúng tôi đã chạy trò chơi vào thời điểm này, chúng tôi sẽ không thấy bất kỳ bên nào trong "mẫu mới" của chúng tôi đang chạy.

Chúng ta sẽ học cách tạo ra các phần của một mẫu trong một phần sắp tới của tài liệu này. Trong thời điểm này, chúng ta hãy rời khỏi Geoffrey và ban nhạc nhỏ của mình trong khi chúng tôi tìm ra cách tạo các mục mới trong phần tiếp theo của tài liệu này. Hãy chuyển sang Phần 5 bây giờ.

Admin
Admin

Tổng số bài gửi : 1214
Join date : 19/04/2012
Age : 31

https://mrtuan.forumvi.com

Về Đầu Trang Go down

Hệ thống Module Empty Re: Hệ thống Module

Bài gửi by Admin Wed 01 Nov 2017, 15:12

Phần 5: Module_Items
« Vào lúc: Tháng Năm 24, 2006, 10:14:09 AM»

Trong Phần 3 và 4, chúng ta đã học cách tạo ra và trang bị cho quân đội và các mẫu của đảng. Với bối cảnh này, chúng ta có thể nghiên cứu làm thế nào để tạo ra những món đồ mới cho quân đội của chúng tôi để sử dụng. 


5.1 - Chi tiết các Module_Items 

module_items.py bắt đầu với một số các hằng số được sử dụng để chi phối bổ mục , trong đó điều chỉnh các mục chúng ta thấy trong trò chơi. Các thanh gươm cong, thanh nẹp, trục nặng, tất cả đều được tạo ra từ một bộ trong module_items và sau đó đưa ra một công cụ sửa đổi mục thích hợp để điều chỉnh thống kê của họ lên hoặc xuống.

Các hằng số được định nghĩa ở đây bao gồm các bổ tố mục tiêu chuẩn. Các đồ vật bạn tìm thấy trong các thương gia và trong cướp bóc sẽ rút ra những sửa đổi ngẫu nhiên từ các hằng số này. Các điều chỉnh không được liệt kê trong một hằng số sửa đổi của mục sẽ không được xem xét cho hàng tồn kho hoặc chiến lợi phẩm. 

Đối với nhiều người có kinh nghiệm hơn, điều thú vị là lưu ý rằng các sửa đổi không được liệt kê trong hằng thích hợp vẫn có thể được sử dụng với hoạt động "troop_add_item". Ví dụ, các longbows thường chỉ có ở dạng "đồng bằng", "bẻ cong" và "nứt"; nhưng nếu chúng ta thêm một longbow vào hàng tồn kho của người chơi với sửa đổi "cân bằng" trên nó, người chơi sẽ nhận được một longbow cân bằng.


Sau các hằng số, danh sách bộ sẽ bắt đầu. Người đầu tiên quan tâm là vũ khí "pract_sword", sẽ hoạt động như một ví dụ điển hình. 


Ví dụ về một mục: 

["practice_sword", "practice_sword", [("practice_sword", 0)], itp_type_one_handed_wpn | itp_melee | itp_primary | itp_secondary, itc_longsword, 3, trọng lượng (1.5) | spd_rtng (103) | weapon_length (90) | swing_damage (16, blunt) | thrust_damage (10, blunt), imodbits_none],

Đây là vũ khí thực hành cơ bản, được sử dụng trong Zendar trong suốt quá trình tập luyện và đấu trường. 


Phân tích các lĩnh vực tuple: 

1) Id mục. Được sử dụng để tham khảo các mục trong các tệp khác. 
2) Tên sản phẩm. Tên của mặt hàng như nó sẽ xuất hiện trong cửa sổ kiểm kê 
3) Danh sách các mắt lưới. Mỗi bản ghi lưới là một bộ gồm có các trường sau:
    3.1) Tên lưới. Tên của một mô hình 3d trong trò chơi hoặc các tệp nguồn của mô-đun. 
    3.2) Các bit điều chỉnh mà lưới này phù hợp. Một danh sách các sửa đổi mục sẽ sử dụng lưới này thay vì mặc định. Lưới đầu tiên trong danh sách là mặc định. 
4) cờ mặt hàng. 
5) Khả năng của Item. Trường này chứa một danh sách các hình động mà mục này có thể sử dụng. 
6) Giá trị khoản. Giá trị cơ sở trong denars. Lưu ý, giá trị thực của item sẽ cao hơn nhiều trong game trừ khi người chơi có kỹ năng thương mại là 10. 
7) Thống kê item. Đây là nơi các thống kê của mục được xác định; trọng lượng, sự phong phú, độ khó, xếp hạng áo giáp, vv 
Cool Các bit điều chỉnh. Các điều chỉnh có thể được áp dụng cho mục này.
9) [Tùy chọn] Kích hoạt. Một danh sách các trình kích hoạt đơn giản để được kết hợp với mục này. 


Thực hành_sword tuple kiểm tra: 

1) Item id = "practice_sword" 
2) Item name = "practice_sword" 
3) Danh sách các mắt lưới: 
    3.1) Mesh name = "practice_sword" 
    3.2) Modifier bits = 0 
4) Item flags = itp_type_one_handed_wpn | itp_melee | itp_primary | itp_secondary 
5) khả năng mục = itc_longsword 
6) mục value = 3 
7) mục số liệu thống kê = trọng lượng (1.5) | spd_rtng (103) | weapon_length (90) | swing_damage (16, cùn) | thrust_damage (10, cùn) 
Cool Modifier bits = imodbits_none 
9) Triggers = Không có. 

Bây giờ chúng ta có thể kể tất cả các chi tiết của "practic_sword" từ bộ của nó.

- Nó sử dụng mesh "pract_sword" làm mesh mặc định của nó. 
- Nó sử dụng cờ item đánh dấu nó như là một vũ khí cận chiến một tay. Quân đội được trang bị "practice_sword" sẽ xem xét "practice_sword" khi chọn vũ khí cận chiến chính từ danh sách kiểm kê của họ. Họ cũng sẽ xem xét "pract_sword" khi chọn một vũ khí dự phòng (thứ cấp). 
Tuy nhiên, quân cận chiến chắc chắn sẽ không chuyển sang các loại vũ khí cận chiến khác nhau trong thời gian chiến đấu) 
- Nó có tất cả các hình động được định nghĩa trong hằng số itc_longsword , vì vậy "practice_sword" có thể được sử dụng như là một longsword sẽ được.
- Trọng lượng 1,5kg. Đánh giá tốc độ của nó là 103, độ dài của khẩu hổ là 90. Nó gây ra sát thương cơ sở 16 trong khi đánh đu, và một đòn tấn công cơ sở 10 trong khi đẩy. 
- Nó sử dụng không có sửa đổi mục. 


5.2 - Các loại thiệt hại

Như chúng ta đã quan sát thấy trong bài kiểm tra tuple, "practice_sword" làm hư hỏng. Rõ ràng điều này là bởi vì đó là một vũ khí thực hành, nhưng nó cung cấp một động lực tốt để xem xét các loại thiệt hại khác nhau có sẵn trong M & B. 

Thứ nhất, có cắt giảm thiệt hại . Giảm sát thương là hành động cắt lát của một lưỡi dao sắc như thanh kiếm hoặc rìu. Cắt giảm được một tiền thưởng đối với kẻ thù không vũ trang hoặc nhẹ, nhưng ngược lại nó có một hình phạt lớn chống lại áo giáp nặng. Giảm sát thương sẽ giết chết một kẻ thù nếu nó mang kẻ thù đến 0 điểm.

Tiếp theo chúng ta sẽ bị làm hư . Đòn tấn công Blunt thể hiện hiệu quả của vũ khí không có cạnh, chẳng hạn như cây búa hoặc cây búa. Blunt thiệt hại được hưởng 50% tiền thưởng chống lại giáp nặng, nhưng vũ khí cùn thường ngắn hơn vũ khí cắt và họ làm ít thiệt hại tổng thể. Lợi thế lớn nhất của đòn tấn công thẳng thừng là nó đánh một kẻ thù bất tỉnh khi kẻ thù được đưa đến 0 điểm nhấn, thay vì giết chết anh ta. Những kẻ thù vô thức có thể bị bắt và bán làm nô lệ. Sạc ngựa cũng gây tổn thương cùn. 

Cuối cùng, đục lỗđại diện cho các mũi tên mũi khoan, mũi tên và các loại vũ khí tương tự. Pierce thiệt hại được hưởng 50% tiền thưởng cho giáp nặng, nhưng vũ khí xỏ lỗ thường làm ít thiệt hại tổng thể để cân bằng nó với các loại thiệt hại khác. Pierce thiệt hại sẽ giết chết một kẻ thù nếu nó mang lại cho kẻ thù đến 0 điểm nhấn. 


5.3 - Tạo một mục

Sao chép bộ "pract_sword" và dán nó vào cuối tập tin, trước khung đóng. Sau khi thực hiện, thay đổi tên và định danh của bộ mới này thành "new_mace". 

[ "new_mace", "new_mt" , [( "pract_sword" , 0)], itp_type_one_handed_wpn | itp_melee | itp_primary | itp_secondary, itc_longsword, 3, trọng lượng (1.5) | spd_rtng (103) | weapon_length (90) | swing_damage (16, blunt) | thrust_damage (10, cùn), imodbits_none],

Hệ thống M & B rất linh hoạt; chỉ cần một vài điều chỉnh nhỏ để biến thanh kiếm thành một cái chùy. Trong trường hợp của "practition_sword", nó đã được thiết lập để làm thẳng thối. Điều đó làm cho công việc của chúng tôi dễ dàng hơn. 

Đầu tiên, chúng ta thay đổi các tính năng item của mace mới từ itc_longsword sang itc_scimitar . Điều này sẽ khiến cái mũ của chúng tôi mất khả năng đẩy, bởi vì hoạt hình đẩy của M & B không được bao gồm trong hằng số itc_scimitar . 


It ' s_Metal , 3, Trọng lượng (1.5) | spd_rtng (103) | weapon_length (90) | swing_damage (16, blunt) | thrust_damage (10, cùn), imodbits_none],

Tiếp theo, chúng ta sẽ thay đổi lưới của mặt hàng từ "pract_sword" sang "mace_pear" . Đây là một lưới mà không được sử dụng trong các trò chơi bản địa, do đó, bằng cách làm này chúng tôi sẽ được cung cấp cho mace mới của chúng tôi một cái nhìn tươi mới. 


[ "new_mace", "new_mace", [( "mace_pear" , 0)], itp_type_one_handed_wpn | itp_melee | itp_primary | itp_secondary, itc_scimitar, 3, trọng lượng (1.5) | spd_rtng (103) | weapon_length (90) | swing_damage (16, blunt) | thrust_damage (10, blunt), imodbits_mace ],

Trong ví dụ này, chúng ta đã thay đổi lưới như đã lên kế hoạch, và cũng chuyển đổi các bit sửa đổi từ imodbits_none thành imodbits_mace . Điều này sẽ cho phép mace mới của chúng tôi sử dụng tất cả các sửa đổi được chỉ định trong imodbits_mace không đổiở đầu tập tin. 

Chỉ có hai thay đổi nữa chúng ta cần thực hiện để hoàn thành mục này. Đáng chú ý, chúng tôi sẽ tăng thiệt hại swing của nó, và chúng tôi sẽ cung cấp cho nó một lá cờ mục bổ sung. 

Quan sát: 


["new_mace", "new_mace", [("mace_pear", 0)], vv_type_one_handed_wpn | itp_melee | itp_primary | itp_secondary | itp_unique , itc_scimitar, 3, trọng lượng (1.5) | spd_rtng (103) | weapon_length (90) | swing_damage ( 26 , cùn) | thrust_damage (10, cùn), imodbits_mace],

Như bạn thấy, chúng tôi đã tăng mức thiệt hại swing từ 16 đến 26 , mà sẽ làm cho mace mới của chúng tôi một hợp đồng tốt hơn nguy hiểm trong một cuộc chiến. Và đáng chú ý hơn là chúng tôi đã thêm flag itp_uniquevào trường Flags. Một mặt hàng với itp_unique không thể bị cướp phá qua màn hình cướp tài sản bình thường. Điều này sẽ làm cho người chơi không nhận được bàn tay của mình trên nó quá sớm, bởi vì chúng tôi có kế hoạch cho mace này. 

Để điều chỉnh lần cuối, thay đổi tên mặt hàng từ "new_mace" thành "Geoffrey's_mace" . Sau đó, mở module_trooops.py và thay thế itm_club trong khoảng không quảng cáo của Geoffrey với itm_new_mace . 

Lưu tiến trình của bạn trong cả hai tệp, sau đó nhấp vào build_module.bat .

Xin chúc mừng! Bạn đã tạo ra một mặt hàng mới và thêm nó vào hàng tồn kho của một quân đội. Quân đội được hỏi là Hero, vì vậy anh ta sẽ luôn có cây bút mới trong kho của mình, và anh ta sẽ luôn luôn sử dụng vũ khí tốt nhất trong hàng tồn kho của mình mà anh ta có thể sử dụng. 

Mặt khác, các nhà quản lý sẽ chọn thiết bị của họ một cách ngẫu nhiên từ danh sách hàng tồn kho của họ. Đây là lý do tại sao hầu hết những người thường xuyên có một lựa chọn rất khác nhau - nếu không họ sẽ tất cả trông giống nhau. 


Bây giờ chúng ta biết làm thế nào để tạo ra các mục mới, chúng ta có thể xem các số liệu thống kê khác nhau và kiểm tra tất cả những gì họ có ý nghĩa. 


5.4 - Item Stats

Trong phân khúc này, bạn sẽ tìm thấy một danh sách các thống kê toàn diện và phân tích chức năng của chúng. Vì một số số liệu thống kê có ý nghĩa khác nhau cho các loại mặt hàng khác nhau, chúng tôi đã tổ chức danh sách theo loại mặt hàng.



Sự phong phú chung - Giá trị phần trăm. 
Điều này thống kê quy định bao lâu các mặt hàng sẽ xuất hiện trong hàng tồn kho buôn bán và chiến lợi phẩm. 100 là tiêu chuẩn; có thể nhiều hơn hoặc ít hơn 100 (xuống đến 0). 

trọng lượng - Kilogram giá trị. 
Xác định trọng lượng của mặt hàng bằng kg. 


itp_type_horse 

body_armor - Giá trị. 
Xác định xếp hạng giáp ngựa và số điểm nhấn. Giá trị cao hơn có nghĩa là giáp và nhiều điểm nhấn hơn. 

khó khăn - Giá trị. 
Xác định độ cao của Tay đua của người chơi cần để có thể gắn ngựa này. 

horse_speed - Giá trị. 
Tốc độ của ngựa trên bản đồ chiến đấu. Giá trị cao hơn làm cho ngựa nhanh hơn. 

horse_maneuver - Giá trị. 
Khả năng cơ động của con ngựa trên bản đồ trận đánh.

horse_charge - Giá trị. 
Xác định mức độ thiệt hại của con ngựa khi nạp bộ binh, và tốc độ của ngựa sẽ mất trong mỗi lần va chạm với một người lính bộ binh. Giá trị cao hơn sẽ cho phép ngựa làm thêm thiệt hại và lội qua bộ binh nhiều hơn. 


itp_type_one_handed_wpn 

khó khăn - Giá trị. 
Điểm STR tối thiểu cần để có thể sử dụng vũ khí này. Nếu một nhóm không có STR lớn hơn hoặc bằng, anh ta sẽ không thể nắm được nó. 

spd_rtng - Giá trị. 
Tốc độ tấn công của vũ khí, cả hai swing và đẩy. 

weapon_length - Giá trị centimeter. 
Chiều dài của vũ khí bằng cm. Chỉ số này xác định vũ khí sẽ có thể tiếp cận trong game như thế nào, bất kể kích thước mắt lưới. 

swing_damage - Giá trị, loại thiệt hại.
Các thiệt hại cơ bản và loại thiệt hại của vũ khí khi thực hiện một cuộc tấn công swing. 

thrust_damage - Giá trị, loại thiệt hại. 
Các thiệt hại cơ bản và loại thiệt hại của vũ khí khi thực hiện một cuộc tấn công lực đẩy. 


itp_type_two_handed_wpn

Tương tự như vv_type_one_handed_wpn . 


itp_type_polearm

Tương tự như itp_type_one_handed_wpn . 


itp_type_arrows 

weapon_length - Giá trị Centimeter. 
Chiều dài mũi tên theo cm. 

thrust_damage - Giá trị, loại thiệt hại. 
Số lượng thiệt hại của loại mũi tên này cộng thêm vào thiệt hại cơ bản của cung, và loại thiệt hại. 

max_ammo - Giá trị. 
Số mũi tên trong một ngăn xếp. 


itp_type_bolts

Tương tựitp_type_arrows . 


itp_type_shield 

hit_points - Giá trị. 
Số cơ sở của điểm nhấn cho lá chắn này. 

body_armor - Giá trị. 
Số lượng thiệt hại được trừ từ mỗi lần tấn công vào khiên. 

spd_rtng - Giá trị. 
Tốc độ mà lá chắn có thể được đưa vào chế độ phòng thủ. 

weapon_length - Giá trị. 
Che chắn bảo vệ. Giá trị cao hơn cho phép lá chắn che phủ nhiều vùng cơ thể, cung cấp bảo vệ lá chắn từ các mũi tên tới các phần lớn hơn của cơ thể. gặp khó khăn 


khác_type_bow 

- Giá trị. 
Điểm lực Power Draw tối thiểu cần để có thể sử dụng cung này. Nếu quân đội không có Power Draw lớn hơn hoặc bằng, anh ta sẽ không thể nắm giữ nó. 

spd_rtng - Giá trị.
Tốc độ nạp lại của cung. IE, tốc độ quân đội sẽ có thể lấy một mũi tên từ run, notch, và rút lại cung một lần nữa. Giá trị cao hơn sẽ có nghĩa là thời gian tải lại nhanh hơn. 

shoot_speed - Giá trị. 
Tốc độ mà đạn dược từ cây cung này bay qua không khí. Giá trị cao hơn sẽ có nghĩa là mũi tên nhanh hơn; lưu ý, tuy nhiên, rằng rất nhanh đạn dược có thể cắt qua các kẻ thù gần đó mà không cần đánh chúng. 

thrust_damage - Giá trị, loại thiệt hại. 
Các thiệt hại cơ bản và loại thiệt hại gây ra bởi số truy cập từ cung này. 

chính xác - Giá trị phần trăm. 
Cơ hội bắn một cách chính xác ở điểm mục tiêu của quân đội. 100 đại diện cho một cơ hội 100%, giá trị thấp hơn sẽ làm giảm cơ hội của một hit. Điều này không được sử dụng trên các bows và Native bản địa, nhưng có thể được thêm vào. 


vv_type_crossbow

khó khăn - Giá trị. 
Điểm số STR tối thiểu cần thiết để có thể sử dụng nỏ này. Nếu một nhóm không có STR lớn hơn hoặc bằng, anh ta sẽ không thể sử dụng nó. 

spd_rtng - Giá trị. 
Tốc độ tải lại của nỏ. IE, làm thế nào nhanh chóng một quân đội sẽ có thể có một bolt từ run, notch, và kéo trở lại chuỗi để bắn. Giá trị cao hơn sẽ có nghĩa là thời gian tải lại nhanh hơn. 

shoot_speed - Giá trị. 
Tốc độ mà đạn dược từ nỏ này bay qua không khí. Giá trị cao hơn sẽ có nghĩa là các bu lông nhanh hơn; lưu ý, tuy nhiên, rằng rất nhanh đạn dược có thể cắt qua các kẻ thù gần đó mà không cần đánh chúng. 

thrust_damage - Giá trị, loại thiệt hại. 
Các thiệt hại cơ bản và loại thiệt hại gây ra bởi số truy cập từ nỏ này. 

max_ammo - Giá trị.
Số lượng bu lông có thể được bắn ra từ nỏm này trước khi nó phải được nạp lại. 

chính xác - Giá trị phần trăm. 
Cơ hội bắn một cách chính xác ở điểm mục tiêu của quân đội. 100 đại diện cho một cơ hội 100%, giá trị thấp hơn sẽ làm giảm đáng kể cơ hội của một hit. Điều này không được sử dụng trên các bows và Native bản địa, nhưng có thể được thêm vào. 


itp_type_thrown 

khó khăn - Giá trị. 
Điểm lực Power Throw tối thiểu cần để có thể sử dụng vũ khí này. Nếu một nhóm không có Power Throw lớn hơn hoặc bằng, anh ta sẽ không thể sử dụng nó. 

spd_rtng - Giá trị. 
Tỷ lệ tải lại cho vũ khí này. IE, làm thế nào nhanh các mảnh tiếp theo của đạn dược có thể được sẵn sàng để ném. 

shoot_speed - Giá trị.
Tốc độ vũ khí của loại vũ khí này bay qua không khí. 

thrust_damage - Giá trị, loại thiệt hại. 
Các thiệt hại cơ bản và loại thiệt hại gây ra bởi số truy cập từ vũ khí này. 

max_ammo - Giá trị. 
Số lượng vũ khí (IE, đạn dược) chứa trong một ngăn xếp. 

weapon_length - Giá trị centimeter. 
Chiều dài của vũ khí bằng cm. 


itp_type_goods 

food_quality
Tác động của một món ăn sẽ có trên tinh thần của đảng. Giá trị trên 50 sẽ cải thiện tinh thần trong khi mục đang được tiêu thụ, thấp hơn các giá trị sẽ thấp hơn tinh thần. 

max_ammo
Số lượng bộ phận tiêu hao cho mặt hàng này. 


itp_type_head_armor 

head_armor - Giá trị.
Số lượng thiệt hại mà bộ giáp này sẽ cản trở người đứng đầu quân đội. 

body_armor - Giá trị. 
Số lượng thiệt hại mà bộ giáp này sẽ cản trở cơ thể của quân đội. 

leg_armor - Giá trị. 
Số lượng thiệt hại của bộ áo giáp này sẽ cản trở chân của quân đội. 

khó khăn - Giá trị. 
STR tối thiểu phải mặc áo giáp này. 


itp_type_body_armor

Tương tự như vv_type_head_armor . 


itp_type_foot_armor

Tương tự như itp_type_head_armor . 


itp_type_hand_armor

Tương tự như vv_type_head_armor . 


itp_type_pistol 

difficulty - Giá trị.
Điểm số STR tối thiểu cần để có thể sử dụng khẩu súng lục này. 

spd_rtng - Giá trị. 
Tốc độ tải lại của khẩu súng lục. IE, tốc độ một đội quân sẽ có thể tải lại khẩu súng lục và nhắm mục tiêu trở lại. 

shoot_speed - Giá trị. 
Tốc độ mà đạn dược từ khẩu súng lục này bay qua không khí. 

thrust_damage - Giá trị, loại thiệt hại. 
Các thiệt hại cơ bản và loại thiệt hại gây ra bởi số truy cập từ khẩu súng lục này. 

max_ammo - Giá trị. 
Số đạn có thể bắn ra từ khẩu súng lục này trước khi nó phải được nạp lại. 

chính xác - Giá trị phần trăm. 
Cơ hội bắn một cách chính xác ở điểm mục tiêu của quân đội. 100 đại diện cho một cơ hội 100%, giá trị thấp hơn sẽ làm giảm đáng kể cơ hội của một hit. 


itp_type_musket

Tương tựitp_type_pistol . 


itp_type_bullets

Tương tự như vv_type_arrows . 

Admin
Admin

Tổng số bài gửi : 1214
Join date : 19/04/2012
Age : 31

https://mrtuan.forumvi.com

Về Đầu Trang Go down

Hệ thống Module Empty Re: Hệ thống Module

Bài gửi by Admin Wed 01 Nov 2017, 15:14

Phần 6: Mô-đun_Đấu thầu, Mô-đun_Vấn đề, Module_Strings & Module_Quests
« Vào lúc: Tháng Năm 30, 2006, 05:42:21 AM»

Trong phần này của tài liệu, chúng tôi kiểm tra các tệp tin mô-đun nhỏ nhất trong hệ thống, tệp có tác động ít nhất đến mô-đun của bạn. Tuy nhiên, các tệp này vẫn có thể rất hữu ích bằng nhiều cách. Vào cuối chương này, bạn sẽ biết làm thế nào để tận dụng tối đa sức mạnh của mỗi người. 


6.1 - Module_Constants 

module_constants.py là một tệp rất đơn giản. Nó được lấp đầy với hằng số - bạn nên biết cách các tác phẩm này đọc phần 3 của tài liệu này. Các hằng trong module_constants là chính xác giống như hằng số được định nghĩa ở bất cứ nơi nào khác, nhưng các hằng số được sử dụng trong nhiều tập tin mô đun nên được định nghĩa trong module_constants để hệ thống mô-đun luôn biết nơi tìm chúng.

Module_constants cũng phục vụ như là một danh sách có tổ chức, dễ truy cập, nơi bạn có thể thay đổi giá trị của một hằng số bất cứ khi nào bạn có thể cần. Bất kỳ thay đổi nào sẽ ảnh hưởng ngay lập tức đến tất cả các hoạt động sử dụng hằng số, do đó bạn không cần phải thực hiện tìm kiếm / thay thế bằng tay. 

Ví dụ, thay đổi marnid_inn_entry = 2 để marnid_inn_entry = 4 ngay lập tức sẽ thay đổi bất kỳ hoạt động sử dụng marnid_inn_entry , điều trị hằng số như giá trị 4 thay vì giá trị 2 . 


6.2 - Module_Factions 

module_factions.pychứa tất cả các phe phái sử dụng bởi hệ thống mô-đun và trí thông minh nhân tạo của M & B. Mặc dù một tệp nhỏ, nó điều chỉnh một số thiết lập quan trọng mà chúng ta sẽ đề cập ở đây. 

Các tập tin ngay lập tức bắt đầu với một danh sách Python: phe phái = [ . Như trong hầu hết các tệp mô-đun, vài bộ đầu tiên được nối tiếp vào trò chơi và không được chỉnh sửa. 


Ví dụ về một phe: 

  ("vô tội", "vô tội", 0, 0.5, [("outlaws", - 0.05)]),

Đây là một tuple ngắn, đơn giản. Nó điều khiển phe "Innocents", mà chỉ có kẻ thù chính là phe "outlaws". Nếu mối quan hệ của phe với "người vô tội" không được định nghĩa ở bất cứ đâu trong module_constants, nó sẽ tự động được đặt thành 0, do đó hai phe phái sẽ hoàn toàn trung tính với nhau. 


Phân tích các lĩnh vực tuple:

1) Faction id. Được sử dụng để tham khảo các phe phái trong các tệp khác. 
2) Faction name. 
3) Faction flags. 
4) Liên kết chặt chẽ. Mối quan hệ giữa các thành viên khác nhau của phe này. 
5) Mối quan hệ giữa các phe phái. Mỗi hồ sơ liên quan là một bộ gồm các lĩnh vực sau: 
    5.1) Faction. Phe nào khác mà mối quan hệ này đang đề cập đến. 
    5.2) Quan hệ. Tình trạng quan hệ giữa hai phe phái. Giá trị dao động từ -1 và 1. 


kiểm tra tuple Innocents: 

1) Faction id = "vô tội" 
2) tên Faction = "Innocents" 
3) cờ Faction = 0 
4) Faction gắn kết = 0,5 
5) quan hệ liên phe: 
    5.1) Faction = "ngoài vòng pháp luật" 
    5.2) Quan hệ = 0.05

Phe này không có cờ, sự liên kết giữa các phe trung lập, và không có kẻ thù nào ngoài "kẻ cướp" được định nghĩa trong bộ của nó. Tuy nhiên, nếu chúng ta tìm nơi khác, chúng ta có thể thấy rằng (ví dụ) "dark_knights" có mối quan hệ -0.9 với "vô tội", như được định nghĩa trong bộ bài "dark_knights". Điều này là bởi vì một mối quan hệ hoạt động theo hai cách - nó chỉ cần được thiết lập một lần, và giá trị sẽ được tính cho cả hai phe phái. 

Bây giờ, tạo một bộ phận phe mới bằng cách sao chép "vô tội" và dán nó vào cuối danh sách. Thay đổi id faction và đặt tên là "geoffrey", và sau đó chuyển "outlaws" trong danh sách quan hệ thành "player_faction". 

Lưu tiến bộ của bạn. Khi bạn đã làm xong, hãy mở module_party_templates.py và module_troops.py, và thay đổi phe của mẫu "new_template" và phe của quân đội "Geoffrey" thành "fac_geoffrey". Lưu và đóng các tệp. Nhấp vào build_module.bat . Nếu mọi thứ trở nên tốt đẹp, các bữa tiệc của "new_template" bây giờ có thể thấy rõ rằng "Geoffrey" là phe của họ, và họ sẽ thù nghịch với người chơi. 


6.3 - Module_Strings 

module_strings.py được cho là tập tin đơn giản nhất trong hệ thống mô đun. Nó chứa chuỗi- các khối văn bản có thể được hiển thị theo nhiều cách. Chuỗi được sử dụng tất cả trong suốt hệ thống mô-đun, từ module_dialogs đến module_quest; bất cứ khi nào một khối văn bản cần được hiển thị trên màn hình. Module_strings, tuy nhiên, là một kho cho các chuỗi độc lập, mà không bị ràng buộc với bất kỳ tập tin duy nhất. Do đó chúng có thể được gọi bởi các hoạt động từ bất cứ đâu trong hệ thống mô-đun. 

Bạn có thể xem những chuỗi này được sử dụng ở nhiều nơi khác nhau trong trò chơi, như các tin nhắn cuộn màu trắng ở phía dưới bên trái màn hình của bạn, hoặc trong một hộp hướng dẫn, hoặc thậm chí chèn vào một trình đơn trò chơi hoặc chuỗi đối thoại. 

Giống như module_factions, tập tin này ngay lập tức bắt đầu bằng một danh sách Python: strings = [ . Một lần nữa, vài tuples đầu tiên được đưa vào trò chơi và không nên chỉnh sửa.


Ví dụ về một chuỗi: 

  ("door_locked", "Cửa bị khóa"),


sự cố đột ngột: 

1) String id. Được sử dụng để tham chiếu chuỗi trong các tệp khác. 
2) Chuỗi văn bản. 


Một tính năng nổi bật của chuỗi là khả năng đặt một giá trị đăng ký hoặc thậm chí một chuỗi khác bên trong của nó. Bạn có thể làm điều này bằng cách thêm, ví dụ, {reg0} trong chuỗi. Điều này sẽ hiển thị giá trị hiện tại của reg (0) . {reg10} sẽ hiển thị giá trị hiện tại của reg (10) , v.v. 

Đối với chuỗi bổ sung, bạn phải sử dụng chuỗi đăng ký thay vì đăng ký bình thường; điều này là bởi vì các chuỗi được lưu trữ riêng biệt với sổ đăng ký. Ví dụ: {s2} sẽ hiển thị nội dung củastring register 2 - không phải nội dung của reg (2) . Bạn có thể tự do sử dụng chuỗi đăng ký 2 và reg (2) cùng một lúc cho những thứ khác nhau, chúng sẽ không chồng chéo hoặc can thiệp với nhau. 

Trong đối thoại, cũng có thể hiển thị các phần (hoặc tất cả) nội dung của một chuỗi khác nhau tùy thuộc vào giới tính của người đang được giải quyết. Ví dụ, chèn {sir / madam} vào một chuỗi sẽ cho thấy từ "sir" được hiển thị khi người đó là nam, và "madam" nếu người đó là nữ. 

Tất cả các tùy chọn này (trừ sự thay đổi dựa trên giới tính) sẽ hoạt động hoàn hảo trong bất kỳ loại lĩnh vực chuỗi. Xáo trộn dựa trên giới chỉ hoạt động trong đối thoại.


Với mục đích của thao tác "display_message", có thể hiển thị một chuỗi với nhiều màu khác nhau, bằng cách thêm một mã màu thập lục phân vào hoạt động. Ví dụ, (display_message, , [hex_colour_code]),

đây là một danh sách các mã hex sử dụng được cho display_message: 

xanh = 0xFFAAAAFF 
ánh sáng màu xanh = 0xFFAAD8FF 
đỏ = 0xFFFFAAAA 
vàng = 0xFFFFFFAA 
hồng = 0xFFFFAAFF 
tím = 0xFF6AAA89 
đen = 0xFFAAAAAA 
trắng = 0xFFFFFFFF 
xanh lục = 0xFFAAFFAA 
nâu = 0xFF7A4800 


6.4 - Module_Quests 

module_quest.pylà cuối cùng của các tập tin nhỏ, đơn giản của chúng tôi. Nó chứa các nhiệm vụ, bao gồm tất cả các văn bản liên quan đến những nhiệm vụ. Đưa nhiệm vụ mới vào đây cho phép họ được kích hoạt thông qua hệ thống mô-đun, để các hoạt động có thể đọc tình trạng hiện tại của nhiệm vụ và sử dụng trạng thái đó như là một hoạt động điều kiện. 


Ví dụ về một nhiệm vụ: 

( "hunt_down_river_pirates", "săn xuống cướp biển sông", qf_show_progression, 
  "Constable Hareck hỏi bạn để săn lùng những tên cướp biển sông mà bệnh dịch hạch nước xung quanh Zendar \. 
 Ông hứa sẽ trả tiền cho bạn 5 denars cho mỗi bên cướp biển sông bạn loại bỏ " 
  ),


Nhiệm vụ này không cần giới thiệu. Tất cả chúng tôi đều săn lùng những tên cướp biển ở một vài điểm nào đó. Điểm thú vị của nó là qf_show_progression cờ, và thực tế là nó sử dụng dấu gạch chéo ngược - \ - để cho phép một ngắt dòng trong chuỗi của nó. Lưu ý, tuy nhiên, việc sử dụng dấu gạch chéo ngược hiện không đặt dòng ngắt dòng trong văn bản trong trò chơi. Nó được sử dụng ở đây chỉ cho gọn gàng. 


Sự cố đột ngột: 

1) Quest id. Được sử dụng để tham khảo các nhiệm vụ trong các tệp khác. 
2) Tên nhiệm vụ. Tên của nhiệm vụ được hiển thị trong danh sách nhiệm vụ ở bên trái màn hình nhiệm vụ. 
3) cờ Quest. 
4) Mô tả nhiệm vụ. Mô tả dài của nhiệm vụ, như được hiển thị trong hộp văn bản lớn ở trên cùng bên phải của màn hình nhiệm vụ. 


Cướp biển sông tuple kiểm tra: 

1) Quest id = "hunt_down_river_pirates" 
2) Quest Name = "săn xuống cướp biển sông" 
3) Quest cờ = qf_show_progression
4) Quest Description = "Constable Hareck yêu cầu bạn săn lùng những tên cướp biển đang làm ô nhiễm đất nước xung quanh Zendar." 
 Ngài hứa sẽ trả 5 đô cho mỗi con tàu cướp biển mà bạn đã tiêu diệt. " 


qf_show_progression là nhiệm vụ cho quest này phần trăm hoàn thành, được nhìn thấy bên phải danh sách nhiệm vụ. Danh sách nhiệm vụ có thể tìm thấy ở bên trái màn hình nhiệm vụ của bạn. Tỷ lệ phần trăm này không tăng tự động; bạn sẽ phải thiết lập nó thông qua hoạt động nếu bạn muốn sử dụng nó. 

Nếu bạn muốn thực hiện một nhiệm vụ mà không có bất kỳ lá cờ, chỉ cần đặt một 0 trong trường cờ. 


Tại thời điểm này, chúng tôi thực hiện bước đầu tiên trong việc tạo ra nhiệm vụ nhỏ của mình. Sao chép câu hỏi nhiệm vụ sau và dán nó vào cuối danh sách Python:

( "speak_with_troublemakers", "Parley với kẻ gây rối", 0, 
  "Constable Hareck hỏi bạn để đối phó với một loạt các nhà quý tộc trẻ làm rắc rối xung quanh thị trấn như thế nào bạn muốn giải quyết vấn đề là tùy thuộc vào bạn;. Hareck đã hứa một ví của bạc nếu bạn thành công. " 
  ),

Lưu ý việc xây dựng bộ này. Bạn có thể thấy, chỉ cần một vài thay đổi để thực hiện một nhiệm vụ mới, nhưng kết hợp nó vào game đòi hỏi nhiều công việc hơn. Vì lý do đó, mục tiêu tiếp theo của chúng ta sẽ là module_dialogs.py - nơi mà chúng tôi sẽ đặt nhiệm vụ mới, quân đội và mẫu trang của chúng tôi để sử dụng. 

Lưu tiến trình của bạn, đóng tệp và nhấp vào build_module.bat . Nếu tất cả đều tốt, bạn sẽ sẵn sàng tiếp tục sang Phần 7 của tài liệu này.

Admin
Admin

Tổng số bài gửi : 1214
Join date : 19/04/2012
Age : 31

https://mrtuan.forumvi.com

Về Đầu Trang Go down

Hệ thống Module Empty Re: Hệ thống Module

Bài gửi by Admin Wed 01 Nov 2017, 15:15

« on: June 02, 2006, 08:31:23 PM »

In this Part we will be examining module_dialogs.py, by far the largest file in the module system and one of the most important, as it contains all dialogue in Mount&Blade. Any new dialogue that you wish to create will go into this file. It also contains placeholder dialogue at the very bottom, which is used for troops that do not (yet) have their own dialogue.


7.1 -- Breakdown of Module_Dialogs

The file begins immediately with a Python list, followed by the first piece of dialogue in the game -- Constable Hareck's announcement regarding the river pirates. An important fact to remember is that the game scans module_dialogs from top to bottom, using the first line that meets all the criteria of its situation. It differentiates between lines used in different situations, from a party encounter on the map to chatting with an NPC in a scene.

You will note, each line of dialogue is an individual tuple. The only things connecting them are their dialog-states, which we will review in a moment.

Example of a dialogue tuple:

  [trp_constable_hareck,"start", [], "What do you want?", "constable_hareck_talk",[]],

This is a wonderfully simple tuple, which will serve well as our example. It does everything a line of dialogue might do; it opens by accosting Constable Hareck in a scene, displays the text "What do you want?", and then segues into the starting dialog-state "constable_hareck_talk" upon mouse-click.


Tuple field breakdown:

1 ) Dialogue partner. This should match the person player is talking to.
2 ) Starting dialog-state. Determines how this line is opened.
3 ) Conditions block. The list of conditions that must be met for this line to be considered. This must be a valid operation block.
4 ) Dialogue text. The actual line as it will appear in-game.
5 ) Ending dialog-state. Determines what happens after this line.
6 ) Consequences block. The operations that take place after the player has clicked through this line. This must be a valid operation block.


Constable Hareck example tuple examination:

1 ) Dialogue partner = trp_constable_hareck
2 ) Starting dialog-state = "start"
3 ) Conditions block = []
4 ) Dialogue text = "What do you want?"
5 ) Ending dialog-state = "constable_hareck_talk"
6 ) Consequences block = []


The most important things to note in this tuple are the dialog-states, mentioned in the opening paragraph of this segment. We will delve into these more deeply now.

The ending dialog-state ("constable_hareck_talk") is what leads a conversation from one line to the next. The ending dialog-state can be anything you like -- but there must be another tuple with a matching starting dialog-state. For example, if we were to make a tuple with the ending state "blue_oyster", this would lead into any tuple with the starting state "blue_oyster". There must be an exact match; if no match exists, build_module.bat will throw an error upon trying to build.

If there are multiple tuples with the starting state "blue_oyster", something special happens. If the tuples are spoken by the player, they result in a menu where the player can choose between the provided tuples. If spoken by an NPC, the module system will use the first tuple in module_dialogs for which all conditions are met -- even if there are multiple lines that qualify.

To end a conversation, you must use the ending dialog-state "close_window".


To start a conversation, there are several special starting dialog-states from which you can choose. We will refer to these as initial dialog-states. Here is the full list of initial dialog-states:


"start" -- Considered when speaking to an NPC in a scene or when a conversation is triggered inside a scene.
"party_encounter" -- Considered when encountering another party on the overland map.
"party_relieved" -- Considered when assisting a battling party on the overland map, once the player has won the fight.
"prisoner_liberated" -- Considered when the player defeats an enemy party with one or more Hero prisoners.
"enemy_defeated" -- Considered when the player defeats an enemy party led by a Hero.
"event_triggered" -- Considered when a dialogue is triggered by an operation while not in a scene.
"member_chat" -- Considered when speaking to a member in your party.
"prisoner_chat" -- Considered when speaking to a prisoner in your party.


As you can see, each initial dialog-state is designed for a specific situation. It will not be considered anywhere outside its situation.

Since our example tuple is initiated by speaking to Constable Hareck in Zendar, its initial dialog-state is "start".


7.2 -- Requirements And The Conditions Block

The dialogue interface is very flexible, and can be used in a great number of ways. It handles both events on the overland map and events in scenes. It allows dialogues to be triggered whenever you want them.

In the following segments, we examine how to use the dialogue interface to its fullest, and after that we will learn how to create complex dialogues of our own.


As we have outlined in the last segment, a dialogue line will only be considered if all its requirements are met. First of all, the player must be speaking to the correct troop. A line with trp_constable_hareck will not be considered if the player is addressing trp_ramun_the_slave_trader. The constant anyone may be used if the line is to be spoken by anyone the player is addressing at the time.

Second, the starting dialog-state must be in accordance with the situation -- either the dialogue line is initiated by an initial dialog-state, or the line follows from a matching ending dialog-state in another line. If the starting dialog-state does not meet specifications, it won't be considered for use.

Thirdly, the same logic of the previous two points applies to the conditions block. Unless all of a line's conditions are met, the line will not be considered. If either the conditions or the starting dialog-state are erroneous, you will experience problems; either build_module.bat will throw an error, or the erroneous dialogue lines will simply freeze in-game, since their ending dialog-states will not be able to find another tuple to activate.

This is the reason why you must be careful with conditions blocks. Make sure you don't break your own dialogue by planting conditions which are not properly set.


However, when everything is working in harmony, conditions blocks can be very powerful. They can contain try blocks. You can call slots from inside a conditions block, and then use the result in a condition operation inside the same block. You can set registers and string registers in order to use them in the actual dialogue. We will do all of these things in this Part of the documentation, one at a time.

You can observe the use of a conditions block in the very first tuple of module_dialogs:

  [trp_constable_hareck,"start", [(eq,"$constable_announcement",0)]

This block contains only one condition, which requires the variable "$constable_announcement" to be equal to 0. This is because all registers and variables are equal to 0 at the beginning of a new game. And if you look at the end of this tuple, you will notice the consequences block:

  "constable_hareck_introduce_1",[(assign,"$constable_announcement",1)]]

The assign operation in this block sets the variable "$constable_announcement" to 1 after the line has been displayed. In other words, after this line has been displayed once, it will never be displayed again -- because afterwards, the variable "$constable_announcement" will no longer be equal to 0. The dialogue system will then ignore this line and instead go to the next tuple in the file which meets requirements:

  [trp_constable_hareck,"start", [], "What do you want?", "constable_hareck_talk",[]],

The only requirements on this line are that the player must be speaking to Constable Hareck in a scene. It will always be selected when speaking to Constable Hareck in the Zendar centre after he has delivered his speech.


7.3 -- Adding New Dialogue

Here we finally have a chance to give our new troop Geoffrey some unique dialogue. However, like module_troops, module_dialogs is another file where you cannot simply add more tuples at the bottom of the list. The end of module_dialogs's Python list contains placeholder conversations that will trigger for anyone at all, and because the file is scanned from top to bottom for a match, any dialogue that you add after the placeholder conversations will be completely ignored.

It is recommended that you add new dialogue before the following comment:

# Random quests
###################################################### 


Our first goal is to create an introduction for Geoffrey. This will allow us to gain a little bit of experience before we throw ourselves into the creation of a full-blown quest.

Copy the following tuple and paste it into the appropriate location in your module_dialogs:

  [trp_geoffrey,"start", [], "What? What do you want? Leave me be, {sir/wench}, I have no time for beggars.", "geoffrey_talk",[]],

This is the first tuple in our new conversation. It's activated by the initial dialog-state "start",  spoken by Geoffrey, and it leads into the starting dialog-state "geoffrey_talk". Also, the dialogue system will display the word 'sir' or 'wench' depending on the player's gender.

Next we will make a follow-up line, spoken by the player. Copy the following tuple and paste it into module_dialogs, just below the new tuple:

  [trp_geoffrey|plyr,"geoffrey_talk", [], "Nothing, never you mind.", "close_window",[]],

This line will be displayed right after the first. It is spoken by the player. Due to the ending dialog-state "close_window", this conversation will end after the line has been displayed.

As we have covered before, adding multiple tuples with the same starting dialog-state will result in an option menu from which the player can choose the preferred line. Again, remember that this only works for tuples that are spoken by the player, and not for any other troop. Copy the following tuples and paste them into your module_dialogs file:

  [trp_geoffrey|plyr,"geoffrey_talk", [], "And who are you supposed to be?", "geoffrey_talk_2",[]],
  [trp_geoffrey,"geoffrey_talk_2", [], "Why, I'm Geoffrey Eaglescourt, son of the Baron Eaglescourt! Leader of the Red Riders, bane of bandits, and crusher of pirates!", "geoffrey_talk_3",[]],
  [trp_geoffrey|plyr,"geoffrey_talk_3", [], "Oh, I see. And how many pirates have you killed?", "geoffrey_talk_4",[]],
  [trp_geoffrey,"geoffrey_talk_4", [], "See for yourself! I scalp every one of the dogs I kill. They are my battle trophies.", "geoffrey_talk_5",[]],
  [trp_geoffrey|plyr,"geoffrey_talk_5", [], "That's nice. I'll be going now.", "close_window",[]],

This is all part of one possible conversation path -- a small back-and-forth between Geoffrey and the player. Nothing important is happening yet, but we're about to add a little more variety to this exchange. Add the following two tuples to the dialogue:

  [trp_geoffrey|plyr,"geoffrey_talk_5", [(check_quest_active,"qst_speak_with_troublemakers"),(eq,"$geoffrey_duel",0)], "Really? Those scalps look suspiciously like horse tails to me.", "geoffrey_hostile",[]],
  [trp_geoffrey|plyr,"geoffrey_talk", [(check_quest_active,"qst_speak_with_troublemakers"),(eq,"$geoffrey_duel",0)], "You look familiar. Haven't I seen your face in a pigsty before?", "geoffrey_hostile",[]],

These two lines will create extra menu choices for the starting dialog-states "geoffrey_talk_5" and "geoffrey_talk", respectively. It doesn't technically matter where in module_dialogs you place tuples with the same starting dialog-state. The dialogue system will find them all and, if conditions are met, add them to the menu options. However, you should try to keep menu tuples together in order to keep your code straightforward and readable.

The most notable feature of these lines is their condition blocks. Either line will only ever appear as a dialogue option if the quest "qst_speak_with_troublemakers" is currently active and if "$geoffrey_duel" is equal to 0. If either of these conditions is not met, the line won't be considered for display. Now, copy and paste these last few tuples:

  [trp_geoffrey,"geoffrey_hostile", [], "What?! I'll see you dead for that insult, peasant! Don't you know who I am?", "geoffrey_hostile_2",[]],
  [trp_geoffrey|plyr,"geoffrey_hostile_2", [], "No . . . Was I supposed to remember?", "geoffrey_hostile_3",[]],
  [trp_geoffrey,"geoffrey_hostile_3", [], "Why, I'm Geoffrey Eaglescourt, son of the Baron Eaglescourt, and you have delivered the gravest insult to my family's honour! I demand satisfaction! Meet me outside the town walls tonight, or you will be known a coward to every man in this countryside. Good day, {sirrah/wench}.", "geoffrey_hostile_4",[]],
  [trp_geoffrey|plyr,"geoffrey_hostile_4", [], "Charming lad. Tonight, eh . . . ? I shouldn't miss it . . .", "close_window",[(assign,"$geoffrey_duel",1)]],


With that done, we now have a conversation with several quest-related conditions and consequences, as well as a ready-made quest tuple; but we have yet to create the conditions that will allow the player to activate the quest in the first place. This we will do in the next segment.


7.4 -- Dialogue And Quests

When adding new lines to an existing conversation, we must be very careful that our new tuples play nicely with the existing ones. Remember that the dialogue file is scanned from top to bottom; remember to check your conditions blocks; remember to keep a close eye on your syntax. One misspelling can throw off entire blocks of code. Build your module often so that you can catch any syntax errors early.

First, we're going to add one more tuple for Geoffrey, and we're going to add it before any of his other lines. This means it will be considered before his other lines. If this tuple's conditions are present, it will be selected for use regardless of any others that might have also met conditions.


Currently, Geoffrey's first tuple is this:

  [trp_geoffrey,"start", [], "What? What do you want? Leave me be, {sir/wench}, I have no time for beggars.", "geoffrey_talk",[]],


Now, copy the following tuple and paste it into your dialogs file above the aforementioned tuple:

  [trp_geoffrey,"start", [(eq,"$geoffrey_duel",1)], "Begone! I have nothing to say to you, varlet.", "close_window",[]],


With this tuple in place, Geoffrey's normal conversation will no longer be displayed once he has challenged you to a duel. This way, you can change conversations depending on their situation, and create infinite varieties of dialogue with conditions blocks to manage when each line appears.


The last tuple in Constable Hareck's conversations is this:

  [trp_constable_hareck|plyr,"constable_hareck_talk", [], "Nothing. Good-bye.", "close_window",[]],


"constable_hareck_talk" is a menu dialog-state with several options, of which this tuple is the last. In order for a dialogue option to appear in the menu above this one, we have to add it into module_dialogs above this tuple.

Copy the following tuple and paste it into your dialogs file above the aforementioned tuple:

  [trp_constable_hareck|plyr,"constable_hareck_talk", [(neg|check_quest_active,"qst_speak_with_troublemakers"),(neg|check_quest_finished,"qst_speak_with_troublemakers")], "Is something wrong? You look worried.", "constable_hareck_troublemakers",[]],


This tuple will only be displayed if the quest "qst_speak_with_troublemakers" is not active and not completed. This is due to the negation-prefix neg|, which causes a condition operation to require the opposite of what it normally requires. For example, the condition operation eq requires two values to be equal; neg|eq requires the values to be inequal.

Now, just below this new tuple, copy and paste the following:

  [trp_constable_hareck,"constable_hareck_troublemakers", [], "Oh, it's nothing, just . . .", "constable_hareck_troublemakers_2",[]],
  [trp_constable_hareck|plyr,"constable_hareck_troublemakers_2", [], "You can tell me, sir.", "constable_hareck_troublemakers_3",[]],
  [trp_constable_hareck,"constable_hareck_troublemakers_3", [], "No harm in it, I suppose. The trouble is, a few of the town's young nobles . . . spoiled dandies and fops, the lot of them . . . they've decided that suddenly they're men to be respected, and that they should 'take matters into their own hands', to 'take action where the official government has failed'. They say they're going to kill all the river pirates that have been troubling Zendar of late. Of course, they've not actually gone out to fight any river pirates, but they've been making a great ruckus in town and there's not a thing I can do about it.", "constable_hareck_troublemakers_4",[]],
  [trp_constable_hareck|plyr,"constable_hareck_troublemakers_4", [], "Hmm . . . Would there be a reward for solving this problem?", "constable_hareck_troublemakers_5",[]],
  [trp_constable_hareck,"constable_hareck_troublemakers_5", [], "What? What are you saying?", "constable_hareck_troublemakers_6",[]],
  [trp_constable_hareck|plyr,"constable_hareck_troublemakers_6", [], "Nothing, sir. However, it sounds to me like a neutral third party might be just what you need. I could talk to them.", "constable_hareck_troublemakers_7",[]],
  [trp_constable_hareck,"constable_hareck_troublemakers_7", [], "Heh. Well, you can try, friend. If you manage to do any good, I'll even throw in a few coins for getting the sand out of my breeches. Their leader is a boy named Geoffrey, spends most of his time on watered-down ale and whores in the Happy Boar. Chances are you'll find him there.", "constable_hareck_troublemakers_8",[]],
  [trp_constable_hareck|plyr,"constable_hareck_troublemakers_8", [], "Thank you, constable. I shall return.", "close_window",[(setup_quest_text,"qst_speak_with_troublemakers"),(start_quest,"qst_speak_with_troublemakers")]],

  [trp_constable_hareck|plyr,"constable_hareck_talk", [(check_quest_active,"qst_speak_with_troublemakers"),(eq,"$geoffrey_duel",2)], "Constable, I've taken care of the toublemakers for you. They shouldn't be a worry any longer.", "constable_hareck_troublemakers_10",[]],
  [trp_constable_hareck,"constable_hareck_troublemakers_10", [], "Truly? Thank God! A few more days and I would've thrown them all into a cell and thrown away the key. Here, take this. You've earned it.", "constable_hareck_troublemakers_11",[(troop_add_gold,"trp_player",100),(add_xp_as_reward,750),(succeed_quest,"qst_speak_with_troublemakers")]],
  [trp_constable_hareck|plyr,"constable_hareck_troublemakers_11", [], "My pleasure, constable. If you've any other jobs that need doing, please let me know. Farewell.", "close_window",[]],

  [trp_constable_hareck|plyr,"constable_hareck_talk", [(check_quest_active,"qst_speak_with_troublemakers"),(eq,"$geoffrey_duel",3)], "Constable, I failed. I'm sorry.", "constable_hareck_troublemakers_15",[]],
  [trp_constable_hareck,"constable_hareck_troublemakers_15", [], "Oh . . . Oh well. I suppose you did the best you could. Thanks anyway, friend. Perhaps some other job will suit you better. I shall let you know when I have any. Farewell.", "close_window",[(fail_quest,"qst_speak_with_troublemakers")]],


The first block sets up the quest, explaining the details and how to start it. The second block finishes the quest with a nice little reward of gold and experience points, once the variable "$geoffrey_duel" has been set to 2, which we will do upon defeating Geoffrey. The third block finishes the quest if the player fails to defeat Geoffrey, which means he will receive no rewards.


As you can see, it can take some doing to cover all possible aspects of a quest. Ours is only half-finished. All the dialogue is now in place, however, so we are now ready to move on to the next part of this documentation.

Admin
Admin

Tổng số bài gửi : 1214
Join date : 19/04/2012
Age : 31

https://mrtuan.forumvi.com

Về Đầu Trang Go down

Hệ thống Module Empty Re: Hệ thống Module

Bài gửi by Admin Wed 01 Nov 2017, 15:15

Part 8: Triggers
« on: July 12, 2006, 02:18:12 AM »

Now that we have gained some significant experience working with the module system, we can turn our hands to one of the more complex components; Triggers. Triggers are time-based operations blocks that activate at regular intervals or at specified occasions. All operations in the trigger's operations block will then be executed.

8.1 -- Breakdown, Module_Simple_Triggers

Currently, module_simple_triggers has only one function: to direct the player to an appropriate menu when encountering another party on the overland map. To this effect, its Python list contains only one fairly long tuple.

  (ti_on_party_encounter,
   [
       (store_encountered_party, reg(1)),
       (store_encountered_party2,reg(2)), # encountered_party2 is set when we come across a battle or siege, otherwise it's a minus value
       (try_begin),
         (lt, reg(2),0), #Normal encounter. Not battle or siege.
         (try_begin),
           (ge, reg(1), towns_begin),
           (lt, reg(1), towns_end),
           (jump_to_menu, "mnu_town"),
         (else_try),
         (else_try),
           (ge, reg(1), castles_begin),
           (lt, reg(1), castles_end),
           (jump_to_menu, "mnu_castle"),
         (else_try),
           (eq, reg(1), "p_zendar"),
           (jump_to_menu, "mnu_zendar"),
         (else_try),
           (eq, reg(1), "p_salt_mine"),
           (jump_to_menu, "mnu_salt_mine"),
         (else_try),
           (eq, reg(1), "p_four_ways_inn"),
           (jump_to_menu, "mnu_four_ways_inn"),
         (else_try),
           (eq, reg(1), "p_dhorak_keep"),
           (jump_to_menu, "mnu_dhorak_keep"),
         (else_try),
           (eq, reg(1), "p_training_ground"),
           (jump_to_menu, "mnu_training_ground"),
         (else_try),
           (store_current_hours, reg(7)),
           (le, reg(7), "$defended_until_time"),
           (assign, "$defended_until_time", 0),
           (jump_to_menu, "mnu_in_castle_under_attack"),
         (end_try),
       (else_try), #Battle or siege
       (try_end)
    ]),


This is the first and only trigger in the list. It is a very simple construction, containing only two separate fields.

Breakdown of the tuple fields:

1 ) Check interval: When or how frequently this trigger will be checked
2 ) Operation block: This must be a valid operation block. See header_operations.py for reference. 


Tuple examination:

1 ) Check interval = ti_on_party_encounter.
2 ) Operation block. Examination of the operation block will follow.

As we can see by ti_on_party_encounter, this trigger is checked whenever the player encounters a party on the overland map. We will now individually highlight each section of the tuple to examine what it does.


Section 1:

       (store_encountered_party, reg(1)),
       (store_encountered_party2,reg(2)), # encountered_party2 is set when we come across a battle or siege, otherwise it's a minus value


1 ) "store_encountered_party" finds whatever party the player has encountered, and stores that party's identity to the register "reg(1)".
2 ) "store_encountered_party2" does the same, storing the second encountered party to "reg(2)". Obviously this only occurs if the player is encountering a battle or siege in progress. If there is no second party, "reg(2)" will contain a value below 0.


Section 2:

       (try_begin),
         (lt, reg(2),0), #Normal encounter. Not battle or siege.

The condition (lt, reg(2),0) requires "reg(2)" to be below 0. Since "reg(2)" is always below 0 unless the player has encountered a battle in progress, the operations block will continue to Section 3.

The interesting thing to note about this section is the operation (try_begin). This operation opens a try operation, which functions just like a normal operations block, except for one difference. If a try operation contains a condition whose requirements are not met, this doesn't cancel the entire rest of the operations block; it only cancels up to the nearest (try_end). Everything after the (try_end) proceeds as normal. In essence, a try operation functions like an isolated operations block inside an operations block.

There is also the additional try operation (else_try), which can be inserted into an active try operation such as the one in module_simple_triggers. The contents of an else_try block will only be considered for execution if all active try operations before the (else_try) (including other else_trys) have failed to meet their conditions.


Section 3:

         (try_begin),
           (ge, reg(1), towns_begin),
           (lt, reg(1), towns_end),
           (jump_to_menu, "mnu_town"),

This section begins a try operation inside a try operation. This section will succeed if "reg(1)" -- the encountered party -- is between the constant towns_begin ("p_town_1" in module_parties.py) and towns_end("p_salt_mine" in module_parties). If this condition succeeds, the player will be directed to the menu "mnu_town". If it fails, the block will move on to Section 4.


Section 4:

         (else_try),
           (ge, reg(1), castles_begin),
           (lt, reg(1), castles_end),
           (jump_to_menu, "mnu_castle"),

This section will only be considered if the try operation above it has failed; therefore, it will only be considered if the encountered party is not a town. So, having concluded that the encountered party is not a town, this section checks if it is between castles_begin ("p_castle_1") and castles_end ("p_river_pirate_spawn_point"). If this try operation succeeds, the player is directed to "mnu_castle". If it fails, the block moves on to Section 5.


Section 5:

         (else_try),
           (eq, reg(1), "p_zendar"),
           (jump_to_menu, "mnu_zendar"),

Having concluded that the encountered party is neither a town nor a castle, this try operation checks if the encountered party is "p_zendar". If it succeeds, this try operation will jump the player to "mnu_zendar". If it fails, on to Section 6.


Section 6:

         (else_try),
           (eq, reg(1), "p_salt_mine"),
           (jump_to_menu, "mnu_salt_mine"),

If the encountered party is "p_salt_mine", this try operation will jump the player to "mnu_salt_mine".


Section 7:

         (else_try),
           (eq, reg(1), "p_four_ways_inn"),
           (jump_to_menu, "mnu_four_ways_inn"),

If the encountered party is "p_four_ways_inn", this section will jump the player to "mnu_four_ways_inn".


Section 8:

         (else_try),
           (eq, reg(1), "p_dhorak_keep"),
           (jump_to_menu, "mnu_dhorak_keep"),

If the encountered party is "p_dhorak_keep", this section will jump the player to "mnu_dhorak_keep".


Section 9:

         (else_try),
           (eq, reg(1), "p_training_ground"),
           (jump_to_menu, "mnu_training_ground"),

If the encountered party is "p_training_ground", this section will jump the player to "mnu_training_ground".


Section 10:

         (else_try),
           (store_current_hours, reg(7)),
           (le, reg(7), "$defended_until_time"),
           (assign, "$defended_until_time", 0),
           (jump_to_menu, "mnu_in_castle_under_attack"),

This section stores the number of hours that have passed since the beginning of the game to "reg(7)", and then checks if "reg(7)" is less than or equal to the variable "$defended_until_time". On success, it will set "$defended_until_time" to 0 and jump the player to "mnu_in_castle_under_attack". On faillure, it will move on to Section 11.


Section 11:

         (end_try),

This signifies the end of the second try operation. The first try operation continues as normal, regardless of what happened in the second try operation.


Section 12:

       (else_try), #Battle or siege
       (try_end)

This else_try operation covers every encounter with a party engaged in battle with another party. Since it currently contains no other operations, it will result in a battle encounter -- just like the "new_town" we created in Part 2 of this documentation, which still has no operations linking it to a menu and no pf_auto_start_dialog flag set. We will rectify this in the next segment.


8.2 -- Editing the Party Encounters Trigger

In order to make a town work, we have to make sure that any encounter with this town directs the player to the proper game menu. This leaves us with two choices; either we can direct our new party to use one of the Native menus, such as mnu_town, or we can create a new one.

For our new_town, we will create a custom menu, but later we will examine what's required for a newly-created town to use the Native town menu.

First, any further entries in the party encounters trigger should be added before Section 10:

         (else_try),
           (store_current_hours, reg(7)),
           (le, reg(7), "$defended_until_time"),
           (assign, "$defended_until_time", 0),
           (jump_to_menu, "mnu_in_castle_under_attack"),

If you add any entries after this one, it will create problems when encountering your new parties at midnight. To make sure this doesn't happen, we will place our new entry just above it, and just below Section 9:

         (else_try),
           (eq, reg(1), "p_training_ground"),
           (jump_to_menu, "mnu_training_ground"),

Create some space between Section 9 and Section 10. Once you've done so, we can begin creating the new entry.

Any new entries in this trigger must begin with an else_try. After the else_try, we can add condition operations to specify when this entry should and should not fire. Then, once all the conditions are in place, we can add consequences, such as jumping the player to a game menu. These consequences can be very varied, they're not limited merely to jump_to_menu, but they must all be valid operations.

Copy and paste Section 9 (the training_ground entry) into our newly-created space. When you've done so, replace the new entry's "p_training_ground" with "p_new_town" and "mnu_training_ground" with "mnu_new_town".

Now the only thing left to do to make our town operational is creating a menu for it. Before we move on to module_game_menus, however, there is a lot more functionality waiting to be explored in triggers. Open module_triggers.py now and move on the next segment.


8.3 -- Breakdown, Module_Triggers

There are two types of triggers in the M&B module system: simple triggers and expanded triggers. Expanded triggers are contained in module_triggers.py. They work via the same theory as simple triggers, but have several more options.


  (0.1, 0, ti_once, [(map_free,0)], [(tutorial_box,"str_tutorial_map1")]),

The first trigger in this file is nice and simple. It is the trigger that pops up the map tutorial when the player first spawns on the overland map.


Breakdown of the tuple fields:

1) Check interval: How frequently this trigger will be checked.
2) Delay interval: How long to wait before applying the consequences of the trigger after its conditions block has succeeded.
3) Re-arm interval: How much time must pass after applying the consequences of the trigger for the trigger to become active again.
4) Conditions block. This must be a valid operation block. If the conditions block is empty, it always succeeds, therefore the trigger always fires.
5) Consequences block. This must be a valid operation block.


Tutorial tuple examination:

1) Check interval = 0.1
2) Delay interval = 0
3) Re-arm interval = ti_once
4) Conditions block = (map_free,0)
5) Consequences block = (tutorial_box,"str_tutorial_map1")


As we can see from the examination, this trigger is checked every 0.1 hours of game time; it has no delay interval; it never rearms due to ti_once. This means that, if the conditions in the trigger's conditions block are all met, the trigger fires once and never again. In this case, the trigger will fire if the player is placed anywhere on the map.

We can now begin to make a trigger of our own. Copy the tutorial trigger and paste it to the bottom of the Python list.

What we are going to do with this new trigger is spawn another party on the map; namely, Geoffrey's party. Replace (map_free,0) in the trigger's conditions block with the following operations:

(eq,"$geoffrey_duel",1),
(store_time_of_day,reg(1)),
(gt,reg(1),19),

If you remember what we did in Part 7 of this doscumentation, we assigned the variable "$geoffrey_duel" to 1 after you talk Geoffrey into challenging you to a duel. Therefore, (eq,"$geoffrey_duel",1) checks whether or not Geoffrey has challenged you. If he hasn't, the conditions block will fail.

The following two operations store the time of day to reg(1), and then check if reg(1) is greater than 19; essentially, whether the time of day is later than 19:00. If it is, the conditions block will succeed and allow the trigger to fire.


Now, replace (tutorial_box,"str_tutorial_map1") in the consequences block with the following operations:

(set_spawn_radius,0),
(spawn_around_party,"p_zendar","pt_new_template"),
(assign,"$geoffrey_party_id",reg(0)),
(party_set_ai_behavior,"$geoffrey_party_id",ai_bhvr_track_party),
(party_set_ai_object,"$geoffrey_party_id","p_main_party"),

The first operation sets the spawn radius; you must do this every time you want to spawn a party, or the party will be spawned at the most recently set radius, which can be very unpredictable.

The second operation spawns a party template ("pt_new_template") around a party ("p_zendar"). This operation also outputs the identifier of the spawned party to reg(0). We then assign this identifier to a variable so that it will not be lost when reg(0) is next overwritten.

Lastly, we set the party's AI behaviour and object. These operations are fairly straightforward. We are telling "$geoffrey_party_id" to track "p_main_party". When you set a party to track another party, it will relentlessly hunt down the other party and then attack it, regardless of faction and other considerations.


Save your progress. You cannot compile yet, as we have yet to create a menu for the party encounter we created in segment 8.2. We'll do this next. You are now ready to move on to Part 9 of this documentation.

Admin
Admin

Tổng số bài gửi : 1214
Join date : 19/04/2012
Age : 31

https://mrtuan.forumvi.com

Về Đầu Trang Go down

Hệ thống Module Empty Re: Hệ thống Module

Bài gửi by Admin Wed 01 Nov 2017, 15:16

9.1 -- Breakdown of Module_Game_Menus

The file begins with its Python list, then lists two menus used in character creation, notably the selection of the player's gender and selection of the player's character class. These can be fairly complicated, so we'll skip ahead to a simpler one to use for an example.

Example of a game menu:

    (
    "salt_mine",mnf_auto_enter,
    "You enter the salt mine.",
    "none",
    [(reset_price_rates,0),(set_price_rate_for_item,"itm_salt",55)],
    [
      ("enter",[],"Enter.",[[set_jump_mission,"mt_visit_town_horseback"],[jump_to_scene,"scn_salt_mine"],[change_screen_mission]]),
      ("leave",[],"Leave.",[[leave_encounter],[change_screen_return]]),
    ]
  ),


This menu handles your entry into the salt mine. It is fairly straightforward, set apart only by its flag mnf_auto_enter. Any menu with this flag will automatically activate the first menu option for which all conditions are met, without waiting for player input. In the salt mine's case, this is the menu option "enter".


Breakdown of the tuple fields:

1) Game-menu id. Used for referencing game-menus in other files.
2) Game-menu flags.
3) Game-menu text. This is the text the player will see in the menu window.
4) mesh-name. This is not currently used in the module system, must be the string "none".
5) Operations block. A list of operations that is executed when the game menu is activated. This must be a valid operations block.
6) List of Menu options. Each menu-option record is a tuple that contains the following fields:
   6.1) Menu-option-id. Used for referencing game-menu options in other files.
   6.2) Conditions block. All conditions are executed for each menu option to decide whether or not the option will be shown to the player. This must be a valid operation block.
   6.3) Menu-option text. The actual clickable text of the menu option. Substituting an underscore (_) for menu text in this field is an easy trick to make an option unclickable.
   6.4) Consequences block. Consequences are executed only for the menu option selected by the player. This must be a valid operation block.


Salt mine tuple examination:

1) Game-menu id = "salt_mine"
2) Game-menu flags = mnf_auto_enter
3) Game-menu text = "You enter the salt mine."
4) mesh-name = "none"
5) Operations block = (reset_price_rates,0),(set_price_rate_for_item,"itm_salt",55)
6) List of Menu options:
   6.1) Menu-option-id = "enter", "leave"
   6.2) Conditions block = Block contains no conditions.
   6.3) Menu-option text = "Enter.", "Leave."
   6.4) Consequences block= [set_jump_mission,"mt_visit_town_horseback"],[jump_to_scene,"scn_salt_mine"],[change_screen_mission], [leave_encounter],[change_screen_return]

The first thing this menu does is reset all trading price rates to normal, and then sets the price of salt to 55% of its normal value. Next, due to mnf_auto_enter, the menu will automatically select the first menu option for which all conditions are met ("enter") and execute it, thus automatically jumping the player into the salt mine without waiting for a click.

In the next segment we will use the salt mine as a template for creating a town menu of our own, which will finally make our modded town from Part 2 operational.

Admin
Admin

Tổng số bài gửi : 1214
Join date : 19/04/2012
Age : 31

https://mrtuan.forumvi.com

Về Đầu Trang Go down

Hệ thống Module Empty Re: Hệ thống Module

Bài gửi by Sponsored content


Sponsored content


Về Đầu Trang Go down

Về Đầu Trang


 
Permissions in this forum:
Bạn không có quyền trả lời bài viết