OSP Dark Souls Reference Pack
 
 Эта тема будет содержать все сделанные автором OSP-коды, которые добавляют в Warband некоторые "отсылки" на Dark Souls. Если автор сделает больше в будущем, они тоже будут добавлены сюда. На данный момент есть:
Простая презентация с использованием наложения прогресса в качестве здоровья босса (все еще не идеальна, поскольку у нее есть ползунок и она не заполнена даже при максимальном значении). Цель состояла в том, чтобы воссоздать только визуальный эффект, а не саму систему боссов, поэтому автор назначил для этой цели только 1 конкретного воина. Если вы собираетесь создать несколько боссов, вам придется сильно изменить этот код (учитывая сдвиг презентации, когда в бою участвует более одного босса).
Этот код идет в module_mission_templates.py
boss_agent_set = (ti_on_agent_spawn, 0, 0,
   [
   (store_trigger_param_1, ":agent"),
   (agent_get_troop_id, ":troop", ":agent"),
   (eq, ":troop", "trp_npc12"), # list of your bosses
   ],
   [
   (store_trigger_param_1, ":agent"),
   (agent_set_max_hit_points, ":agent", 1000, 1), # their hp
   (assign, "$boss_agent", ":agent"), # if you have more than 1 boss, global variable is not the way to go, use agent slots
   (start_presentation, "prsnt_boss_hp_bar"),
   ])
 
boss_agent_death = (ti_on_agent_killed_or_wounded, 0, 0,
   [
   (store_trigger_param_1, ":agent"),
   (agent_get_troop_id, ":troop", ":agent"),
   (eq, ":troop", "trp_npc12"),
   ],
   [
   (set_fixed_point_multiplier, 100),  
   (tutorial_message_set_size, 20, 100),
   (tutorial_message_set_background, 1),
   (tutorial_message_set_position, 500, 400),
   (tutorial_message, "@                    H E I R   O F   F I R E   D E S T R O Y E D", 0xFFFAEA9D, 5), # spaces are needed to centrify the text
   (play_sound, "snd_quest_failed", sf_vol_15),  
   ])Этот код идет в module_presentations.py
("boss_hp_bar", prsntf_read_only, 0,[
      (ti_on_presentation_load,
      [    
      (set_fixed_point_multiplier, 100),
      (store_agent_hit_points, ":hp", "$boss_agent", 1),
      (str_store_string, s1, "@Jeremus, High Priest of Calradia"), # here you can set some fancy name for your boss
      #(str_store_agent_name, s1, "$boss_agent"), # or just take real name of the agent, if it's already fancy enough
      (create_progress_overlay, "$boss_hp_bar", 0, ":hp"),  
      (create_text_overlay, "$boss_name", s1, tf_with_outline|tf_center_justify),  
      (overlay_set_val, "$boss_hp_bar", ":hp"),
      (overlay_set_color, "$boss_name", 0xFAFAFA),
      (position_set_x, pos1, 80),
      (position_set_y, pos1, 80),      
      (overlay_set_size, "$boss_name", pos1),
      (position_set_x, pos1, 200),
      (position_set_y, pos1, 70),      
      (overlay_set_size, "$boss_hp_bar", pos1),
      (position_set_x, pos1, 50),
      (position_set_y, pos1, 10),
      (overlay_set_position, "$boss_hp_bar", pos1),
      (position_set_x, pos1, 35),
      (position_set_y, pos1, 12),
      (overlay_set_position, "$boss_name", pos1),
      (presentation_set_duration, 999999),      
      ]),
     
      (ti_on_presentation_run,
      [
      (store_agent_hit_points, ":hp", "$boss_agent", 1),
      (overlay_set_val, "$boss_hp_bar", ":hp"),
      (try_begin),
        (le, ":hp", 0),
        (presentation_set_duration, 0),
      (try_end),
      ]),    
  ]),Результат:
Этот код позволяет сделать любую стену иллюзорной. При попадании в такую стену она издает звук и исчезает, открывая проход или обнаруживая спрятанную добычу. Вы можете использовать иллюзорные стены, чтобы сделать локации более интересными для исследования. В каждой сцене используется только 1 иллюзорная стена. Если вы хотите создать целую систему иллюзорных стен, вам следует создать больше сцен и переработать скрытый код (hiding code) в ti_on_init_scene_prop.
Этот код идет в module_scene_props.py
("z_illusory_wall",sokf_moveable|sokf_missiles_not_attached,"village_wall_a","bo_village_wall_a", [ # you can put your own mesh and collision but keep the flags
(ti_on_init_scene_prop, # this will remove wall when entering scene if it has been revealed previously
    [
    (store_trigger_param_1, ":instance_no"),
    (store_current_scene, ":cur_scene"),
    (scene_slot_eq, ":cur_scene", 739, 1), # some random number instead of name to avoid declaring
    (prop_instance_is_valid, ":instance_no"),
    (scene_prop_set_visibility, ":instance_no", 0),
    (prop_instance_get_position, pos1, ":instance_no"),
    (position_move_z, pos1, -3000, 1),
    (prop_instance_set_position, ":instance_no", pos1),
    (rebuild_shadow_map),
    ]),
(ti_on_scene_prop_hit, # fading out should start at the moment of hit, but player should see it fully, so we
                       # need a delay. To avoid mission triggers we just animate wall to current position with
                       # some timer and move the rest of the hiding code to ti_on_scene_prop_animation_finished
    [
    (store_trigger_param_1, ":instance_no"),
    (set_fixed_point_multiplier, 100),
    (prop_instance_get_position, pos1, ":instance_no"),
    (copy_position, pos2, pos1),
    (prop_instance_animate_to_position, ":instance_no", pos2, 100),
    (scene_prop_fade_out, ":instance_no", 100),
    (prop_instance_enable_physics, ":instance_no", 0),
    (prop_instance_play_sound, ":instance_no", "snd_quest_failed"),  
    ]),
(ti_on_scene_prop_animation_finished,
    [
    (store_trigger_param_1, ":instance_no"),
    (prop_instance_is_valid, ":instance_no"),
    (scene_prop_set_visibility, ":instance_no", 0),
    (prop_instance_get_position, pos1, ":instance_no"),
    (position_move_z, pos1, -3000, 1),
    (prop_instance_set_position, ":instance_no", pos1),
    (rebuild_shadow_map),
    (store_current_scene, ":cur_scene"),
    (neg|scene_slot_eq, ":cur_scene", 739, 1),
    (scene_set_slot, ":cur_scene", 739, 1),  
    ]),      
]),Результат:
Этот код позволит вам превратить вашего персонажа в объект сцены, чтобы гармонировать с окружающей средой. Код для одиночного режима, но там он совершенно бесполезен - ваша коллизия по-прежнему человеческая (так что вы можете получить выстрел в голову, будучи стулом), враги все еще видят вас, вам нужно закодировать множество зависимостей, чтобы стать полноценным пропсом - предметом в сцене. Однако в многопользовательском режиме это будет работать как есть, потому что вы можете обмануть человеческий глаз с помощью одной трансформации и устроить засаду другим игрокам без дополнительного программирования. Просто замените код из одиночный игры get_player_agent_no на какой-нибудь многопользовательский эквивалент, который позволит вам получить правильный референс. А может быть, как-нибудь замаскировать звуки ходьбы.
Этот код идет в module_scene_props.py
# these are just duplicates of native props with removed collision. spr_tavern_barrel fits too, but it is spawned half underground so I excluded it
("cm_apple_basket", 0, "apple_basket", "0", []),
("cm_box_a", 0, "box_a", "0", []),
("cm_chair_trunk_b", 0, "chair_trunk_b", "0", []),
("cm_chair_trunk_c", 0, "chair_trunk_c", "0", []),
("cm_chest_b", 0, "chest_b", "0", []),
("cm_cupboard_a", 0, "cupboard_a", "0", []),
("cm_dummy_a", 0, "arena_archery_target_b", "0", []),
("cm_straw_c", 0, "straw_c", "0", []),
("cm_tavern_chair_b",0,"tavern_chair_b", "0", []),
("cm_torture_tool_c", 0, "torture_tool_c", "0", []),
("cm_tripod_cauldron_b", 0, "tripod_cauldron_b", "0", []),
("cm_water_well_a", 0, "water_well_a", "0", []),
("cm_wood_heap", 0, "wood_heap_a", "0", []),
("cm_prop_end", 0, "wood_heap_a", "0", []),Этот код идет в module_constants.py
slot_agent_is_transformed = 797
slot_agent_target_prop = 798Этот код идет в module_mission_templates.py
chameleon_1 = (0, 2, 0, # starting transformation
[
    (key_clicked, key_numpad_slash), # replace with any button you want
    (get_player_agent_no, ":player"),
    (neg|agent_slot_eq, ":player", slot_agent_is_transformed, 1),
    (agent_set_animation, ":player", "anim_cheer", 1), # this animation lasts around 4 sec so we
                                                       # put consequences delay on 2 for it to
                                                       # interrupt it on half
],
[
    (get_player_agent_no, ":player"),
    (agent_set_visibility, ":player", 0),
    (agent_set_slot, ":player", slot_agent_is_transformed, 1),
    (agent_get_position, pos1, ":player"),
    (particle_system_burst, "psys_ladder_dust_14m", pos1, 300),
    (play_sound_at_position, "snd_quest_failed", pos1),
    (set_spawn_position, pos1),
    (store_random_in_range, ":target_prop", "spr_cm_apple_basket", "spr_cm_prop_end"),
    (spawn_scene_prop, ":target_prop"),
    (agent_set_slot, ":player", slot_agent_target_prop, reg0),
])
chameleon_2 = (0, 0, 0, # this moves the prop to wherever we move
[
    (get_player_agent_no, ":player"),
    (agent_slot_eq, ":player", slot_agent_is_transformed, 1),
],
[
    (get_player_agent_no, ":player"),
    (agent_get_slot, ":instance_no", ":player", slot_agent_target_prop),
    (agent_get_position, pos1, ":player"),
    (position_rotate_z, pos1, 180),
    (prop_instance_set_position, ":instance_no", pos1),
])
chameleon_3 = (0, 0, 0, # ending transformation
[
    (get_player_agent_no, ":player"),
    (agent_slot_eq, ":player", slot_agent_is_transformed, 1),
    (this_or_next|game_key_clicked, gk_attack), # here are listed main actions which should turn you
    (this_or_next|game_key_clicked, gk_defend), # human again. gk_attack also triggers when you choose
    (this_or_next|game_key_clicked, gk_jump),   # a dialog answer. You may contribute to this list
    (game_key_clicked, gk_kick),  
],
[
    (get_player_agent_no, ":player"),
    (agent_set_slot, ":player", slot_agent_is_transformed, 0),
    (agent_get_slot, ":instance_no", ":player", slot_agent_target_prop),
    (prop_instance_get_position, pos1, ":instance_no"),
    (particle_system_burst, "psys_ladder_dust_14m", pos1, 300),
    (position_move_z, pos1, -3000, 1),
    (prop_instance_set_position, ":instance_no", pos1),
    (rebuild_shadow_map),
    (agent_set_visibility, ":player", 1),
    (agent_set_slot, ":player", slot_agent_target_prop, -1),
])Результат:
Наслаждайтесь!
Родная страница


Комментариев 2
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.