Skrypt dodający walki na morzu, kupowanie statków w miastach by Mirathei, James, Ruthven, MartinF, Jubal, Dudro i Lumos
Najpierw musimy rzecz jasna pobrać sceny tych walk i umieścić je w SceneObject w folderze z naszym modem.
Link do scen: http://www.mbrepository.com/file.php?id=2258
Teraz możemy zająć się podpinaniem scen do module systemu. Przechodzimy do module_scenes.py i dodajemy ten kod na końcu pliku, lecz nie pod nawiasem kwadratowym:
#Wulf begin
("sea_1",sf_generate,"none", "none", (0,0),(240,240),-0.5,"0x0000000030000000c00d23480000000080000 00000000000",
[],[]),
("sea_4",sf_generate,"none", "none", (0,0),(240,240),-0.5,"0x0000000030000000c00d23480000000080000 00000000000",
[],[]),
("sea_2",sf_generate,"none", "none", (0,0),(240,240),-0.5,"0x0000000030000000c00d23480000000080000 00000000000",
[],[]),
#Wulf end
Teraz zajmiemy się kupowaniem statków. Przechodzimy do module_game_menus.py. Wyszukujemy "sail_from_port". Usuwamy cały kod, który się nam ukazał i zamieniamy go na ten:
#Wulf begin
("sail_from_port",[(this_or_next|eq,"$current_town","p_town_1"),
(this_or_next|eq,"$current_town","p_town_2"),
(this_or_next|eq,"$current_town","p_town_6"),
(this_or_next|eq,"$current_town","p_town_12"),
(this_or_next|eq,"$current_town","p_town_19"),
(this_or_next|eq,"$current_town","p_town_13"),
(eq,"$current_town","p_town_15"),
# (eq, "$cheat_mode", 1),
# (party_slot_eq,"$current_town",slot_town_near_shore, 1),
], "Buy a ship (5000 denars)",
[(store_troop_gold,":money","trp_player"),
(try_begin),
(ge,":money",5000),
(troop_remove_gold,"trp_player",5000),
(assign, "$g_player_icon_state", pis_ship),
(party_set_flags, "p_main_party", pf_is_ship, 1),
(party_get_position, pos1, "p_main_party"),
(map_get_water_position_around_position, pos2, pos1, 6),
(party_set_position, "p_main_party", pos2),
(assign, "$g_main_ship_party", -1),
(change_screen_return),
(else_try),
(display_message,"@You don't have enough money"),
(try_end),
]),
#Wulf end
Teraz dla waszej wygody przeprowadzę analizę części kodu (tak, wiem, że bawię się w Kolbę):
"Buy a ship (5000 denars)", - jest to opcja, która będzie się wyświetlała w miastach przy morzu (można to spolszczyć, lecz nie wolno używać polskich znaków, chyba, że zmienisz kodowanie)
(ge,":money",5000), - określa ile hajsu potrzebujemy, aby kupić statek
"trp_player",5000), - określa ile hajsu nam odbierze, jeśli kupimy statek
Teraz zajmiemy się walkami z innymi statkami. Dalej (w module_game_menus.py) szukamy "encounter_attack", usuwamy ten kod i zastępujemy go tym:
("encounter_attack",[
(eq, "$encountered_party_friendly", 0),
(neg|troop_is_wounded, "trp_player"),
#Wulf
(party_get_current_terrain,":terrain","p_main_party"),
(neq,":terrain",0),
#Wulf end
],
"Charge the enemy.",[
(assign, "$g_battle_result", 0),
(assign, "$g_engaged_enemy", 1),
(call_script, "script_calculate_renown_value"),
(call_script, "script_calculate_battle_advantage"),
(set_battle_advantage, reg0),
(set_party_battle_mode),
(try_begin),
(eq, "$g_encounter_type", enctype_fighting_against_village_raid),
(assign, "$g_village_raid_evil", 0),
(set_jump_mission,"mt_village_raid"),
(party_get_slot, ":scene_to_use", "$g_encounter_is_in_village", slot_castle_exterior),
(jump_to_scene, ":scene_to_use"),
(else_try),
(eq, "$g_encounter_type", enctype_catched_during_village_raid),
(assign, "$g_village_raid_evil", 0),
(set_jump_mission,"mt_village_raid"),
(party_get_slot, ":scene_to_use", "$g_encounter_is_in_village", slot_castle_exterior),
(jump_to_scene, ":scene_to_use"),
(else_try),
(set_jump_mission,"mt_lead_charge"),
(call_script, "script_setup_random_scene"),
(try_end),
(assign, "$g_next_menu", "mnu_simple_encounter"),
(jump_to_menu, "mnu_battle_debrief"),
(change_screen_mission),
]),
("encounter_attack",[
(eq, "$encountered_party_friendly", 0),
(neg|troop_is_wounded, "trp_player"),
#Wulf
(party_get_current_terrain,":terrain","p_main_party"),
(eq,":terrain",0),
#Wulf end
],
"Close in and board the enemy.",[
(assign, "$g_battle_result", 0),
(assign, "$g_engaged_enemy", 1),
(call_script, "script_calculate_renown_value"),
(call_script, "script_calculate_battle_advantage"),
(set_battle_advantage, reg0),
(set_party_battle_mode),
(try_begin),
(eq, "$g_encounter_type", enctype_fighting_against_village_raid),
(assign, "$g_village_raid_evil", 0),
(set_jump_mission,"mt_village_raid"),
(party_get_slot, ":scene_to_use", "$g_encounter_is_in_village", slot_castle_exterior),
(jump_to_scene, ":scene_to_use"),
(else_try),
(eq, "$g_encounter_type", enctype_catched_during_village_raid),
(assign, "$g_village_raid_evil", 0),
(set_jump_mission,"mt_village_raid"),
(party_get_slot, ":scene_to_use", "$g_encounter_is_in_village", slot_castle_exterior),
(jump_to_scene, ":scene_to_use"),
(else_try),
#Wulf
(set_jump_mission,"mt_ship_battle"),
(try_begin),
(val_add,reg10,reg11),
(gt,reg10,60),
(jump_to_scene, "scn_sea_4"),
(else_try),
(val_add,reg10,reg11),
(gt,reg10,30),
(jump_to_scene, "scn_sea_2"),
(else_try),
(jump_to_scene, "scn_sea_1"),
(end_try),
#Wulf end
(try_end),
(assign, "$g_next_menu", "mnu_simple_encounter"),
(jump_to_menu, "mnu_battle_debrief"),
(change_screen_mission),
]),
Czas zająć się dołączaniem do walki. Szukamy "join_attack", usuwamy i zastępujemy tym kodem:
("join_attack",[(party_get_current_terrain,":terrain","p_main_party"),
(neq,":terrain",0),
# (neq, "$encountered_party_hostile", 0),
(neg|troop_is_wounded, "trp_player"),
## (store_troop_health,reg(5),"trp_player"),
## (ge,reg(5),20),
],
"Charge the enemy.",[
(party_set_next_battle_simulation_time, "$g_encountered_party", -1),
(assign, "$g_battle_result", 0),
(call_script, "script_calculate_renown_value"),
(call_script, "script_calculate_battle_advantage"),
(set_battle_advantage, reg0),
(set_party_battle_mode),
(set_jump_mission,"mt_lead_charge"),
(call_script, "script_setup_random_scene"),
(assign, "$g_next_menu", "mnu_join_battle"),
(jump_to_menu, "mnu_battle_debrief"),
(change_screen_mission),
]),
("join_attack",[(party_get_current_terrain,":terrain","p_main_party"),
(eq,":terrain",0),
# (neq, "$encountered_party_hostile", 0),
(neg|troop_is_wounded, "trp_player"),
## (store_troop_health,reg(5),"trp_player"),
## (ge,reg(5),20),
],
"Board the enemy",[
(party_set_next_battle_simulation_time, "$g_encountered_party", -1),
(assign, "$g_battle_result", 0),
(call_script, "script_calculate_renown_value"),
(call_script, "script_calculate_battle_advantage"),
(set_battle_advantage, reg0),
(set_party_battle_mode),
(set_jump_mission,"mt_ship_battle"),
(try_begin),
(val_add,reg10,reg11),
(gt,reg10,60),
(jump_to_scene, "scn_sea_4"),
(else_try),
(val_add,reg10,reg11),
(gt,reg10,30),
(jump_to_scene, "scn_sea_2"),
(else_try),
(jump_to_scene, "scn_sea_1"),
(end_try),
(assign, "$g_next_menu", "mnu_join_battle"),
(jump_to_menu, "mnu_battle_debrief"),
(change_screen_mission),
]),
Następnie przechodzimy do module_mission_templates.py i dodajemy na końcu pliku ten kod (lecz nie pod nawiasem kwadratowym):
(
"ship_battle",mtf_battle_mode,-1,
"You close in and board the enemy ships",
[(0,mtef_attackers|mtef_team_1,af_override_horse,aif_start_alarmed,4,[]),
(1,mtef_attackers|mtef_team_1,af_override_horse,aif_start_alarmed,4,[]),
(2,mtef_attackers|mtef_team_1,af_override_horse,aif_start_alarmed,4,[]),
(3,mtef_attackers|mtef_team_1,af_override_horse,aif_start_alarmed,4,[]),
(4,mtef_attackers|mtef_team_1,af_override_horse,aif_start_alarmed,4,[]),
(5,mtef_attackers|mtef_team_1,af_override_horse,aif_start_alarmed,4,[]),
(6,mtef_attackers|mtef_team_1,af_override_horse,aif_start_alarmed,4,[]),
(7,mtef_attackers|mtef_team_1,af_override_horse,aif_start_alarmed,4,[]),
(10,mtef_defenders|mtef_team_0,af_override_horse,aif_start_alarmed,4,[]),
(11,mtef_defenders|mtef_team_0,af_override_horse,aif_start_alarmed,4,[]),
(8,mtef_defenders|mtef_team_0,af_override_horse,aif_start_alarmed,4,[]),
(9,mtef_defenders|mtef_team_0,af_override_horse,aif_start_alarmed,4,[]),
(12,mtef_defenders|mtef_team_0,af_override_horse,aif_start_alarmed,4,[]),
(13,mtef_defenders|mtef_team_0,af_override_horse,aif_start_alarmed,4,[]),
(14,mtef_defenders|mtef_team_0,af_override_horse,aif_start_alarmed,4,[]),
(15,mtef_defenders|mtef_team_0,af_override_horse,aif_start_alarmed,4,[]),
],
[
(ti_on_agent_spawn, 0, 0, [],
[
(store_trigger_param_1, ":agent_no"),
(call_script, "script_agent_reassign_team", ":agent_no"),
]),
common_battle_init_banner, #sets heraldry on shields and armor
(ti_on_agent_killed_or_wounded, 0, 0, [],
[
(store_trigger_param_1, ":dead_agent_no"),
(store_trigger_param_2, ":killer_agent_no"),
(store_trigger_param_3, ":is_wounded"),
(try_begin),
(ge, ":dead_agent_no", 0),
(neg|agent_is_ally, ":dead_agent_no"),
(agent_is_human, ":dead_agent_no"),
(agent_get_troop_id, ":dead_agent_troop_id", ":dead_agent_no"),
(str_store_troop_name, s6, ":dead_agent_troop_id"),
(assign, reg0, ":dead_agent_no"),
(assign, reg1, ":killer_agent_no"),
(assign, reg2, ":is_wounded"),
(agent_get_team, reg3, ":dead_agent_no"),
#(display_message, "@{!}dead agent no : {reg0} ; killer agent no : {reg1} ; is_wounded : {reg2} ; dead agent team : {reg3} ; {s6} is added"),
(party_add_members, "p_total_enemy_casualties", ":dead_agent_troop_id", 1), #addition_to_p_total_enemy_casualties
(eq, ":is_wounded", 1),
(party_wound_members, "p_total_enemy_casualties", ":dead_agent_troop_id", 1),
(try_end),
]),
(0, 0, ti_once, [], [
(assign,"$g_battle_won",0),
(assign,"$defender_reinforcement_stage",0),
(assign,"$attacker_reinforcement_stage",0),
# (assign,"$g_presentation_battle_active", 0),
(call_script, "script_place_player_banner_near_invento ry"),
(call_script, "script_combat_music_set_situation_with_ culture"),
]),
common_music_situation_update,
common_battle_check_friendly_kills,
(1, 0, 5, [(lt,"$defender_reinforcement_stage",2),
(store_mission_timer_a,":mission_time"),
(ge,":mission_time",10),
(store_normalized_team_count,":num_defenders", 0),
(lt,":num_defenders",6),
# (assign, reg2, ":num_defenders"),
# (display_message,"@num_defenders = {reg2}")
],
[(add_reinforcements_to_entry,0,7),(val_add,"$defender_reinforcement_stage",1)]),
(1, 0, 5, [(lt,"$attacker_reinforcement_stage",2),
(store_mission_timer_a,":mission_time"),
(ge,":mission_time",10),
(store_normalized_team_count,":num_attackers", 1),
(lt,":num_attackers",6),
# (assign, reg2, ":num_attackers"),
# (display_message,"@num_attackers = {reg2}")
],
[(add_reinforcements_to_entry,3,7),(val_add,"$attacker_reinforcement_stage",1)]),
common_battle_check_victory_condition,
common_battle_victory_display,
common_battle_tab_press,
(ti_question_answered, 0, 0, [],
[(store_trigger_param_1,":answer"),
(eq,":answer",0),
(assign, "$pin_player_fallen", 0),
(try_begin),
(store_mission_timer_a, ":elapsed_time"),
(gt, ":elapsed_time", 20),
(str_store_string, s5, "str_retreat"),
(call_script, "script_simulate_retreat", 10, 20, 1),
(try_end),
(call_script, "script_count_mission_casualties_from_ag ents"),
(finish_mission,0),]),
(1, 4, ti_once, [(main_hero_fallen)],
[
(assign, "$pin_player_fallen", 1),
(str_store_string, s5, "str_retreat"),
(call_script, "script_simulate_retreat", 10, 20),
(assign, "$g_battle_result", -1),
(set_mission_result,-1),
(call_script, "script_count_mission_casualties_from_ag ents"),
(finish_mission,0)]),
#Wulf end
],
),
Teraz polecam wam skompilować ms i sprawdzić, czy nie ma błędów.
Jeśli wszystko jest ok, to przechodzimy dalej. Przechodzimy do module_party_templates.py i szukamy małego kodu "sea_raider" i pod tym wklejamy ten:
#wulf
("sea_raiders_ships","Sea Raiders",icon_ship|pf_is_ship|carries_goods(2),0,fac_outlaws,bandit_personality,[(trp_sea_raider,5,50)]),
#wulf end
Teraz dla waszej wygody przeprowadzę analizę części kodu:
"sea_raiders_ships - nazwa kodowa jednostki (w tym przypadku statków korsarzy)
Sea Raiders - nazwa oddziału wyświetlana w grze
5,50 - rozmiar oddziału (od ilu do ilu)
Teraz otwieramy module_parties.py i szukamy "bridge_14" i pod tym wklejamy ten kod:
#Wulf
("ship_raider_spawn_point_1" ,"the_ocean",pf_disabled|pf_is_static, no_menu, pt_none, fac_outlaws,0,ai_bhvr_hold,0,(-5.23,90.26),[(trp_looter,15,0)]),
#Wulf
Kod powyżej spawnuje oddziały korsarzy na statkach pomiędzy Tihr, a Wercheg na morzu. Kumaci skumają jak dodać własne spawny.
Teraz otwieramy module_scripts.py i szukamy kodu "spawn_bandits"i szukamy takiego kodu:
(try_begin),
(store_num_parties_of_template, ":num_parties", "pt_mountain_bandits"),
(lt,":num_parties",18), #was 14 at mount&blade, 18 in warband
(store_random,":spawn_point",num_mountain_bandit_spawn_points),
(val_add,":spawn_point","p_mountain_bandit_spawn_point"),
(set_spawn_radius, 25),
(spawn_around_party,":spawn_point","pt_mountain_bandits"),
(try_end),
Pod (try_end) wklejamy ten kod:
#Wulf
(try_begin),
(store_num_parties_of_template, ":num_parties", "pt_sea_raiders_ships"),
(lt,":num_parties",25),
(store_random,":spawn_point",num_mountain_bandit_spawn_points),
(val_add,":spawn_point","p_ship_raider_spawn_point_1"),
(spawn_around_party,":spawn_point","pt_sea_raiders_ships"),
(try_end),
#Wulf end
Zapisujemy, kompilujemy i cieszymy się, jeśli wszystko zrobiliśmy dobrze ;)
Będę się starał odpowiadać na wasze pytania, oraz proszę moderatora o dodanie linku do tej wiadomości w poście Kolby, aby wszyscy go zauważyli. Z góry dziękuję :D
Wszystko dobrze się kompiluje tylko te ostrzeżenia nie dają mi spokoju...
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 info_page data...
Exporting scripts...
Exporting mission_template data...
Exporting game menus data...
exporting simple triggers...
exporting triggers...
exporting dialogs...
Checking global variable usages...
WARNING: Global variable never used: battle_won
WARNING: Global variable never used: g_presentation_battle_active
Exporting postfx_params...
______________________________
Script processing has ended.
Press any key to exit. . .
Sygnalizuje to, że po bitwie morskiej nie otrzymasz lootu. Jest to błąd Ruthvena. Naprawił to bodajże Idibil.
Zamień w module_mission_templates kod ship_battle na ten:
(
"ship_battle",mtf_battle_mode,-1,
"You close in and board the enemy ships",
[(0,mtef_attackers|mtef_team_1,af_override_horse,aif_start_alarmed,4,[]),
(1,mtef_attackers|mtef_team_1,af_override_horse,aif_start_alarmed,4,[]),
(2,mtef_attackers|mtef_team_1,af_override_horse,aif_start_alarmed,4,[]),
(3,mtef_attackers|mtef_team_1,af_override_horse,aif_start_alarmed,4,[]),
(4,mtef_attackers|mtef_team_1,af_override_horse,aif_start_alarmed,4,[]),
(5,mtef_attackers|mtef_team_1,af_override_horse,aif_start_alarmed,4,[]),
(6,mtef_attackers|mtef_team_1,af_override_horse,aif_start_alarmed,4,[]),
(7,mtef_attackers|mtef_team_1,af_override_horse,aif_start_alarmed,4,[]),
(10,mtef_defenders|mtef_team_0,af_override_horse,aif_start_alarmed,4,[]),
(11,mtef_defenders|mtef_team_0,af_override_horse,aif_start_alarmed,4,[]),
(8,mtef_defenders|mtef_team_0,af_override_horse,aif_start_alarmed,4,[]),
(9,mtef_defenders|mtef_team_0,af_override_horse,aif_start_alarmed,4,[]),
(12,mtef_defenders|mtef_team_0,af_override_horse,aif_start_alarmed,4,[]),
(13,mtef_defenders|mtef_team_0,af_override_horse,aif_start_alarmed,4,[]),
(14,mtef_defenders|mtef_team_0,af_override_horse,aif_start_alarmed,4,[]),
(15,mtef_defenders|mtef_team_0,af_override_horse,aif_start_alarmed,4,[]),
],
[
(ti_on_agent_spawn, 0, 0, [],
[
(store_trigger_param_1, ":agent_no"),
(call_script, "script_agent_reassign_team", ":agent_no"),
]),
common_battle_init_banner, #sets heraldry on shields and armor
(ti_on_agent_killed_or_wounded, 0, 0, [],
[
(store_trigger_param_1, ":dead_agent_no"),
(store_trigger_param_2, ":killer_agent_no"),
(store_trigger_param_3, ":is_wounded"),
(try_begin),
(ge, ":dead_agent_no", 0),
(neg|agent_is_ally, ":dead_agent_no"),
(agent_is_human, ":dead_agent_no"),
(agent_get_troop_id, ":dead_agent_troop_id", ":dead_agent_no"),
(str_store_troop_name, s6, ":dead_agent_troop_id"),
(assign, reg0, ":dead_agent_no"),
(assign, reg1, ":killer_agent_no"),
(assign, reg2, ":is_wounded"),
(agent_get_team, reg3, ":dead_agent_no"),
#(display_message, "@{!}dead agent no : {reg0} ; killer agent no : {reg1} ; is_wounded : {reg2} ; dead agent team : {reg3} ; {s6} is added"),
(party_add_members, "p_total_enemy_casualties", ":dead_agent_troop_id", 1), #addition_to_p_total_enemy_casualties
(eq, ":is_wounded", 1),
(party_wound_members, "p_total_enemy_casualties", ":dead_agent_troop_id", 1),
(try_end),
]),
(0, 0, ti_once, [], [
(assign,"$g_battle_won",0),
(assign,"$defender_reinforcement_stage",0),
(assign,"$attacker_reinforcement_stage",0),
# (assign,"$g_presentation_battle_active", 0),
(call_script, "script_place_player_banner_near_invento ry"),
(call_script, "script_combat_music_set_situation_with_ culture"),
]),
common_music_situation_update,
common_battle_check_friendly_kills,
(1, 0, 5, [(lt,"$defender_reinforcement_stage",2),
(store_mission_timer_a,":mission_time"),
(ge,":mission_time",10),
(store_normalized_team_count,":num_defenders", 0),
(lt,":num_defenders",6),
# (assign, reg2, ":num_defenders"),
# (display_message,"@num_defenders = {reg2}")
],
[(add_reinforcements_to_entry,0,7),(val_add,"$defender_reinforcement_stage",1)]),
(1, 0, 5, [(lt,"$attacker_reinforcement_stage",2),
(store_mission_timer_a,":mission_time"),
(ge,":mission_time",10),
(store_normalized_team_count,":num_attackers", 1),
(lt,":num_attackers",6),
# (assign, reg2, ":num_attackers"),
# (display_message,"@num_attackers = {reg2}")
],
[(add_reinforcements_to_entry,3,7),(val_add,"$attacker_reinforcement_stage",1)]),
common_battle_check_victory_condition,
common_battle_victory_display,
common_battle_tab_press,
common_drowning,
(ti_question_answered, 0, 0, [],
[(store_trigger_param_1,":answer"),
(eq,":answer",0),
(assign, "$pin_player_fallen", 0),
(try_begin),
(store_mission_timer_a, ":elapsed_time"),
(gt, ":elapsed_time", 20),
(str_store_string, s5, "str_retreat"),
(call_script, "script_simulate_retreat", 10, 20, 1),
(try_end),
(call_script, "script_count_mission_casualties_from_ag ents"),
(finish_mission,0),]),
(1, 4, ti_once, [(main_hero_fallen)],
[
(assign, "$pin_player_fallen", 1),
(str_store_string, s5, "str_retreat"),
(call_script, "script_simulate_retreat", 10, 20),
(assign, "$g_battle_result", -1),
(set_mission_result,-1),
(call_script, "script_count_mission_casualties_from_ag ents"),
(finish_mission,0)]),
#Wulf end
],
),